500MB 데이터베이스의 모든 테이블을 MyISAM에서 InnoDB로 변환하여 바쁜 Drupal 6 사이트의 전반적인 성능을 향상시킬 수 있는지 확인합니다. 전환을 수행하는 가장 좋은 방법 (예 : 가장 안전하고 쉬운 방법)이 궁금합니다.
500MB 데이터베이스의 모든 테이블을 MyISAM에서 InnoDB로 변환하여 바쁜 Drupal 6 사이트의 전반적인 성능을 향상시킬 수 있는지 확인합니다. 전환을 수행하는 가장 좋은 방법 (예 : 가장 안전하고 쉬운 방법)이 궁금합니다.
답변:
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 버퍼 풀을 설정하기 위해 이것을 읽으십시오 : /dba/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");
}
}
1 년 전에 저에게 도움이되었습니다. 그 이후로 drush API가 변경되었는지 확실하지 않습니다.
convert.drush.inc, 예를 들어 .drush 폴더에 배치하거나 사이트에서 어떻게 든 실행할 수 있습니다 (예 : devel execute php 블록). drush 스크립트로서 다음과 같이 호출 할 수 있습니다.
drush convert-engine InnoDB
경고 :이 명령이 실행되는 동안 누군가 데이터베이스에 무언가를하면 데이터베이스가 완전히 엉망이됩니다. 회복 불가능합니다. 따라서 사이트를 유지 관리 모드로 설정하고 백업하기 전에 백업하십시오! 물론 개발 / 테스트 사이트에서 먼저 시도해보십시오. :)