Bagaimana cara mengonversi database dari MyISAM ke InnoDB?


9

Saya akan mengonversi semua tabel database 500MB dari MyISAM ke InnoDB untuk melihat apakah itu akan meningkatkan kinerja keseluruhan dari situs Drupal 6 yang sibuk. Saya bertanya-tanya apa cara terbaik (yaitu teraman / termudah / tercepat) untuk melakukan konversi.


Ini sepertinya bukan pertanyaan yang berhubungan dengan Drupal, bukan?
tostinni

2
Tidak secara langsung, tetapi itu adalah sesuatu yang perlu dilakukan oleh admin Drupal.
mpdonadio

Saya memperbarui jawaban saya untuk menggunakan perintah SQL baru untuk memfilter tabel MyISAM yang memiliki indeks FULLTEXT. Harap jalankan kembali semua langkah dari awal menggunakan jawaban saya yang diperbarui.
RolandoMySQLDBA

Jika situs Drupal Anda tidak dikonfigurasikan untuk mencari menggunakan indeks FULLTEXT, Anda mungkin ingin membuka semua tabel dengan indeks FULLTEXT dan membuang indeks tersebut dari tabel tersebut. Untuk menemukan semua tabel yang memiliki indeks FULLTEXT, jalankan SELECT table_schema, tabel FROM information_schema.statistics WHERE index_type = 'FULLTEXT';
RolandoMySQLDBA

Jawaban:


7

Sebagai DBA MySQL, saya percaya MySQL untuk melakukan konversi dengan meminta MySQL menulis skrip untuk saya.

Dari perintah Linux jalankan query ini

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

Script akan mengonversi tabel terkecil terlebih dahulu. Script ini juga mem-bypass tabel MyISAM yang memiliki indeks FULLTEXT.

Setelah melihat skrip, Anda dapat menjalankannya di MySQL sebagai berikut:

mysql -h... -u... -p... -A < /root/ConvertMyISAM2InnoDB.sql

atau jika Anda ingin melihat waktu setiap konversi, masuk ke mysql dan jalankan ini:

mysql> source /root/ConvertMyISAM2InnoDB.sql

Ini seharusnya tidak menjadi kacau karena kunci tabel penuh terjadi ketika konversi sedang dijalankan.

Setelah semua tabel dikonversi, Anda perlu menyesuaikan pengaturan MySQL untuk penggunaan InnoDB dan menurunkan key_buffer.

Silakan baca ini untuk mengatur Pool Buffer InnoDB: /dba/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194

Silakan baca ini juga: /drupal/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

Cobalah !!!


Roland, saya mencoba solusi Anda tetapi setelah mengimpor ConvertMyISAM2InnoDB.sql ke database, saya mendapatkan kesalahan ini: "KESALAHAN 1214 (HY000) di baris 585: Jenis tabel yang digunakan tidak mendukung indeks FULLTEXT". Jadi, haruskah saya tahu apakah konversi terjadi pada beberapa tabel dan bagaimana saya harus mengatasi kesalahan ini? Terima kasih
alfish

Saya takut itu akan terjadi. Ini hanya berarti bahwa satu tabel MyISAM memiliki indeks FULLTEXT. Login ke mysql dan jalankan jika seolah-olah Anda ingin melihat waktunya. Dengan kata lain, jalankan source /root/ConvertMyISAM2InnoDB.sql
RolandoMySQLDBA

Saya akan mencoba memperbarui skrip generasi SQL untuk melewati tabel yang memiliki indeks FULLTEXT.
RolandoMySQLDBA

Sementara itu, ulangi semua langkah ini dari awal. Baris pertama dari file yang diregenerasi memiliki file MyISAM dengan indeks FULLTEXT. Hapus saja baris pertama itu dan jalankan kembali skripnya.
RolandoMySQLDBA

Nah, dengan menjalankan skrip bash konversi keren ini ( yoodey.com/... ), saya menemukan bahwa satu-satunya tabel di database saya yang menggunakan Teks Lengkap adalah 'search_index'. Ini menyebabkan konversi terhenti tetapi setelah membatalkan konversi, sisanya berjalan dengan lancar. Dengan menjalankan sumber ConvertMyISAM2InnoDB.sql saya tidak bisa menentukan penyebabnya. Pokoknya saya menghargai bantuan Anda.
alfish

4

Saya sudah menulis perintah drush untuk ini beberapa waktu yang lalu.

<?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");
  }
}

Bekerja untuk saya setahun yang lalu atau lebih, tidak yakin apakah API drush berubah sejak saat itu.

Anda dapat menempatkannya di convert.drush.inc misalnya di folder .drush atau menjalankannya di situs Anda, misalnya dengan devel mengeksekusi blok php. Sebagai skrip drush, Anda dapat menyebutnya seperti ini:

drush convert-engine InnoDB

Peringatan : Jika seseorang melakukan sesuatu dengan database saat perintah ini berjalan, database Anda akan berantakan sepenuhnya. Tidak dapat dipulihkan. Jadi, letakkan situs Anda dalam mode pemeliharaan dan buat cadangan sebelum mencoba ini! Dan tentu saja, coba dulu situs pengembangan / pengujian :)


5
Setuju dengan Berdir, buat cadangan situs Anda. Saat operasi ini berlangsung, basis data Anda akan TERKUNCI. Jika Anda menginginkan modul yang dapat melakukannya, coba DB Tuner .
mikeytown2

@ mikeytown2: Itu modul yang cukup keren :)
Berdir

1
Skrip yang bagus tetapi tampaknya cukup sulit dibandingkan melakukan ini secara langsung un klien MySQL.
tostinni

2
Scriptnya persis 5 baris kode. Sisanya adalah mengintegrasikannya dengan drush. Ada cara untuk melakukan ini dalam satu perintah sql di MySQL. Dengan satu atau lain cara, Anda harus menulis naskah.
Berdir
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.