কয়েক ঘন্টা অফলাইনে না গিয়ে কীভাবে মাইআইএসএএম থেকে ইনোডিবিতে একটি 66,862,521 সারি টেবিল রূপান্তর করবেন?


18

অ্যাপ্লিকেশনটিকে অফলাইনে না নিয়েই কী সম্ভব (এবং কীভাবে) একটি বিশাল মাইআইএসএএম টেবিলটিকে ইনোডিবিতে রূপান্তর করা যায়? এটি প্রতি সেকেন্ডে কয়েক সারি সন্নিবেশ করা প্রয়োজন তবে এটি প্রায় 2 মিনিটের জন্য স্থগিত করা সম্ভব।

স্পষ্টতই ALTER TABLE ... ইঞ্জিন = ইনোডাব কাজ করবে না। এর জন্য আমার ইনডোডাব ইঞ্জিন সহ একটি নতুন টেবিল তৈরি করার এবং এতে সামগ্রীটি অনুলিপি করার পরিকল্পনা ছিল। এবং শেষে, অ্যাপ্লিকেশন লগ থ্রেড এবং পুনরায় নাম টেবিল স্থগিত করুন।

দুর্ভাগ্যক্রমে এমনকি 100 টি সারির ছোট ছোট ব্যাচে অনুলিপি করা কিছু সময়ের পরে উল্লেখযোগ্য পিছনে উত্পন্ন করে।

সম্পাদনা : বিদ্যমান সারিগুলি কখনই পরিবর্তন করা হয় না, এই টেবিলটি লগিংয়ের জন্য ব্যবহৃত হয়।



3
ঠিক আছে, সেই প্রশ্নটি কথোপকথনের সময়কে হ্রাস করার বিষয়ে। কথোপকথনটি কয়েক দিন বা কয়েক সপ্তাহ সময় নেয় কিনা সেদিকে আমার খেয়াল নেই। তবে অ্যাপ্লিকেশনটির সময় প্রয়োজন না করে এবং লক্ষণীয় ব্যবধান তৈরি না করে পটভূমিতে এটি অবশ্যই কাজ করবে।
হেনড্রিক ব্রুমারম্যান

উত্তর:


15

নিম্নলিখিত হিসাবে একটি মাস্টার-মাস্টার সেটআপ তৈরি করুন:

  • দ্বিতীয় মাস্টার, মাস্টারবি তৈরি করুন
  • মাস্টারবি দাস হিসাবে কাজ করে logTable
  • logTable_newইন্নাডব হিসাবে তৈরি করুন
  • INSERT INTO logTable_new SELECT * FROM logTableমাস্টারবিতে রান করুন (স্যুইচোকোড), যা অনুলিপিটি মাস্টারএকে প্রেরণ করে
  • logTable_newমাস্টারএ সিঙ্কিং শেষ হয়ে গেলে , টেবিলগুলি সরিয়ে আনে

10

সীমাবদ্ধতা দেওয়া:

কথোপকথনটি কয়েক দিন বা কয়েক সপ্তাহ সময় নেয় কিনা সেদিকে আমার খেয়াল নেই। তবে অ্যাপ্লিকেশনটির সময় প্রয়োজন না করে এবং লক্ষণীয় ব্যবধান তৈরি না করে অবশ্যই পটভূমিতে কাজ করতে হবে

আপনি যখন লগিং করছেন, আপনার কাছে যদি মার্কার সেট করার কিছু ভাল উপায় থাকে যাতে আপনি প্রক্রিয়াটি কী শুরু করবেন তা বলতে পারেন, তারপরে আপনি কোনও লগ পুনরায় প্রয়োগ করতে পারেন, বা লগগুলি কোনও টেক্সট ফাইলে লিখে রেখে দিতে পারেন আপনি পরে এগুলি গ্রাস করতে পারেন LOAD DATA INFILE

সমস্যার অংশটি হ'ল ছোট ব্যাচে লেখার অর্থ সূচীগুলি বারবার পুনরায় সংশোধন করতে হয়; আপনি এটি একবারে চালিয়ে যাওয়া আরও ভাল, তবে এটি সিস্টেমে কিছু 'লক্ষণীয়' পিছিয়ে পড়তে পারে .. তবে আপনাকে এটি আপনার প্রোডাকশন সার্ভারে করতে হবে না।

  1. লগিংটি বিরতি দিন বা কিছু চিহ্নিতকারী সেট করুন যাতে আপনি পরে এই বিন্দু থেকে লগগুলি পুনরায় প্রয়োগ করতে পারেন।
  2. আপনার মাইআইএসএম টেবিলটি অন্য সিস্টেমে অনুলিপি করুন
  3. অন্য সিস্টেমে, কোনও আলাদা নামের অধীনে একটি ইনোডিবি টেবিল তৈরি করুন এবং ডেটা মাইগ্রেট করুন (এটি ছুঁড়ে ফেলা এবং ব্যবহার করতে এটি আরও দ্রুত হতে পারে LOAD DATA INFILE)
  4. মূল সিস্টেমটিতে InnoDB টেবিলটি অনুলিপি করুন
  5. লগিংয়ের জন্য আরেকটি চিহ্নিতকারী সেট করুন।
  6. সর্বশেষ দুটি চিহ্নিতকারীদের মধ্যে থেকে নতুন টেবিলের সমস্ত লগগুলিকে পুনরায় আবেদন করুন।
  7. (যদি পদক্ষেপ # 6 এক মিনিট বা তার বেশি সময় নেয় তবে এই পদক্ষেপটি পুনরায় করুন মাত্র কয়েক সেকেন্ডের মতো)
  8. সারণীগুলি অদলবদল করুন (পুরানোটির নাম টেবিল_ব্যাকআপ করুন, পুরানোটির নামে নতুন একটি করুন)
  9. শেষ চিহ্নিতকারী থেকে লগগুলি ধরুন।

9

দুর্ভাগ্যক্রমে এমনকি 100 টি সারির ছোট ছোট ব্যাচে অনুলিপি করা কিছু সময়ের পরে উল্লেখযোগ্য পিছনে উত্পন্ন করে।

আপনি কি প্রতিটি ব্যাচের মধ্যে কোনও বিলম্ব যোগ করছেন, বা কেবল আপডেটগুলি বেকিং করছেন এবং প্রতিটি ব্যাচ সরাসরি আগেরটির পরে চালাচ্ছেন?

যদি তা হয় তবে এমন কিছু দিয়ে আপনার পছন্দসই ভাষায় রূপান্তরটি স্ক্রিপ্ট করার চেষ্টা করুন:

repeat
    copy oldest 100 rows that haven't been copied yet to new table
    sleep for as long as that update took
until there are <100 rows unprocessed
stop logging service
move the last few rows
rename tables
restart logging
delete the old table when you are sure the conversion has worked

এটি নিশ্চিত করা উচিত যে রূপান্তরটি আপনার সার্ভারের ক্ষমতা অর্ধেকের বেশি বা কম-বেশি গ্রহণ না করে এমনকি সিস্টেমের ব্যবহার সময়ের সাথে পরিবর্তিত হওয়ায় চাপানো বোঝার পার্থক্যের জন্যও অনুমতি দেয়।

অথবা আপনি যখন সেবা তুলনামূলকভাবে নিষ্ক্রিয় যতটা সম্ভব সময় হিসাবে ব্যবহার করতে পারে তবে পিছন (সম্ভাব্য বেশ সময় একটি দৈর্ঘ্যের জন্য pausing) যখন ডাটাবেসের চাহিদা এর ব্যবহারকারীদের জন্য কিছু কাজ করতে চান, প্রতিস্থাপন sleep for as long as the update tookসঙ্গে if the server's load is above <upper measure>, sleep for some seconds then check again, loop around the sleep/check until the load drops below <lower measure>। এর অর্থ হ'ল এটি শান্ত সময়ে এগিয়ে বাষ্প করতে পারে তবে সার্ভার যখন স্বাভাবিক ওয়ার্কলোডের ব্যস্ততায় ব্যস্ত থাকে তখন পুরোপুরি বিরতি দেয়। লোড নির্ধারণ করা আপনার ওএসের উপর নির্ভর করে - লিনাক্সের অধীনে এবং একই রকম 1 মিনিটের লোড গড় মূল্য /proc/loadavgবা এর আউটপুটটি করা uptimeউচিত। <lower measure>এবং <upper measure>একই মান হতে পারে, যদিও এটি নিয়ন্ত্রণের ক্ষেত্রে এটির মত পার্থক্য থাকার মতো স্বাভাবিক কারণ আপনার প্রক্রিয়াটি আরম্ভ না করে তাৎক্ষণিকভাবে বিরতি দেয় কারণ লোডের পরিমাপের উপর তার প্রভাব পুনরায় আরম্ভ করার কারণে এটির নিজস্ব পুনঃসূচনা হয়।

অবশ্যই এটি সেই টেবিলগুলির জন্য কাজ করবে না যেখানে পুরানো সারিগুলি সংশোধন করতে পারে তবে লগ টেবিলের জন্য আপনার বর্ণনা মতো এটি কাজ করবে।

এক্ষেত্রে নতুন টেবিলটি বসানোর পরে আপনি সূচী তৈরির সাধারণ জ্ঞানটিকে উপেক্ষা করতে চাইবেন । যখন আপনি জিনিসগুলি যত দ্রুত সম্ভব (সিস্টেমের বাকী অংশের উপর প্রভাব ফেলতে চান) প্রকৃতপক্ষে এটি আরও কার্যকর, এই ক্ষেত্রে আপনি প্রক্রিয়া শেষে লোডের বড় বিরাটতা চান না সূচিগুলি সম্পূর্ণরূপে একসাথে তৈরি হয় কারণ এটি এমন একটি প্রক্রিয়া যা যখন জিনিসগুলিতে ব্যস্ত হয় তখন আপনি থামতে পারবেন না।


4

এই কাজ ভালো কিছু কি?

  1. লগিং বিরতি দিন (যাতে $auto_incrementআপনার লগিং টেবিলটি mytable পরিবর্তন হয় না)।
  2. $auto_incrementব্যবহার করে মানটি নোট করুন SHOW TABLE STATUS LIKE 'mytable'
  3. CREATE TABLE mytable_new LIKE mytable
  4. ALTER TABLE mytable_new AUTO_INCREMENT=$auto_increment ENGINE=Innodb
  5. RENAME TABLE mytable TO mytable_old, mytable_new TO mytable
  6. আবার লগিং সক্ষম করুন। ইনোডব টেবিলটি এখন পপুলেশন শুরু করবে।
  7. INSERT INTO mytable SELECT * FROM mytable_old

আপনি ব্যাচগুলিতে বা একটি বিবৃতিতে step ধাপটি করতে পারেন যেহেতু এটি সাধারণ লগিংয়ে ব্লক করা উচিত নয়।


এটি এখনও অবরুদ্ধ থাকবে, কারণ যেভাবে ইনডোডাব অটো_সংশোধন পরিচালনা করে ,. ডিফল্টরূপে ইনোডাব একটি স্বতঃসংযোগ কলামে প্রবেশ করার সময় একটি টেবিল স্তরের লক নেয় এবং সন্নিবেশ শেষ হওয়ার সাথে সাথে লকটি প্রকাশ করে ,.
ovais.tariq
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.