Salah satu cara terbaik untuk mengonversi MyISAM ke InnoDB tanpa banyak waktu henti hanya memiliki satu prasyarat: Gunakan Replication Slave.
Berikut ini adalah pandangan sekilas dari rencana tersebut
- Buat Replication Master / Slave Setup
- Konversikan setiap tabel MyISAM pada slave ke InnoDB
- Arahkan aplikasi Anda ke Budak
Kedengarannya sederhana? Ada banyak detail di balik ini.
Buat Replication Master / Slave Setup
Ada cara yang cerdik untuk membuat Budak tanpa banyak gangguan pada Master. Saya menulis dua posting:
Daripada merinci cara menggunakan rsync, harap baca dua posting itu.
Konversikan setiap tabel MyISAM pada slave ke InnoDB
Pada DB Slave, Anda dapat Pernyataan SQL berikut:
Untuk MySQL 5.5:
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema');
Versi untuk MySQL sebelum MySQL 5.5
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql');
Menggunakan output dari kueri, Anda memiliki skrip konversi untuk budak.
Anda harus meletakkan dua baris ini di bagian atas skrip:
SET SQL_LOG_BIN = 0;
STOP SLAVE;
Script pertama-tama akan menonaktifkan logging biner (jika Anda mengkonfigurasi slave untuk memiliki log biner), menghentikan replikasi, dan mengonversi setiap tabel MyISAM ke InnoDB.
Berikut ini cara membuat skrip itu dan menjalankannya:
SQLSTMT="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema')"
INNODB_CONV_SCRIPT=MassConvertMyISAMTablesToInnoDB.sql
echo "SET SQL_LOG_BIN = 0;" > ${INNODB_CONV_SCRIPT}
echo "STOP SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Master) -u... -p... --skip-column-names -A -e"${SQL}" >> ${INNODB_CONV_SCRIPT}
echo "START SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Slave) -u... -p... --skip-column-names -A < ${INNODB_CONV_SCRIPT}
Arahkan aplikasi Anda ke Budak
Lakukan kueri SELECT dari Slave. Jika Anda puas dengan konten data pada Slave, jangan ragu untuk mengarahkan aplikasi Anda ke slave sebagai berikut:
- Di Budak, jalankan
SHOW SLAVE STATUS\G
dan pastikan Seconds_Behind_Master adalah 0
- Pada Slave, mysqldump -h (IP dari Slave) -u ... -p ... - transaksi tunggal --rutin --trigger --all-database> MySQLBackup.sql (Hei, cadangan akan bagus kan sekitar sekarang)
- Pada Master, jalankan
service mysql stop
(Downtime dimulai)
- Ulangi Langkah 1
- Arahkan aplikasi Anda ke Budak (Waktu Henti berakhir pada koneksi pertama aplikasi)
Jika Anda sampai pada titik ini tanpa cedera, SELAMAT !!!
BONUS TAMBAHAN : Jika Anda mengatur Master / Master Replication (alias Circular Replication) alih-alih Master / Slave, Anda dapat melakukan ini sebagai gantinya:
- Di Budak, jalankan
SHOW SLAVE STATUS\G
dan pastikan Seconds_Behind_Master adalah 0
- Pada Slave, mysqldump -h (IP dari Slave) -u ... -p ... - transaksi tunggal --rutin --trigger --all-database> MySQLBackup.sql (Hei, cadangan akan bagus kan sekitar sekarang)
- Arahkan aplikasi Anda ke Budak (Waktu Henti dimulai dan berakhir pada koneksi pertama aplikasi)
- Pada Master baru, jalankan
STOP SLAVE;
- Pada Master baru, jalankan
CHANGE MASTER TO MASTER_HOST='';
Apa yang sekarang Anda miliki adalah Master / Slave secara terbalik. Master Baru memiliki data InnoDB dan Master lama sekarang menjadi budak dengan data MyISAM. Jika Anda membagi baca dan tulis, baca dapat pergi dari Slave (membaca lebih cepat dari MyISAM daripada InnoDB) dan menulis pergi ke Master (dukungan transaksional untuk InnoDB). Seperti Hannah Montana bernyanyi, Anda mendapatkan yang terbaik dari kedua dunia (Ya, saya punya dua anak perempuan yang suka pertunjukan) !!!
BONUS TAMBAH LAIN : Karena Master sekarang InnoDB, Anda dapat melakukan mysqldump dari Master tanpa downtime dan tanpa mengganggu transaksi. Hanya kekurangannya adalah meningkatkan CPU dan disk I / O. Oleh karena itu Anda bisa ke mysqldump struktur tabel hanya pada Master (InnoDB) dan mysqldump data hanya pada slave (dump tersebut tidak akan memiliki referensi ke InnoDB atau MyISAM. Itu hanya akan menjadi data) ditambah mysqldump dari struktur tabel untuk slave memiliki tata letak MyISAM.
Kemungkinan dapat berlanjut karena pengaturan baru ini ...
UPDATE 2011-08-27 19:50 EDT
Permintaan maaf saya. Saya tidak sepenuhnya membaca pertanyaan itu. Anda sudah melakukan konversi .
Hanya jika Anda sudah mengaktifkan pencatatan biner , dan Anda memiliki cadangan sebelumnya, Anda bisa
- pulihkan / var / lib / mysql ke lokasi lain, seperti / var / lib / mysql2
- Lari
service mysql stop
- Lari
service mysql start --datadir=/var/lib/mysql2
- mysqldump database dari cadangan itu ke /root/olddata.sql
- jalankan mysqlbinlog terhadap semua log biner di / var / lib / mysql (bukan / var / lib / mysql2) dari titik waktu sejak cadangan terakhir ke /root/changes.sql
- Muat perubahan.sql ke mysql (karena masih menunjuk ke / var / lib / mysql2)
Ini harus menangkap semua yang telah direkam dan konversi harus mulai. Sekali lagi, ini semua Anda harus sudah mengaktifkan pencatatan biner sebelum pencadangan terakhir . Kalau tidak, belasungkawa saya.