মাইআইএসএএম থেকে ইনোডিবিতে রূপান্তরের পরে সারিগুলি অনুপস্থিত


16

আমাদের কাছে যুক্তিসঙ্গতভাবে একটি ছোট ডাটাবেস রয়েছে যা আমরা মাইআইএসএএম থেকে ইনোডিবিতে রূপান্তর করতে চেয়েছিলাম। ডাটাবেস নুবস হওয়ার কারণে, আমরা এমনকি সাইটটিকে নীচে না নামিয়ে (পরিবর্তিত টেবিল ব্যবহার করে) রূপান্তর করেছি।

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


কোন টেবিলগুলি সারি অনুপস্থিত? আপনি রূপান্তরিত বা অন্য টেবিল?
দীর্ঘায়ু

উত্তর:


20

স্টোরেজ ইঞ্জিনগুলি পরিবর্তন করতে একটি ALTER সম্পাদন করা সারিগুলি অদৃশ্য করে না। তবে আপনি আমাকে কিছু পরামর্শ দেওয়ার জন্য বলুন যেহেতু আপনি বলেছিলেন যে আপনি আপনার প্রশ্নে 'ডাটাবেস নুব'।

বিদ্যমান স্কিমা সংশোধন করার সময় বা ডেটাগুলিকে প্রভাবিত করতে পারে এমন কোনও কিছু করার সময়, এখানে কিছু প্রাথমিক পরামর্শ দেওয়া হয়েছে:

  1. প্রথমে একটি ব্যাকআপ নিন।
  2. একটি পরিবর্তন পরিকল্পনা আছে।
  3. আপনার পরিকল্পনাটি অফলাইন হোস্টে পরীক্ষা করুন।
  4. ডেটা আগে এবং পরে তুলনা করার জন্য একটি পরীক্ষা পরিকল্পনা আছে।
  5. সময়সূচী করুন এবং একটি ডাউনটাইম নিন।
  6. আপনার ডাউনটাইম কার্যকর হওয়ার সাথে সাথেই একটি ব্যাকআপ নিন এবং স্ন্যাপশট নিন এবং আপনি ট্র্যাফিক বন্ধ হয়ে গেছে তা যাচাই করে নিন।
  7. আপনি যদি মাইসাম চালাচ্ছেন, আপনারা কী কী বদলানোর আগে তা মূল্যায়ন করতে 'চেক টেবিল' ব্যবহার করুন।
  8. আপনার ব্যাকআপ ছাড়াও স্থানীয়ভাবে টেবিলটি অনুলিপি করুন just
  9. সাবধানতার সাথে এগিয়ে চলুন, "- সতর্কতা দেখান" এবং অন্যান্য আউটপুট সক্ষম করুন যাতে আপনার পরিবর্তনগুলি করার সাথে সাথে আপনার সম্পূর্ণ চিত্র থাকে।
  10. যদি ডেটা আপনার কাছে গুরুত্বপূর্ণ হয় তবে একটি ডিবিএ ভাড়া করুন, এমনকি মাইগ্রেশন চলাকালীন পরামর্শ নেওয়া উচিত যাতে আপনার পাশেই একটি অভিজ্ঞ।

আমি আরও অনেক কিছুতে প্রবেশ করতে পারি, তবে উপরেরগুলি যখন কিছু ভুল হয়ে যায় তখন আপনাকে বিকল্পগুলি সরবরাহ করে।

আপনার অনুপস্থিত ডেটা / সারি হিসাবে, "তুলনা করার জন্য" স্ন্যাপশটের আগে / পরে ডাব্লু / ওএ "জানার কোনও উপায় নেই। আপনি আপনার সর্বশেষতম ব্যাকআপের তুলনায় কমপক্ষে এটি যাচাই করতে পারেন।


আমি এই পড়া। ভাল ডিআর পরিকল্পনা। আপনার উত্তরটি এগিয়ে যাওয়া পরিকল্পনার চেয়ে আমার চেয়ে প্রশ্নের চেয়ে আরও সংবেদনশীল হওয়ার জন্য +1 পায়।
রোল্যান্ডোমাইএসকিউএলডিবিএ

1
@ র্যান্ডি আপনার ভাল উত্তরের কারণে এটি প্রিয় প্রশ্ন হিসাবে চিহ্নিত করেছেন
টেক এক্সপ্লোরার

8

মাইআইএসএএম রূপান্তর করার সর্বোত্তম উপায়গুলির মধ্যে একটি সম্পূর্ণ ডাউনটাইম ছাড়াই একটি মাত্র পূর্বশর্ত রয়েছে: একটি প্রতিলিপি স্লেভ ব্যবহার করুন।

পরিকল্পনার জন্য এখানে একটি পাখির চোখের দর্শন

  1. প্রতিলিপি মাস্টার / স্লেভ সেটআপ তৈরি করুন
  2. দাসের প্রতিটি মাইআইএসএএম টেবিলকে ইনোডিবিতে রূপান্তর করুন
  3. আপনার অ্যাপ্লিকেশন স্লেভের দিকে নির্দেশ করুন

সহজ লাগছে? এর পিছনে প্রচুর বিবরণ রয়েছে।

প্রতিলিপি মাস্টার / স্লেভ সেটআপ তৈরি করুন

মাস্টারকে খুব ঝামেলা ছাড়াই স্লেভ তৈরির একটি চটজলদি উপায় রয়েছে। আমি দুটি পোস্ট লিখেছি:

আরএসসিএনসি কীভাবে ব্যবহার করবেন সে সম্পর্কে বিস্তারিত তথ্যের চেয়ে দয়া করে এই দুটি পোস্ট পড়ুন।

দাসের প্রতিটি মাইআইএসএএম টেবিলকে ইনোডিবিতে রূপান্তর করুন

ডিবি স্লেভ-এ আপনি নিম্নলিখিত এসকিউএল স্টেটমেন্টটি করতে পারেন:

মাইএসকিউএল 5.5 এর জন্য:

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema');

মাইএসকিউএল 5.5 এর পূর্বে মাইএসকিউএলের জন্য সংস্করণ

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql');

ক্যোয়ারী থেকে আউটপুট ব্যবহার করে, আপনার কাছে ক্রীতদাসের জন্য একটি রূপান্তর স্ক্রিপ্ট রয়েছে।

আপনাকে অবশ্যই এই দুটি লাইন স্ক্রিপ্টের শীর্ষে রাখতে হবে:

SET SQL_LOG_BIN = 0;
STOP SLAVE;

স্ক্রিপ্টটি প্রথমে বাইনারি লগিং অক্ষম করবে (যদি আপনি স্লেভকে বাইনারি লগ রাখার জন্য কনফিগার করেন), প্রতিলিপি বন্ধ করুন এবং প্রতিটি মাইআইএসএএম টেবিলকে ইনোডিবিতে রূপান্তর করুন।

কীভাবে স্ক্রিপ্টটি তৈরি করবেন এবং এটি কার্যকর করবেন:

SQLSTMT="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema')"
INNODB_CONV_SCRIPT=MassConvertMyISAMTablesToInnoDB.sql
echo "SET SQL_LOG_BIN = 0;" > ${INNODB_CONV_SCRIPT}
echo "STOP SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Master) -u... -p... --skip-column-names -A -e"${SQL}" >> ${INNODB_CONV_SCRIPT}
echo "START SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Slave) -u... -p... --skip-column-names -A < ${INNODB_CONV_SCRIPT}

আপনার অ্যাপ্লিকেশন স্লেভের দিকে নির্দেশ করুন

স্লেভ থেকে নির্বাচন করুন অনুসন্ধান করুন। আপনি যদি স্লেভের ডেটা সামগ্রীতে সন্তুষ্ট হন তবে আপনার অ্যাপ্লিকেশনটিকে দাসের কাছে নিচে নির্দ্বিধায় বলতে হবে:

  1. স্লেভ-এ, চালান SHOW SLAVE STATUS\Gএবং সেকেন্ডস_বিহাইন্ড_মাস্টার 0 হয় তা নিশ্চিত করুন
  2. স্লেভ-এ, মাইসক্লড্প্প -h (স্লেভের আইপি) -আপনি ... -পি ... --সেনেল-লেনদেন - রুটিনস - ট্রিগারস - সমস্ত-ডাটাবেসগুলি> মাইএসকিউএলব্যাকআপ.এসকিএল (আরে, একটি ব্যাকআপ ভাল ডান হবে) এখনকার সম্পর্কে)
  3. মাস্টারটিতে, চালান service mysql stop(ডাউনটাইম শুরু হয়)
  4. পদক্ষেপ 1 পুনরাবৃত্তি করুন
  5. আপনার অ্যাপটিকে স্লেভের দিকে নির্দেশ করুন (অ্যাপটির প্রথম সংযোগের ডাউনটাইম শেষ হবে)

আপনি যদি এই বিন্দুটি থেকে সরানো না হন, অভিনন্দন !!!

অ্যাডেড বোনাস : আপনি যদি মাস্টার / স্লেভের পরিবর্তে মাস্টার / মাস্টার রেপ্লিকেশন (ওরফে সার্কুলার রেপ্লিকেশন) সেটআপ করেন তবে আপনি এটি পরিবর্তে এটি করতে পারেন:

  1. স্লেভ-এ, চালান SHOW SLAVE STATUS\Gএবং সেকেন্ডস_বিহাইন্ড_মাস্টার 0 হয় তা নিশ্চিত করুন
  2. স্লেভ-এ, মাইসক্লড্প্প -h (স্লেভের আইপি) -আপনি ... -পি ... --সেনেল-লেনদেন - রুটিনস - ট্রিগারস - সমস্ত-ডাটাবেসগুলি> মাইএসকিউএলব্যাকআপ.এসকিএল (আরে, একটি ব্যাকআপ ভাল ডান হবে) এখনকার সম্পর্কে)
  3. আপনার অ্যাপটিকে স্লেভের দিকে নির্দেশ করুন (ডাউনটাইম শুরু হয় এবং অ্যাপ্লিকেশানের প্রথম সংযোগে শেষ হয়)
  4. নতুন মাস্টারের উপর, চালান STOP SLAVE;
  5. নতুন মাস্টারের উপর, চালান CHANGE MASTER TO MASTER_HOST='';

আপনার এখন যা আছে তা বিপরীতে মাস্টার / স্লেভ। নতুন মাস্টারের ইনোডিবি ডেটা রয়েছে এবং পুরাতন মাস্টার এখন মাইআইএসএএম ডেটা সহ একটি দাস। যদি আপনি পড়তে এবং লেখাকে বিভক্ত করেন তবে স্ল্যাভ থেকে পাঠাগুলি যেতে পারে (মাইআইএসএএম থেকে ইনোডিবি থেকে দ্রুত হয়) এবং মাস্টারকে লেখেন (ইনোডিবি-র জন্য ট্রানজিকাল সমর্থন)। হান্না মন্টানা যেমন গায়, তেমনি আপনি উভয় দুনিয়ার সেরাও পেয়েছেন (হ্যাঁ, আমার দুটি কন্যা রয়েছে যা শো পছন্দ করে) !!!

অন্য অ্যাডেড বোনাস : যেহেতু মাস্টার এখন ইনোডিবি, আপনি মাস্টার থেকে ডাউনটাইম ছাড়াই এবং লেনদেনে হস্তক্ষেপ না করে মাইএসকিএলডম্প করতে পারেন। কেবল অপূর্ণতা হ'ল সিপিইউ এবং ডিস্ক আই / ও বৃদ্ধি করা। আপনি কেবলমাত্র মাস্টার (ইনোডিবি) এবং কেবলমাত্র স্লেভের উপর ডেটাগুলির একটি মাইসক্ল্ড্প্পের জন্য টেবিলের কাঠামোগুলির একটি মাইসক্ল্ড্প্প করতে পারেন (যেমন ডাম্পের ইনোডিবি বা মাইআইএসএএম-তে কোনও রেফারেন্স থাকবে না। এটি কেবল তথ্য হবে) এবং এর একটি মাইএসকিल्ड্প মাইআইএসএএম লেআউটটি রাখার জন্য স্লেভের টেবিল কাঠামো

এই নতুন সেটআপের কারণে সম্ভাবনাগুলি এগিয়ে যেতে পারে ...

আপডেট ২০১১-০৮-২7 19:50 ইডিটি

আমার ক্ষমা। আমি পুরোপুরি প্রশ্নটি পড়িনি। আপনি ইতিমধ্যে রূপান্তর সম্পাদন করেছেন

আপনার যদি ইতিমধ্যে বাইনারি লগিং চালু থাকে এবং আপনার আগে ব্যাকআপ থাকে তবে আপনি তা করতে পারেন

  • / var / lib / mysql2 হিসাবে অন্য জায়গায় পুনরুদ্ধার করুন /
  • চালান service mysql stop
  • চালান service mysql start --datadir=/var/lib/mysql2
  • mysqldump সেই ব্যাকআপ থেকে /root/olddata.sql এ ডাটাবেস
  • /root/changes.sql এ শেষ ব্যাকআপ থেকে পয়েন্ট-ইন-টাইম থেকে / var / lib / mysql (/ var / lib / mysql2) তে সমস্ত বাইনারি লগের বিরুদ্ধে mysqlbinlog চালান
  • MySQL- এ পরিবর্তনগুলি লোড করুন (যেহেতু এটি এখনও / var / lib / mysql2 এ নির্দেশ করছে)

এটি রেকর্ডকৃত যাবতীয় জিনিসটি ধরা উচিত এবং রূপান্তরটি কিক্স করা উচিত Again আবার, শেষ ব্যাকআপের আগে বাইনারি লগইন করা আপনার পক্ষে ইতিমধ্যে এটি সমস্তই উপযুক্ত । অন্যথায়, আমার সমবেদনা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.