ฉันจะแปลงฐานข้อมูลจาก MyISAM เป็น InnoDB ได้อย่างไร


9

ฉันจะแปลงตารางทั้งหมดของฐานข้อมูล 500MB จาก MyISAM เป็น InnoDB เพื่อดูว่าจะปรับปรุงประสิทธิภาพโดยรวมของไซต์ Drupal 6 ที่ยุ่งหรือไม่ ฉันสงสัยว่าอะไรคือวิธีที่ดีที่สุด (เช่นปลอดภัยที่สุด / ง่ายที่สุด / เร็วที่สุด) ในการทำ Conversion


ดูเหมือนจะไม่เป็นคำถามที่เกี่ยวข้องกับ Drupal ใช่ไหม
tostinni

2
ไม่ใช่โดยตรง แต่เป็นสิ่งที่ผู้ดูแลระบบของ Drupal ต้องทำในบางโอกาส
mpdonadio

ฉันอัพเดตคำตอบของฉันเพื่อใช้คำสั่ง SQL ใหม่เพื่อกรองตาราง MyISAM ที่มีดัชนี FULLTEXT โปรดรันใหม่ทุกขั้นตอนตั้งแต่เริ่มต้นโดยใช้คำตอบที่อัปเดต
RolandoMySQLDBA

หากไซต์ Drupal ของคุณไม่ได้รับการกำหนดค่าให้ค้นหาโดยใช้ดัชนี FULLTEXT คุณอาจต้องการไปที่ตารางทั้งหมดที่มีดัชนี FULLTEXT และปล่อยดัชนีเหล่านั้นออกจากตารางเหล่านั้น หากต้องการค้นหาตารางทั้งหมดที่มีดัชนี FULLTEXT ให้เรียกใช้ SELECT table_schema, ตารางจาก data_schema.statistics WHERE index_type = 'FULLTEXT';
RolandoMySQLDBA

คำตอบ:


7

ในฐานะ 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

ให้มันลอง !!!


Roland ฉันลองวิธีแก้ปัญหาของคุณ แต่หลังจากนำเข้า ConvertMyISAM2InnoDB.sql ไปยังฐานข้อมูลฉันได้รับข้อผิดพลาดนี้: "ข้อผิดพลาด 1214 (HY000) ที่บรรทัด 585: ประเภทตารางที่ใช้ไม่รองรับดัชนี FULLTEXT" ดังนั้นฉันควรรู้ว่าการแปลงที่เกิดขึ้นในบางตารางและฉันจะแก้ไขข้อผิดพลาดนี้ได้อย่างไร? ขอบคุณ
alfish

ฉันกลัวว่าจะเกิดขึ้น มันหมายความว่าตาราง MyISAM หนึ่งตารางมีดัชนี FULLTEXT เข้าสู่ระบบ mysql และเรียกใช้ถ้าคุณต้องการดูเวลา ในคำอื่น ๆ เรียกใช้แหล่งที่มา / root / ConvertMyISAM2InnoDB.sql
RolandoMySQLDBA

ฉันจะลองอัปเดตสคริปต์การสร้าง SQL เพื่อข้ามตารางที่มีดัชนี FULLTEXT
RolandoMySQLDBA

ในระหว่างนี้ให้ทำซ้ำขั้นตอนเหล่านี้ทั้งหมดตั้งแต่เริ่มต้น บรรทัดแรกของไฟล์ที่รีจิสเตอร์มีไฟล์ MyISAM พร้อมกับดัชนี FULLTEXT เพียงแค่ลบบรรทัดแรกนั้นแล้วรันสคริปต์อีกครั้ง
RolandoMySQLDBA

ด้วยการใช้สคริปต์ทุบตี Conversion อันยอดเยี่ยมนี้ ( yoodey.com/… ) ฉันพบว่าตารางเดียวเท่านั้นในฐานข้อมูลของฉันที่ใช้ข้อความแบบเต็มคือ 'search_index' สิ่งนี้ทำให้การแปลงหยุดชะงัก แต่หลังจากยกเลิกการแปลงในส่วนที่เหลือก็ดำเนินต่อไปอย่างราบรื่น ด้วยการรันซอร์ส ConvertMyISAM2InnoDB.sql ฉันไม่สามารถระบุผู้ร้ายได้ อย่างไรก็ตามฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ
alfish

4

ฉันได้เขียนคำสั่ง 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 ดังนั้นให้ไซต์ของคุณเข้าสู่โหมดการบำรุงรักษาและทำการสำรองข้อมูลก่อนลอง! และแน่นอนลองใช้เว็บไซต์พัฒนา / ทดสอบก่อน :)


5
เห็นด้วยกับ Berdir สำรองเว็บไซต์ของคุณ ในขณะที่การดำเนินการนี้เกิดขึ้นฐานข้อมูลของคุณจะถูกล็อค หากคุณต้องการโมดูลที่สามารถทำได้ให้DB Tunerยิง
mikeytown2

@ mikeytown2: นั่นเป็นโมดูลเย็นสวย :)
Berdir

1
สคริปต์ที่ดี แต่ดูเหมือนว่าจะค่อนข้างเกินความจริงกับการทำเช่นนี้กับไคลเอ็นต์ MySQL โดยตรง
tostinni

2
สคริปต์นั้นมีโค้ด 5 บรรทัด ส่วนที่เหลือคือการรวมเข้ากับ drush มีวิธีการทำเช่นนี้ในคำสั่ง sql เดียวใน MySQL ไม่ทางใดก็ทางหนึ่งคุณต้องเขียนสคริปต์
Berdir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.