All Products
Search
Document Center

PolarDB:Optimasi MDL (metadata lock)

Last Updated:Jun 21, 2026

Kunci metadata (MDL) adalah kunci internal database yang memastikan konsistensi metadata tabel selama operasi Data Definition Language (DDL). Transaksi baca/tulis standar harus memperoleh kunci baca MDL pada tabel target, sedangkan operasi DDL memerlukan kunci tulis MDL pada tabel target. Saat menjalankan pernyataan DDL, perhatikan isu-isu berikut terkait kunci metadata:

  • Blokir

    Transaksi jangka panjang yang memegang kunci baca MDL dapat memblokir operasi DDL, menyebabkannya gagal setelah menunggu terlalu lama untuk memperoleh kunci tulis MDL. Selain itu, karena MySQL menggunakan mekanisme kunci adil (fair lock) untuk MDL, pernyataan DDL yang diblokir juga akan memblokir semua transaksi baru yang mengantri untuk memperoleh kunci baca MDL.

  • Risiko deadlock

    Saat beberapa pernyataan DDL dan transaksi dijalankan secara konkuren, mereka dapat meminta MDL dalam urutan yang berbeda, yang berpotensi menyebabkan deadlock.

  • Eksklusivitas

    Kunci tulis MDL bersifat eksklusif. Ketika operasi DDL memperoleh kunci tulis MDL, semua transaksi masuk akan diblokir karena tidak dapat memperoleh kunci baca MDL. Hal ini dapat menyebabkan penurunan traffic hingga nol. Meskipun MySQL mendukung Online DDL, operasi tersebut tetap perlu memperoleh kunci tulis MDL secara singkat pada tahap kritis dan tidak dapat sepenuhnya menghindari penguncian tabel.

Jika isu-isu ini terjadi selama eksekusi DDL, mereka dapat menciptakan sejumlah besar koneksi bisnis yang terblokir dan, dalam kasus parah, menyebabkan penurunan traffic sementara hingga nol. PolarDB-X menyediakan optimasi terarah untuk mengatasi isu kunci metadata ini guna menghilangkan risiko tersebut.

Optimasi MDL preemptible

PolarDB-X mendukung optimasi MDL preemptible. Optimasi ini menghilangkan risiko pemblokiran akibat kunci metadata selama eksekusi DDL.

Versi yang didukung

Fitur ini tersedia di PolarDB-X versi 5.4.17-16952556 dan yang lebih baru.

Cara kerja

Saat Anda menjalankan pernyataan DDL yang memerlukan kunci tulis MDL, jika waktu tunggu untuk memperoleh kunci terlalu lama, PolarDB-X secara otomatis menghentikan koneksi transaksi jangka panjang yang memblokir DDL tersebut.

Tabel berikut menggambarkan skenario di mana pernyataan DDL dan transaksi baru diblokir oleh transaksi jangka panjang tanpa optimasi ini.

Tabel 1

Langkah

Session 1

Session 2

Session 3

1

begin;

-

begin;

2

insert into tb0 values(1);

-- Memperoleh kunci baca MDL pada tb0.

-

-

3

-- Transaksi tidak dikomit untuk mensimulasikan transaksi jangka panjang.

-

-

4

-

alter table tb0 add column col int;

-- Mencoba memperoleh kunci tulis MDL pada tb0 dan diblokir oleh transaksi jangka panjang.

-

5

-

-

select id from tb0;

-- Mencoba memperoleh kunci baca MDL pada tb0 dan diblokir.

Output berikut menunjukkan proses eksekusi dengan optimasi MDL preemptible diaktifkan. Langkah-langkahnya sama seperti pada Tabel 1.

-- session1
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into tb0 values(1);
Query OK, 1 row affected (0.16 sec)
mysql> select version();
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id:    46
-- session2
mysql> alter table tb0 add column col int;
Query OK, 0 rows affected (29.17 sec)
-- session3
mysql> select id from tb0;
Empty set (1.04 sec)

Seperti yang ditunjukkan dalam output, optimasi MDL preemptible menghentikan koneksi transaksi jangka panjang di Session 1. Hal ini memungkinkan pernyataan DDL di Session 2 dieksekusi dengan sukses dan memastikan transaksi baru di Session 3 berjalan normal.

Pendeteksian deadlock metadata terdistribusi

PolarDB-X mendukung pendeteksian deadlock metadata terdistribusi. Fitur ini mendeteksi dan memutus deadlock yang melibatkan kunci metadata selama eksekusi DDL, sehingga operasi DDL dan transaksi lain dapat dilanjutkan.

Versi yang didukung

Fitur ini tersedia di PolarDB-X versi 5.4.17-16952556 dan yang lebih baru.

Cara kerja

PolarDB-X secara berkala memindai hubungan antrian kunci antara transaksi dan pernyataan DDL. Jika terdeteksi deadlock, PolarDB-X secara otomatis menghentikan salah satu transaksi yang saling bertentangan untuk memastikan DDL dan transaksi lain dapat dilanjutkan.

Tabel berikut menunjukkan skenario deadlock khas yang melibatkan kunci metadata.

Tabel 2

Langkah

Session 1

Session 2

Session 3

Session 4

1

begin;

-- Memulai transaksi 1.

begin;

-- Memulai transaksi 2.

-

-

2

insert into t1 values(1);

-- Memperoleh kunci baca MDL pada t1.

insert into t2 values(1);

-- Memperoleh kunci baca MDL pada t2.

-

-

3

-

-

alter table t1 add column col int;

-- Memulai DDL 1, yang mencoba memperoleh kunci tulis MDL pada t1 dan diblokir.

alter table t2 add column col int;

-- Memulai DDL 2, yang mencoba memperoleh kunci tulis MDL pada t2 dan diblokir.

4

insert into t2 values(2);

-- Mencoba memperoleh kunci baca MDL pada t2, tetapi diblokir oleh DDL 2 karena mekanisme kunci adil.

insert into t1 values(2);

-- Mencoba memperoleh kunci baca MDL pada t1, tetapi diblokir oleh DDL 1 karena mekanisme kunci adil.

-

-

Output berikut menunjukkan bagaimana PolarDB-X menyelesaikan deadlock dari Tabel 2 dengan menggunakan pendeteksian deadlock metadata terdistribusi. Langkah eksekusinya sama seperti pada tabel tersebut.

-- Session 1
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values(1);
Query OK, 1 row affected (0.12 sec)
mysql> insert into t2 values(2);
Query OK, 1 row affected (0.02 sec)
mysql> commit;
Query OK, 0 rows affected (0.99 sec)

-- Session 2
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t2 values(1);
Query OK, 1 row affected (0.08 sec)
mysql> insert into t1 values(2); -- Terdeteksi deadlock MDL. Koneksi dihentikan dan transaksi di-rollback.
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id:    14
Current database: d0

-- Session 3
mysql> alter table t1 add column col int;
Query OK, 0 rows affected (2 min 38.30 sec)

-- Session 4
mysql> alter table t2 add column col int;
Query OK, 0 rows affected (2 min 59.85 sec)

Setelah skenario deadlock dari Tabel 2 terbentuk, PolarDB-X mendeteksi deadlock tersebut dan memilih untuk menghentikan transaksi 2. Rollback ini memungkinkan transaksi 1, DDL 1, dan DDL 2 diselesaikan.

Optimasi MDL dual-versi

Untuk DDL yang dieksekusi secara logis, PolarDB-X mendukung metadata dual-versi dan kunci metadata dual-versi yang sesuai. Hal ini memungkinkan operasi DDL tersebut berjalan tanpa pernah mengunci tabel atau menyebabkan penurunan traffic hingga nol.

Batasan

Optimasi ini berlaku untuk semua pernyataan DDL yang dieksekusi secara logis di PolarDB-X. Untuk menentukan apakah pernyataan DDL dieksekusi secara logis, lihat Online DDL.

Cara kerja

PolarDB-X mengimplementasikan DDL logis berdasarkan prinsip Online Schema Change. Metadata DDL logis dibagi menjadi beberapa versi kecil, memungkinkan evolusi metadata secara aman dalam instans PolarDB-X. Sebagai contoh, pernyataan CREATE GLOBAL INDEX DDL di PolarDB-X melibatkan beberapa transisi versi: ABSENT(Vn), DELETE_ONLY(Vn+1), WRITE_ONLY(Vn+2), dan PUBLISH(Vn+3). Selain itu, PolarDB-X mengikat kunci metadata terpisah untuk setiap versi minor tersebut.

Berkat mekanisme Online Schema Change, dua versi metadata dapat berdampingan, tidak hanya di berbagai node komputasi dalam kluster tetapi juga dalam satu node komputasi. Oleh karena itu, saat operasi DDL logis mulai mengembangkan versi metadata, PolarDB-X hanya memperoleh kunci tulis MDL untuk versi metadata lama selama setiap transisi. Hal ini memungkinkan transaksi baru mengakses versi metadata baru dan memperoleh kunci baca MDL yang sesuai.

Dengan optimasi MDL dual-versi, operasi DDL logis di PolarDB-X dapat berjalan tanpa pernah mengunci tabel atau menyebabkan penurunan traffic hingga nol.