it-swarm-ko.tech

MyISAM에서 InnoDB로 데이터베이스를 어떻게 변환합니까?

500MB 데이터베이스의 모든 테이블을 MyISAM에서 InnoDB로 변환하여 사용중인 Drupal 6 사이트의 전반적인 성능을 향상 시킬지 여부를 확인합니다. 변환하는 가장 쉬운 방법입니다.

9
alfish

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

이것을 읽어보십시오 : https://drupal.stackexchange.com/questions/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

시도 해봐 !!!

7
RolandoMySQLDBA

나는 얼마 전에 이것에 대한 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

Warning :이 명령이 실행되는 동안 누군가 데이터베이스와 관련이 있으면 데이터베이스가 완전히 엉망이됩니다. 회복 불가능합니다. 따라서 사이트를 유지 관리 모드로 설정하고 백업하기 전에 백업하십시오! 물론 개발/테스트 사이트에서 먼저 시도해보십시오. :)

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