ฉันจะแปลงตารางทั้งหมดของฐานข้อมูล 500MB จาก MyISAM เป็น InnoDB เพื่อดูว่าจะปรับปรุงประสิทธิภาพโดยรวมของไซต์ Drupal 6 ที่ยุ่งหรือไม่ ฉันสงสัยว่าอะไรคือวิธีที่ดีที่สุด (เช่นปลอดภัยที่สุด / ง่ายที่สุด / เร็วที่สุด) ในการทำ Conversion
ฉันจะแปลงตารางทั้งหมดของฐานข้อมูล 500MB จาก MyISAM เป็น InnoDB เพื่อดูว่าจะปรับปรุงประสิทธิภาพโดยรวมของไซต์ Drupal 6 ที่ยุ่งหรือไม่ ฉันสงสัยว่าอะไรคือวิธีที่ดีที่สุด (เช่นปลอดภัยที่สุด / ง่ายที่สุด / เร็วที่สุด) ในการทำ Conversion
คำตอบ:
ในฐานะ MySQL DBA ฉันเชื่อว่า MySQL จะทำการแปลงโดยให้ MySQL เขียนสคริปต์ให้ฉัน
รูปแบบคำสั่ง Linux เรียกใช้แบบสอบถามนี้
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: /dba/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194
โปรดอ่านสิ่งนี้ด้วย: /drupal/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-th-drupal-1715/what-would-the
ให้มันลอง !!!
ฉันได้เขียนคำสั่ง drush เมื่อไม่นานมานี้
<?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");
}
}
ทำงานให้ฉันเมื่อหนึ่งปีก่อนหรือมากกว่านั้นไม่แน่ใจว่า drush API เปลี่ยนไปตั้งแต่นั้นมา
คุณสามารถวางไว้ใน convert.drush.inc เช่นในโฟลเดอร์. rush หรือดำเนินการกับเว็บไซต์ของคุณตัวอย่างเช่นกับ devel execute php block ในฐานะสคริปต์ drush คุณสามารถเรียกสิ่งนี้ได้:
drush convert-engine InnoDB
คำเตือน : หากมีใครบางคนทำอะไรกับฐานข้อมูลในขณะที่คำสั่งเหล่านี้ทำงานฐานข้อมูลของคุณจะถูกทำให้ยุ่งเหยิงอย่างสมบูรณ์ Unrecoverably ดังนั้นให้ไซต์ของคุณเข้าสู่โหมดการบำรุงรักษาและทำการสำรองข้อมูลก่อนลอง! และแน่นอนลองใช้เว็บไซต์พัฒนา / ทดสอบก่อน :)