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.