All Products
Search
Document Center

PolarDB:Cegah transaksi jangka panjang pada node read-only menghalangi operasi DDL

Last Updated:Mar 29, 2026

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 pernyataan LOCK TABLES atau FLUSH TABLES — MDL tersebut memerlukan perintah eksplisit UNLOCK TABLES untuk 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:

SituasiTindakan
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 barisPemblokiran tidak disebabkan oleh transaksi jangka panjang. Periksa adanya pernyataan aktif LOCK TABLES atau FLUSH TABLES dan lepaskan dengan UNLOCK TABLES.

Aktifkan parameter

  1. Masuk ke Konsol PolarDB.

  2. Di pojok kiri atas, pilih wilayah tempat kluster Anda ditempatkan.

  3. Temukan kluster tersebut dan klik ID-nya.

  4. Di panel navigasi sebelah kiri, pilih Settings and Management > Parameters.

  5. Temukan loose_polar_slave_work_on_nonblock_mdl_mode dan klik Modify Parameter.

    参数配置

  6. Klik Submit Changes. Di kotak dialog Save Changes, klik OK.

    保存改动

Batasan dan efek samping

KategoriDetail
LingkupHanya berlaku untuk node read-only. Tidak berpengaruh pada node primary.
Kunci/Flush tabelTidak dapat melewati MDL yang dipegang oleh LOCK TABLES atau FLUSH TABLES. Lepaskan kunci tersebut dengan UNLOCK TABLES.
Timeout kueri paralelSetelah 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 skemaKetika 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.