Saat kita migrasi dari MySQL (yang dimanage sendiri) ke server RDS (Relational Database Service) pada cloud AWS, ada beberapa statement pada replikasi/slave yang tidak bisa digunakan. Padahal statement tersebut penting untuk mengkonfigurasi replikasi, mereset replikasi, mensolving replikasi jika terjadi error.
Sebagai gantinya RDS menyediakan statement pengganti dalam bentuk stored procedure yang diawali dengan CALL mysql.x
*Note: disini saya akan menggunakan istilah replikasi atau slave. Kedua artinya sama saja. Semoga tidak bingung.
STOP SLAVE
Statement ini digunakan untuk menghentikan replikasi MySQL. Biasanya statement ini dijalankan ketika ada error pada replikasi, jadi distop dulu replikasinya baru kemudian dilakukan fixing.
Statement ini tidak bisa digunakan di RDS, sebagai gantinya gunakan store procedure berikut:
CALL mysql.rds_stop_replication;
START SLAVE
Fungsinya untuk menghidupkan replikasi. Biasanya statement ini dijalankan setelah selesai mengkonfigurasi replikasi (CHANGE MASTER TO..), ataupun setelah memfix error pada replikasi. Jadi kita perlu menghidupkan replikasinya kembali.
Gunakan store procedure berikut sebagai ganti dari START SLAVE:
CALL mysql.rds_start_replication
SET GLOBAL sql_slave_skip_counter = <value>
Statement ini digunakan untuk mengskip error pada replikasi. Statement ini cukup mengerikan dan tidak disarankan untuk digunakan jika tidak diperlukan.
Di RDS, kita bisa menjalankannya dengan:
CALL mysql.rds_skip_repl_error
Sedikit sharing.
Pengalaman saya menggunakan statement ini, replikasi yang saya punya menjadi error. Memang awalnya tersolved, tapi beberapa saat kemudian error kembali. Error yang mau saya solve saat itu adalah duplicate primary key.
Saat itu saya menjalankannya dengan value yang lumayan besar:
SET GLOBAL sql_slave_skip_counter =
1000
Ternyata value 1000 itu artinya akan menskip 1000 statement yang ada dibinlog. Statementnya bisa berupa INSERT, UPDATE, DELETE, ALTER dan lain-lain. Dan transaksi pada master saat itu sedang kencang-kencangnya, artinya statement pada binlog tersebut sedang banyak-banyaknya.
Sialnya, dari 1000 statement yang diskip ada statement INSERT. Artinya INSERT tersebut terskip dan datanya tidak masuk ke database replikasi/slave. Beberapa saat kemudian data tersebut ada update di master, dan ketika dijalankan di slave (UPDATE nama_table..xx) menghasilkan error: record not found
(karena data dislave tidak ada, sedangkan dimaster ada).
So, buat yang ingin menjalankan sql_slave_skip_counter
, jangan isi valuenya dengan nilai besar dan pastikan kalian sudah mengetahui isi binlognya, berapa banyak statement yang ada disana, untuk memperhitungkan valuenya dan mencegah terjadinya error yang lebih parah 🙂
RESET SLAVE
Fungsinya untuk mereset konfigurasi slave. Biasanya statement ini digunakan jika terjadi error replikasi, jadi perlu dikonfigurasi ulang slavenya agar mengacu ke binlog dan posisi yang benar.
Gunakan di RDS:
CALL mysql.rds_reset_external_master
CHANGE MASTER TO
Fungsinya untuk mengkonfigurasi slave, yaitu mengatur filebinlog, posisi binlog, username, password dan host untuk connect ke master.
Jika slave baru dikonfigurasi pertama kali, maka statement CHANGE MASTER TO
ini bisa langsung dijalankan. Tapi jika bukan pertama kali, harus dijalankan dulu RESET SLAVE
untuk menghapus konfigurasi existing, baru kemudian jalankan CHANGE MASTER TO
.
Gunakan di RDS:
CALL mysql.rds_set_external_master