Ketika transaksi jangka panjang pada node read-only memegang kunci metadata (MDL) pada suatu tabel, operasi Data Definition Language (DDL) pada node primary akan diblokir hingga transaksi tersebut berakhir atau replica_lock_wait_timeout habis (default: 50 detik). Saat timeout terjadi, DDL gagal dengan pesan ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize.
Atur polar_slave_work_on_nonblock_mdl_mode ke ON agar operasi DDL pada node primary dapat dilanjutkan tanpa menunggu pelepasan MDL yang bertentangan pada node read-only.
Cara kerja
Pada kluster PolarDB for MySQL, operasi DDL pada node primary harus menyinkronkan MDL ke semua node read-only sebelum dapat diselesaikan. Jika transaksi jangka panjang pada node read-only memegang MDL pada tabel target, sinkronisasi MDL akan diblokir hingga transaksi tersebut berakhir atau replica_lock_wait_timeout habis.
Ketika polar_slave_work_on_nonblock_mdl_mode diatur ke ON, operasi DDL pada node primary langsung dilanjutkan tanpa menunggu pelepasan MDL yang bertentangan pada node read-only. Konsekuensinya, transaksi pada node read-only mungkin mengamati skema tabel yang berbeda dalam satu transaksi jika DDL dijalankan secara konkuren pada node primary.
Parameter ini hanya mengatasi pemblokiran MDL yang disebabkan oleh transaksi jangka panjang. Parameter ini tidak mengatasi pemblokiran yang disebabkan oleh pernyataanLOCK TABLESatauFLUSH TABLES— MDL tersebut memerlukan perintah eksplisitUNLOCK TABLESuntuk dilepaskan.
Prasyarat
Sebelum mengaktifkan parameter ini, pastikan kluster Anda memenuhi semua kondisi berikut.
Persyaratan versi — kluster Anda harus memenuhi salah satu dari berikut:
PolarDB for MySQL 8.0, versi revisi 8.0.1.1.23 atau lebih baru
PolarDB for MySQL 5.7, versi revisi 5.7.1.0.19 atau lebih baru
PolarDB for MySQL 5.6, versi revisi 5.6.1.0.32 atau lebih baru
Untuk memeriksa versi revisi kluster Anda, lihat Query the engine version.
Persyaratan tingkat isolasi — tingkat isolasi transaksi pada node read-only harus Read Committed atau Read Uncommitted. Parameter ini tidak berpengaruh di bawah isolasi Repeatable Read atau Serializable.
Diagnosis pemblokiran MDL
Sebelum mengaktifkan parameter ini, pastikan bahwa transaksi jangka panjang (bukan pernyataan LOCK TABLES atau FLUSH TABLES) merupakan akar penyebab pemblokiran. Parameter ini tidak dapat membuka blokir MDL yang dipegang oleh kunci tabel eksplisit.
Langkah 1: Pada node primary — jalankan SHOW PROCESSLIST dan periksa apakah ada baris yang menunjukkan State = Wait for syncing with replicas. Jika ya, berarti DDL sedang diblokir karena menunggu sinkronisasi MDL pada node read-only.
SHOW PROCESSLIST;Langkah 2: Pada node read-only — identifikasi transaksi yang menyebabkan pemblokiran:
SELECT * FROM information_schema.innodb_log_mdl_slot WHERE slot_state = 'SLOT_ACQUIRING';Jika kueri mengembalikan baris, berarti transaksi jangka panjang memegang MDL:
+---------+----------------+-----------+----------+-----------+
| slot_id | slot_state | slot_name | slot_lsn | thread_id |
+---------+----------------+-----------+----------+-----------+
| 0 | SLOT_ACQUIRING | test/t | 35025648 | thread-0 |
+---------+----------------+-----------+----------+-----------+Langkah selanjutnya berdasarkan output:
| Situasi | Tindakan |
|---|---|
| Kueri mengembalikan baris (transaksi jangka panjang dikonfirmasi) | Aktifkan polar_slave_work_on_nonblock_mdl_mode untuk mencegah kejadian serupa di masa depan. Untuk segera membuka blokir DDL saat ini, hentikan transaksi yang menyebabkan pemblokiran menggunakan thread_id dari output. |
| Kueri tidak mengembalikan baris | Pemblokiran tidak disebabkan oleh transaksi jangka panjang. Periksa adanya pernyataan aktif LOCK TABLES atau FLUSH TABLES dan lepaskan dengan UNLOCK TABLES. |
Aktifkan parameter
Masuk ke Konsol PolarDB.
Di pojok kiri atas, pilih wilayah tempat kluster Anda ditempatkan.
Temukan kluster tersebut dan klik ID-nya.
Di panel navigasi sebelah kiri, pilih Settings and Management > Parameters.
Temukan
loose_polar_slave_work_on_nonblock_mdl_modedan klik Modify Parameter.
Klik Submit Changes. Di kotak dialog Save Changes, klik OK.

Batasan dan efek samping
| Kategori | Detail |
|---|---|
| Lingkup | Hanya berlaku untuk node read-only. Tidak berpengaruh pada node primary. |
| Kunci/Flush tabel | Tidak dapat melewati MDL yang dipegang oleh LOCK TABLES atau FLUSH TABLES. Lepaskan kunci tersebut dengan UNLOCK TABLES. |
| Timeout kueri paralel | Setelah mengaktifkan parameter ini, kegagalan sinkronisasi MDL masih dapat terjadi jika kueri paralel pada node read-only berjalan lebih lama dari replica_lock_wait_timeout (default: 50 detik). |
| Konsistensi skema | Ketika parameter diatur ke ON, transaksi pada node read-only mungkin mengamati skema tabel yang berbeda sebelum dan sesudah DDL konkuren pada node primary. Lihat bagian di bawah untuk contoh. |
Perilaku konsistensi skema saat parameter diatur ke ON
Ketika polar_slave_work_on_nonblock_mdl_mode diatur ke ON, DDL pada node primary tidak lagi menunggu transaksi yang sedang berjalan pada node read-only. Akibatnya, satu transaksi pada node read-only dapat mengamati dua skema tabel yang berbeda.
| Read-only Node (Session 1) | Node Utama (Sesi 2) |
|---|---|
BEGIN; | |
SELECT * FROM test.t; — mengembalikan hanya kolom a | |
ALTER TABLE test.t ADD COLUMN b INT; — berhasil segera | |
SELECT * FROM test.t; — mengembalikan kolom a dan b | |
COMMIT; |
SELECT kedua pada Sesi 1 mengembalikan skema yang telah diperbarui karena DDL pada Sesi 2 telah selesai sementara transaksi masih terbuka.
Ketika parameter diatur ke OFF (default), DDL pada Sesi 2 akan diblokir hingga Sesi 1 melakukan commit atau replica_lock_wait_timeout habis, menghasilkan pesan ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize.
Hubungi kami
Jika Anda memiliki pertanyaan mengenai operasi DDL, silakan hubungi dukungan teknis.