Mulai 1 Agustus 2019, ApsaraDB RDS for MySQL tidak lagi mendukung mesin penyimpanan TokuDB. Topik ini menjelaskan cara melakukan migrasi tabel Anda dari TokuDB ke InnoDB.
Latar Belakang
Percona telah menghentikan pemeliharaan TokuDB, sehingga bug yang diketahui tidak diperbaiki dan dalam kasus ekstrem dapat menyebabkan kerugian bisnis. Akibatnya, ApsaraDB RDS for MySQL mencabut dukungan terhadap TokuDB pada 1 Agustus 2019.
Tanggal berlaku: 1 Agustus 2019
Cakupan yang terdampak: Instans RDS yang menggunakan mesin penyimpanan TokuDB
Periksa apakah instans Anda terdampak
Jalankan pernyataan SQL berikut di Data Management (DMS) untuk mengidentifikasi tabel TokuDB:
-- Lihat mesin penyimpanan default instans RDS Anda
SHOW ENGINES;
-- Lihat mesin penyimpanan tabel tertentu
SHOW CREATE TABLE <table_name>;
Dampak potensial
Penggunaan penyimpanan kira-kira berlipat ganda selama migrasi. Pastikan instans memiliki setidaknya dua kali kapasitas penyimpanan TokuDB saat ini sebelum memulai.
Sebelum melakukan migrasi, tinjau dampak berikut:
CPU dan IOPS: Setelah migrasi, penggunaan CPU menurun tetapi IOPS meningkat saat membaca volume data yang sama, karena InnoDB tidak mengompresi halaman data.
Perubahan titik akhir: Migrasi penuh akan mengganti titik akhir koneksi. Jadwalkan migrasi selama jam sepi.
Perubahan versi mesin: Jika Anda mengubah versi mesin database selama migrasi, uji kompatibilitas terlebih dahulu.
Pilih solusi
Pilih solusi berdasarkan ukuran tabel dan toleransi terhadap downtime:
| Solusi | Paling cocok untuk | Downtime | Kompleksitas |
|---|---|---|---|
| Solusi 1: ALTER TABLE | Tabel < 100 MB; blocking singkat dapat diterima | Blocking singkat pada tabel | Rendah |
| Solusi 2: gh-ost | Tabel > 5 GB; migrasi per tabel | Hampir nol | Sedang |
| Solusi 3: DTS table sync | Tabel > 5 GB; migrasi massal banyak tabel | Hampir nol | Sedang |
| Solusi 4: DTS instance migration | Migrasi instans penuh atau peningkatan instans | Sedang (perlu pergantian titik akhir) | Sedang |
Setelah menyelesaikan solusi apa pun, ubah nilai parameterdefault_storage_enginemenjadiInnoDB. Jika langkah ini dilewati, tabel baru yang dibuat tanpa klausa eksplisitENGINEakan tetap mencoba menggunakan TokuDB — yang tidak lagi didukung dan menyebabkan error. Lihat Setelah migrasi.
Solusi 1: ALTER TABLE (langsung)
Solusi ini secara langsung mengubah mesin penyimpanan dengan satu pernyataan SQL. Operasi DML diblokir selama proses berlangsung, sehingga hanya cocok untuk tabel kecil yang dapat menerima blocking singkat.
Login ke instans RDS Anda menggunakan .
Pada bilah navigasi atas, pilih SQL Operations > SQL Window.
Jalankan pernyataan berikut:
ALTER TABLE test.testfs ENGINE = InnoDB;
Solusi 2: gh-ost (migrasi online)
Solusi ini menggunakan gh-ost, tool open-source online DDL yang dikembangkan oleh GitHub. Tool ini menyalin data ke tabel ghost di latar belakang dan melakukan cutover selama jam sepi, sehingga operasi DML tetap tidak terblokir.
Cara kerja
gh-ost membuat tabel ghost sementara dengan skema yang sama seperti aslinya, menyalin data secara inkremental, lalu membaca log biner melalui replika simulasi untuk memainkan ulang perubahan yang sedang berlangsung. Saat Anda siap, gh-ost mengganti nama tabel untuk menyelesaikan cutover. Terjadi lonjakan I/O selama penyalinan penuh awal, tetapi parameter --chunk-size memungkinkan Anda membatasi throughput.
Keuntungan: Memungkinkan Anda menentukan waktu cutover secara tepat serta menjeda atau membatalkan kapan saja.
Batasan: Setiap tabel memerlukan perintah terpisah, yang menjadi merepotkan jika jumlah tabel sangat banyak. Gunakan Solusi 3 sebagai gantinya.
Prasyarat
gh-ost telah diinstal pada host on-premises atau instance Elastic Compute Service (ECS) Anda.
Alamat IP host telah ditambahkan ke daftar putih alamat IP instans RDS Anda.
Parameter
| Parameter | Deskripsi |
|---|---|
--initially-drop-old-table | Memeriksa dan menghapus tabel lama yang sudah ada sebelum memulai |
--initially-drop-ghost-table | Memeriksa dan menghapus tabel ghost yang sudah ada sebelum memulai |
--aliyun-rds | Mengaktifkan mode kompatibilitas untuk ApsaraDB RDS |
--assume-rbr | Membaca log biner dalam format Row Based Replication (RBR) |
--allow-on-master | Menjalankan gh-ost langsung pada instans primary |
--assume-master-host | Titik akhir instans primary |
--user | Nama akun database |
--password | Kata sandi akun database |
--host | Titik akhir database (harus sesuai dengan titik akhir instans primary) |
--database | Nama database |
--table | Nama tabel |
--alter | Klausa DDL yang akan diterapkan |
--chunk-size | Jumlah baris yang disalin per batch |
--postpone-cut-over-flag-file | Path ke file flag penundaan; hapus file ini untuk memicu cutover |
--panic-flag-file | Path ke file flag panic; membuat file ini akan menghentikan gh-ost segera |
--serve-socket-file | File socket untuk perintah kontrol interaktif |
--execute | Menjalankan migrasi (tanpa flag ini, gh-ost berjalan dalam mode dry-run) |
Migrasi tabel dengan gh-ost
Jalankan perintah berikut pada host atau instance ECS Anda:
gh-ost \ --user="test01" \ --password="Test123456" \ --host="rm-bpxxxxx.mysql.rds.aliyuncs.com" \ --database="test" \ --table="testfs" \ --alter="engine=innodb" \ --initially-drop-old-table \ --initially-drop-ghost-table \ --aliyun-rds \ --assume-rbr \ --allow-on-master \ --assume-master-host="rm-bpxxxxx.mysql.rds.aliyuncs.com" \ --chunk-size=500 \ --postpone-cut-over-flag-file="/tmp/ghostpost.postpone" \ --panic-flag-file="/tmp/stop.flag" \ --serve-socket-file="/tmp/ghost.sock" \ --executegh-ost membuat dua tabel sementara:
_gho(tabel ghost) dan_ghc(tabel changelog). Anda dapat melihatnya di panel navigasi kiri DMS.

Saat Anda siap melakukan cutover, hapus file flag penundaan:
Setiap error yang ditampilkan dalam output setelah penggantian nama dapat diabaikan — migrasi telah berhasil diselesaikan.
rm /tmp/ghostpost.postponegh-ost segera mengganti nama tabel dan menyelesaikan migrasi.

Verifikasi data, lalu hapus tabel
_delyang ditinggalkan oleh gh-ost.
Solusi 3: Sinkronisasi tingkat tabel DTS
Solusi ini menggunakan Data Transmission Service (DTS) untuk menyinkronkan data dari tabel TokuDB asli ke tabel InnoDB baru secara real-time, lalu mengganti nama tabel selama jam sepi. Solusi ini dapat menangani banyak tabel secara bersamaan, sehingga cocok untuk migrasi massal.
Instansi sinkronisasi data DTS dikenai biaya terpisah. Untuk detail harga, lihat Harga Data Transmission Service.
Login ke instans RDS Anda menggunakan .
Pada bilah navigasi atas, pilih SQL Operations > SQL Window.
Buat tabel InnoDB sementara dengan skema yang sama seperti tabel TokuDB Anda. Contohnya:
CREATE TABLE `testfs_tmp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `vc` varchar(8000) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Pada panel navigasi kiri Konsol DTS, klik Data Synchronization.
Temukan instans yang telah dibeli dan klik Configure Synchronization Channel di kolom Actions.
Konfigurasikan detail instans sumber dan tujuan:
Enkripsi SSL secara signifikan meningkatkan penggunaan CPU. Untuk instruksi pengaturan, lihat Konfigurasi Enkripsi SSL untuk instans RDS.
Bagian Parameter Nilai Detail instans sumber Jenis instans RDS Instance ID Instans Pilih instans RDS yang akan dimigrasi Enkripsi Non-encrypted atau SSL-encrypted Detail instans tujuan Jenis instans RDS Instance Instance ID Pilih instans RDS yang sama Enkripsi Non-encrypted atau SSL-encrypted 
Klik Set Whitelist and Next.
Tunggu hingga akun sinkronisasi dibuat, lalu klik Next.
Pindahkan tabel
testfske bagian tabel terpilih dan klik Edit.
Atur nama tabel tujuan menjadi
testfs_tmpdan klik OK.
Klik Next.
Pilih Initial Full Data Synchronization dan klik Precheck.

Tunggu hingga pemeriksaan awal selesai, lalu klik Close.
Tunggu hingga nilai Delay turun menjadi 0 Milliseconds, yang berarti kedua tabel telah sepenuhnya tersinkronisasi.

Di SQL Window DMS, ganti nama tabel untuk menyelesaikan cutover:
DTS melaporkan error sinkronisasi setelah penggantian nama — hal ini diharapkan dan dapat diabaikan.
RENAME TABLE `testfs` TO `testfs_del`, `testfs_tmp` TO `testfs`;Verifikasi data. Setelah dipastikan benar, rilis instans DTS untuk menghentikan penagihan dan hapus tabel
testfs_del.
Solusi 4: Migrasi instans DTS
Solusi ini melakukan migrasi seluruh instans RDS ke instans baru menggunakan DTS. Solusi ini paling cocok jika Anda perlu melakukan peningkatan instans atau dapat menerima gangguan layanan sedang akibat pergantian titik akhir.
Ekspor semua skrip skema dari instans sumber. Pada setiap skrip, ganti
ENGINE=TokuDBdenganENGINE=InnoDB. Contohnya: Ubah:CREATE TABLE t1 (id INT, name VARCHAR(10)) ENGINE=TokuDB;Kepada:
CREATE TABLE t1 (id INT, name VARCHAR(10)) ENGINE=InnoDB;Buat instans RDS baru dan gunakan skrip yang telah dimodifikasi untuk membuat database dan tabel. Untuk detailnya, lihat Buat instans ApsaraDB RDS for MySQL.
Gunakan DTS untuk melakukan migrasi data dari instans sumber ke instans baru. Untuk detailnya, lihat Konfigurasi sinkronisasi data satu arah antar instans ApsaraDB RDS for MySQL.
Saat mengonfigurasi tugas DTS, pilih hanya Initial Full Data Synchronization.

Setelah delay sinkronisasi mencapai 0, perbarui string koneksi aplikasi Anda agar mengarah ke titik akhir instans baru.
Setelah migrasi
Setelah menyelesaikan salah satu solusi di atas, perbarui parameter default_storage_engine pada instans RDS Anda menjadi InnoDB.
Jika langkah ini dilewati, tabel baru yang dibuat tanpa klausa eksplisit ENGINE akan mencoba menggunakan TokuDB — yang tidak lagi didukung dan menyebabkan error.
Untuk memperbarui parameter tersebut, buka Konsol RDS, navigasi ke Parameters, dan atur default_storage_engine menjadi InnoDB.