All Products
Search
Document Center

PolarDB:Preemptive DDL

Last Updated:Jun 22, 2026

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 synchronize
ERROR 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 ... RENAME sebagai 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:

  • ON: Mengaktifkan fitur Preemptive DDL.

  • OFF (Default): Menonaktifkan fitur Preemptive DDL.

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

  1. Di node read-only, jalankan kueri pada tabel test.t1.

    mysql> use test;
    Database changed
    # A large query that runs for 100 seconds
    mysql> select sleep(100) from t1;
  2. Di node primary, tambahkan kolom ke tabel.

    mysql > alter table t1 add column c int;
    ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize

    Contoh ini menunjukkan bahwa ketika fitur Preemptive DDL dinonaktifkan, operasi DDL terblokir dan akhirnya gagal. Hal ini terjadi karena transaksi jangka panjang di node read-only mencegah sinkronisasi kunci MDL.

    mysql> select sleep(100) from t1;
    +------------+
    | sleep(100) |
    +------------+
    |          0 |
    +------------+
    1 row in set (1 min 40.00 sec)

Preemptive DDL enabled

  1. Di node read-only, jalankan kueri pada tabel test.t1.

    mysql> use test;
    Database changed
    # A large query that runs for 100 seconds
    mysql> select sleep(100) from t1;
  2. Di node primary, tambahkan kolom ke tabel.

    mysql> alter table t1 add column c int;
    Query OK, 0 rows affected (11.13 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    Contoh ini menunjukkan bahwa ketika fitur Preemptive DDL diaktifkan, sinkronisasi kunci MDL awalnya terblokir oleh transaksi jangka panjang. Setelah periode tunggu tertentu, fitur ini melakukan preemption terhadap thread yang memblokir, sehingga operasi DDL berhasil.

    mysql> select sleep(100) from t1;
    ERROR 2013 (HY000): Lost connection to MySQL server during query

Contact us

Jika Anda memiliki pertanyaan tentang operasi DDL, silakan contact technical support.