it-swarm.asia

كيف أقوم بتحويل قاعدة بيانات من MyISAM إلى InnoDB؟

سأقوم بتحويل جميع جداول قاعدة بيانات 500 ميجا بايت من MyISAM إلى InnoDB لمعرفة ما إذا كان سيحسن الأداء العام لموقع مزدحم Drupal 6. أتساءل ما هو الأفضل (أي الأكثر أمانًا/أسهل/أسرع) طريقة لإجراء التحويل.

9
alfish

بصفتي MySQL DBA ، أنا أثق في MySQL لإجراء التحويل من خلال طلب MySQL كتابة النص البرمجي لي.

من أمر لينكس قم بتشغيل هذا الاستعلام

mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',db,'.',tb,' ENGINE=InnoDB;') FROM (SELECT A.db,A.tb,A.tbsize FROM (SELECT table_schema db,table_name tb,(data_length+index_length) tbsize FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) A LEFT JOIN (SELECT table_schema db,table_name tb FROM information_schema.statistics WHERE index_type='FULLTEXT') B USING (db,tb) WHERE B.db IS NULL) AA ORDER BY tbsize" > /root/ConvertMyISAM2InnoDB.sql

سيقوم البرنامج النصي بتحويل الجداول الأصغر أولاً. تجاوز هذا البرنامج النصي أيضًا أي جداول MyISAM تحتوي على فهارس FULLTEXT.

بعد الاطلاع على النص البرمجي ، يمكنك ببساطة تشغيله في MySQL على النحو التالي:

mysql -h... -u... -p... -A < /root/ConvertMyISAM2InnoDB.sql

أو إذا كنت تريد أن ترى توقيت كل تحويل ، قم بتسجيل الدخول إلى mysql وقم بتشغيل هذا:

mysql> source /root/ConvertMyISAM2InnoDB.sql

هذا لا ينبغي أن يخطئ لأن قفل الجدول الكامل يحدث عندما يتم تنفيذ التحويل.

بمجرد تحويل جميع الجداول ، تحتاج إلى ضبط إعدادات MySQL لاستخدام InnoDB وتقليص key_buffer.

يرجى قراءة هذا لتعيين InnoDB Buffer Pool: https://dba.stackexchange.com/questions/1/what-are-the-main-differences-b Between-innodb-and-myisam/2194#2194

يرجى قراءة هذا أيضًا: https://drupal.stackexchange.com/questions/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

جربها !!!

7
RolandoMySQLDBA

لقد كتبت أمرًا صعبًا لهذا منذ فترة.

<?php
/**
 * Implements hook_drush_command().
 */
function convert_drush_command() {
  $items = array();

  // the key in the $items array is the name of the command.
  $items['convert-engine'] = array(
    // a short description of your command
    'description' => "Convert MYSQL Table Type",
  );
  return $items;
}

function drush_convert_engine() {
  $args = func_get_args();
  $engine = $args[0];

  $result = db_query("SHOW TABLES");
  while ($row = db_fetch_array($result)) {
    $table = array_shift($row);
    drush_log(dt('Converting @table to @engine', array('@table' => $table, '@engine' => $engine)), 'success');
    db_query("ALTER TABLE $table ENGINE = $engine");
  }
}

عملت معي منذ عام أو نحو ذلك ، ولست متأكدًا مما إذا كانت واجهة برمجة التطبيقات المتغيرة تغيرت منذ ذلك الحين.

يمكنك وضع ذلك في convert.drush.inc على سبيل المثال في مجلد .drush أو تنفيذه بطريقة ما على موقعك ، على سبيل المثال مع devel تنفيذ كتلة php. كنص مكتوب ، يمكنك تسميته على النحو التالي:

drush convert-engine InnoDB

تحذير: إذا قام شخص ما بشيء ما باستخدام قاعدة البيانات أثناء تشغيل هذه الأوامر ، فسيتم إفساد قاعدة البيانات تمامًا. بشكل غير قابل للاسترداد. لذا ، ضع موقعك في وضع الصيانة وقم بعمل نسخة احتياطية قبل تجربة ذلك! وبالطبع ، جرب أولاً على موقع تطوير/اختبار :)

4
Berdir
#!/bin/sh
DBNAME="your-database"
DBUSER="your-username"
DBPWD="your-password"
for t in $(mysql -u$DBUSER -p$DBPWD --batch --column-names=false -e "show tables" $DBNAME);
do
echo "Converting table $t"
mysql -u$DBUSER -p$DBPWD -e "alter table $t engine=InnoDB" $DBNAME;
done

المصدر

2
alfish