我将把500MB数据库的所有表从MyISAM转换为InnoDB,以查看它是否将改善繁忙的Drupal 6站点的整体性能。我想知道什么是最好的(即最安全/最容易/最快)的转换方式。
我将把500MB数据库的所有表从MyISAM转换为InnoDB,以查看它是否将改善繁忙的Drupal 6站点的整体性能。我想知道什么是最好的(即最安全/最容易/最快)的转换方式。
Answers:
作为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
该脚本将首先转换最小的表。该脚本还绕过了具有FULLTEXT索引的任何MyISAM表。
查看脚本后,您可以按照以下步骤在MySQL中运行它:
mysql -h... -u... -p... -A < /root/ConvertMyISAM2InnoDB.sql
或者,如果您想查看每次转换的时间,请登录mysql并运行以下命令:
mysql> source /root/ConvertMyISAM2InnoDB.sql
这应该不会弄乱,因为执行转换时会发生全表锁定。
转换完所有表后,您需要针对InnoDB使用情况调整MySQL设置,并缩小key_buffer。
请阅读以下内容以设置InnoDB缓冲池:https : //dba.stackexchange.com/questions/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194
请仔细阅读本:/drupal/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367
试试看 !!!
前一段时间,我为此写了一个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中,例如.drush文件夹中,或以某种方式在您的网站上执行,例如使用devel execute php块。作为草稿脚本,您可以这样调用它:
drush convert-engine InnoDB
警告:如果在执行这些命令时有人对数据库执行某些操作,则数据库将完全混乱。无法恢复。因此,在尝试此操作之前,请将您的网站置于维护模式并进行备份!当然,请先在开发/测试网站上尝试:)