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


9

500MB 데이터베이스의 모든 테이블을 MyISAM에서 InnoDB로 변환하여 바쁜 Drupal 6 사이트의 전반적인 성능을 향상시킬 수 있는지 확인합니다. 전환을 수행하는 가장 좋은 방법 (예 : 가장 안전하고 쉬운 방법)이 궁금합니다.


이것은 Drupal 관련 질문이 아닌 것 같습니다.
tostinni 2016 년

2
직접적이지는 않지만 Drupal 관리자가 가끔해야 할 일입니다.
mpdonadio

FULLTEXT 인덱스가있는 MyISAM 테이블을 필터링하기 위해 새 SQL 명령을 사용하도록 답변을 업데이트했습니다. 업데이트 된 답변을 사용하여 모든 단계를 처음부터 다시 실행하십시오.
RolandoMySQLDBA

Drupal 사이트가 FULLTEXT 인덱스를 사용하여 검색하도록 구성되지 않은 경우 FULLTEXT 인덱스가있는 모든 테이블로 이동하여 해당 인덱스를 해당 테이블에서 제거 할 수 있습니다. FULLTEXT 인덱스가있는 모든 테이블을 찾으려면 SELECT table_schema, table FROM information_schema.statistics를 실행하십시오. WHERE index_type = 'FULLTEXT';
RolandoMySQLDBA 2016 년

답변:


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

스크립트는 가장 작은 테이블을 먼저 변환합니다. 이 스크립트는 또한 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

시도 해봐 !!!


롤랜드, 귀하의 솔루션을 시도했지만 ConvertMyISAM2InnoDB.sql을 데이터베이스로 가져온 후 다음 오류가 발생합니다. 변환이 일부 테이블에서 발생했는지 여부와이 오류를 어떻게 해결해야하는지 알아야합니까? 감사합니다
alfish

나는 일어날 까봐 두려웠다. 그것은 단지 하나의 MyISAM 테이블에 FULLTEXT 인덱스가 있음을 의미합니다. mysql에 로그인하여 타이밍을보고 싶은 것처럼 실행하십시오. 즉, source /root/ConvertMyISAM2InnoDB.sql
RolandoMySQLDBA를

FULLTEXT 인덱스가있는 테이블을 건너 뛰도록 SQL 생성 스크립트를 업데이트하려고합니다.
RolandoMySQLDBA 2016 년

그 동안이 모든 단계를 처음부터 반복하십시오. 재생성 된 파일의 첫 번째 줄에는 FULLTEXT 인덱스가있는 MyISAM 파일이 있습니다. 첫 번째 줄을 삭제하고 스크립트를 다시 실행하십시오.
RolandoMySQLDBA 2016 년

글쎄,이 멋진 변환 bash 스크립트 ( 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");
  }
}

1 년 전에 저에게 도움이되었습니다. 그 이후로 drush API가 변경되었는지 확실하지 않습니다.

convert.drush.inc, 예를 들어 .drush 폴더에 배치하거나 사이트에서 어떻게 든 실행할 수 있습니다 (예 : devel execute php 블록). drush 스크립트로서 다음과 같이 호출 할 수 있습니다.

drush convert-engine InnoDB

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


5
Berdir에 동의하고 사이트를 백업하십시오. 이 작업이 진행되는 동안 데이터베이스가 잠 깁니다. 이를 수행 할 수있는 모듈을 원한다면 DB Tuner 에 샷을 제공하십시오.
mikeytown2

@ mikeytown2 : 정말 멋진 모듈입니다 :)
Berdir

1
좋은 스크립트이지만 MySQL 클라이언트를 직접 사용하는 것보다 과도하게 보입니다.
tostinni 2016 년

2
스크립트는 정확히 5 줄의 코드입니다. 나머지는 drush와 통합하는 것입니다. MySQL의 단일 sql 명령에서이를 수행하는 방법이 있습니다. 어떤 방법 으로든 스크립트를 작성 해야 합니다.
Berdir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.