PolarDB for MySQL menyediakan fitur Preemptive DDL untuk mencegah operasi Data Definition Language (DDL) gagal akibat kueri besar atau transaksi jangka panjang pada tabel di node read-only.
Symptoms
Saat menjalankan operasi DDL di database PolarDB for MySQL, terjadi error yang menunjukkan bahwa kunci metadata (MDL) tidak dapat diperoleh. Pesan error berikut ditampilkan:
ERROR HY000: Fail to get MDL on replica during DDL synchronizeERROR HY000: Fail to get table lock on replica; you can 'set polar_support_mdl_sync_preemption = ON' and try restarting transaction
Prerequisites
Kluster PolarDB for MySQL Anda harus menggunakan salah satu revisi berikut:
-
PolarDB for MySQL 5.6: revisi 5.6.1.0.43 atau lebih baru.
-
PolarDB for MySQL 5.7: revisi 5.7.1.0.34 atau lebih baru.
-
PolarDB for MySQL 8.0.1: revisi 8.0.1.1.39 atau lebih baru.
-
PolarDB for MySQL 8.0.2: revisi 8.0.2.2.14 atau lebih baru.
Untuk memeriksa revisi kluster Anda, lihat View the version of a cluster.
Limitations
Fitur Preemptive DDL hanya didukung pada node read-only, bukan pada node primary.
Usage notes
-
Mengaktifkan Preemptive DDL dapat menghentikan koneksi yang sedang mengakses tabel target di node read-only atau membatalkan kueri SQL yang sedang berjalan pada tabel tersebut. Gunakan fitur ini dengan hati-hati.
-
Fitur Preemptive DDL hanya efektif jika nilai parameter loose_replica_lock_wait_timeout lebih besar daripada nilai parameter loose_polar_mdl_sync_preempt_after_wait_second ditambah 5.
-
Untuk PolarDB for MySQL 8.0.1 dan PolarDB for MySQL 8.0.2, fitur ini tidak mendukung operasi rename. Kami menyarankan Anda menggunakan pernyataan
ALTER TABLE ... RENAMEsebagai gantinya.
Background information
PolarDB for MySQL menggunakan arsitektur penyimpanan bersama. Saat menjalankan operasi DDL, node primary terlebih dahulu memperoleh kunci metadata eksklusif (MDL-X), lalu menginstruksikan semua node read-only untuk memperoleh kunci yang sama. Jika suatu transaksi sedang mengakses tabel target di node read-only, proses sinkronisasi kunci MDL akan terblokir. Jika node read-only gagal memperoleh kunci MDL-X dalam periode timeout yang ditentukan, client akan mengembalikan error ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize. Masalah ini umum terjadi pada kluster PolarDB for MySQL dengan multiple node read-only. Fitur Preemptive DDL dirancang untuk mengatasi masalah ini.
Procedure
Anda dapat mengaktifkan fitur Preemptive DDL dengan parameter loose_polar_support_mdl_sync_preemption dan mengatur timeout tunggu preemption dengan parameter loose_polar_mdl_sync_preempt_after_wait_second. Untuk informasi selengkapnya, lihat Specify cluster and node parameters. Tabel berikut menjelaskan parameter-parameter tersebut.
|
Parameter |
Level |
Description |
|
loose_polar_support_mdl_sync_preemption |
Session |
Mengontrol fitur Preemptive DDL. Nilai yang valid:
|
|
loose_polar_mdl_sync_preempt_after_wait_second |
Global |
Menentukan timeout tunggu dalam detik saat sinkronisasi kunci MDL terblokir. Jika kunci belum diperoleh setelah periode ini, sistem akan memulai preemption terhadap thread yang memblokir. Nilai yang valid: 1 hingga 31536000. Satuan: detik. Nilai default: 10. |
Examples
Preemptive DDL disabled
Preemptive DDL enabled
Contact us
Jika Anda memiliki pertanyaan tentang operasi DDL, silakan contact technical support.