Kunci metadata (MDL) adalah mekanisme internal database yang memastikan konsistensi metadata tabel selama eksekusi transaksi dan pernyataan DDL. Untuk transaksi baca/tulis umum, diperlukan MDL baca pada tabel terkait. Untuk operasi DDL, diperlukan MDL tulis. Selama eksekusi pernyataan DDL, beberapa masalah terkait MDL perlu diperhatikan:
Risiko Pemblokiran
MDL baca yang dipegang oleh transaksi jangka panjang dapat memblokir eksekusi pernyataan DDL, menyebabkan kegagalan DDL karena permintaan MDL tulis tidak dapat dipenuhi. Selain itu, MDL di MySQL bersifat adil. Jika pernyataan DDL diblokir oleh MDL baca dari transaksi jangka panjang yang menunggu MDL tulis, transaksi baru juga akan diblokir saat mencoba memperoleh MDL baca.
Risiko Deadlock
Jika beberapa pernyataan DDL dan transaksi dijalankan secara bersamaan, deadlock metadata dapat terjadi akibat urutan permintaan MDL yang berbeda.
Risiko Pengecualian
MDL tulis bersifat eksklusif. Setelah MDL tulis diperoleh untuk pernyataan DDL, semua transaksi baru akan tertunda karena tidak dapat meminta MDL baca, mengakibatkan penurunan lalu lintas layanan menjadi nol. Meskipun MySQL mendukung fitur DDL Online, pernyataan DDL tersebut hanya meminimalkan penguncian tabel selama proses. Namun, pada beberapa langkah kritis, akuisisi MDL tulis jangka pendek tetap diperlukan.
Jika masalah di atas terjadi selama eksekusi pernyataan DDL, koneksi layanan dapat menumpuk dan terblokir. Dalam kasus parah, lalu lintas layanan dapat turun sementara menjadi nol, menyebabkan konsekuensi serius. PolarDB-X menyediakan optimalisasi untuk mengatasi masalah terkait MDL ini, menghilangkan risiko selama eksekusi pernyataan DDL.
Optimalisasi MDL yang dapat direbut
PolarDB-X mendukung optimalisasi MDL yang dapat direbut, menghilangkan risiko pemblokiran MDL selama eksekusi pernyataan DDL.
Versi yang didukung
Fitur ini tersedia di PolarDB-X versi V5.4.17-16952556 atau lebih baru.
Deskripsi
Selama eksekusi pernyataan DDL yang memerlukan MDL tulis, jika waktu tunggu MDL tulis melebihi ambang batas, PolarDB-X secara otomatis menghentikan pemblokiran koneksi tempat transaksi jangka panjang untuk pernyataan DDL ini berada.
Tabel berikut menjelaskan skenario di mana pernyataan DDL dan transaksi baru diblokir oleh transaksi jangka panjang sebelumnya jika optimalisasi MDL yang dapat direbut tidak diaktifkan.
Tabel 1
Langkah | Sesi 1 | Sesi 2 | Sesi 3 |
1 | begin; | - | begin; |
2 | insert into tb0 values(1); -- Memperoleh MDL baca dari tb0. | - | - |
3 | -- Menjaga transaksi tetap tidak dikomit untuk waktu lama untuk mensimulasikan transaksi jangka panjang. | - | - |
4 | - | alter table tb0 add column col int; -- Mencoba memperoleh MDL tulis dari tb0. Pernyataan ini diblokir oleh transaksi jangka panjang. | - |
5 | - | - | select id from tb0; -- Mencoba memperoleh MDL tulis dari tb0. Pernyataan ini diblokir. |
Gambar berikut menunjukkan proses eksekusi setelah optimalisasi MDL yang dapat direbut diaktifkan. Langkah-langkahnya sesuai dengan Tabel 1, dengan langkah-langkah kunci ditandai dalam gambar.

Seperti yang ditunjukkan pada gambar di atas, koneksi tempat transaksi jangka panjang di Sesi 1 berada ditutup karena optimalisasi MDL yang dapat direbut. Hal ini memastikan bahwa pernyataan DDL di Sesi 2 dan transaksi baru di Sesi 3 dapat dieksekusi.
Pendeteksian deadlock metadata terdistribusi
PolarDB-X mendukung pendeteksian deadlock metadata terdistribusi. Fitur ini mendeteksi dan memutus deadlock yang disebabkan oleh MDL selama eksekusi pernyataan DDL, memastikan eksekusi normal pernyataan DDL dan transaksi.
Versi yang didukung
Fitur ini tersedia di PolarDB-X versi V5.4.17-16952556 atau lebih baru.
Deskripsi
PolarDB-X secara berkala memindai antrian kunci antara transaksi dan pernyataan DDL. Jika deadlock terdeteksi, PolarDB-X secara otomatis menghentikan transaksi umum untuk memastikan eksekusi normal pernyataan DDL dan transaksi lainnya.
Tabel berikut menjelaskan skenario deadlock tipikal yang melibatkan MDL.
Tabel 2
Langkah | Sesi 1 | Sesi 2 | Sesi 3 | Sesi 4 |
1 | begin; -- Mulai Transaksi 1. | begin; -- Mulai Transaksi 2. | - | - |
2 | insert into t1 values(1); -- Memperoleh MDL baca dari t1. | insert into t2 values(1); -- Memperoleh MDL baca dari t2. | - | - |
3 | - | - | alter table t1 add column col int; -- Memulai Pernyataan DDL 1 dan mencoba memperoleh MDL tulis dari t1. Pernyataan ini diblokir. | alter table t2 add column col int; -- Memulai Pernyataan DDL 2 dan mencoba memperoleh MDL tulis dari t2. Pernyataan ini diblokir. |
4 | insert into t2 values(2); -- Mencoba memperoleh MDL baca dari t2. Namun, karena MDL adalah kunci adil, pernyataan ini diblokir oleh Pernyataan DDL 2. | insert into t1 values(2); -- Mencoba memperoleh MDL baca dari t1. Namun, karena MDL adalah kunci adil, pernyataan ini diblokir oleh Pernyataan DDL 1. | - | - |
Gambar berikut menunjukkan bagaimana masalah deadlock yang dijelaskan di Tabel 2 diselesaikan di instance PolarDB-X dengan fitur pendeteksian deadlock metadata terdistribusi diaktifkan. Langkah-langkahnya sesuai dengan Tabel 2, dengan langkah-langkah kunci ditandai dalam gambar.

Setelah skenario deadlock terbentuk sesuai urutan di Tabel 2, PolarDB-X mendeteksi deadlock dan menutup koneksi tempat Transaksi 2 berada. Transaksi 2 dibatalkan, dan Transaksi 1, Pernyataan DDL 1, serta Pernyataan DDL 2 dieksekusi.
Optimalisasi MDL dua versi
Untuk pernyataan DDL yang dieksekusi secara logis, PolarDB-X mendukung metadata dua versi dan MDL dua versi yang sesuai. Hal ini memastikan bahwa tidak ada tabel yang terkunci dan lalu lintas tidak turun menjadi nol selama eksekusi pernyataan DDL tersebut.
Batasan
Fitur ini didukung untuk semua pernyataan DDL yang dieksekusi secara logis di PolarDB-X. Untuk informasi lebih lanjut tentang cara memeriksa apakah pernyataan DDL dieksekusi secara logis, lihat DDL Online.
Deskripsi
Eksekusi logis pernyataan DDL di PolarDB-X diimplementasikan berdasarkan kemampuan Online Schema Change (OSC). Versi metadata untuk pernyataan DDL tersebut dibagi menjadi beberapa versi minor. Dengan cara ini, versi metadata dapat berkembang dengan aman di instance PolarDB-X. Sebagai contoh, beberapa kali pergantian versi seperti ABSENT(Vn), DELETE_ONLY(Vn +1), WRITE_ONLY(Vn +2), dan PUBLISH(Vn +3) terlibat selama proses eksekusi pernyataan CREATE GLOBAL INDEX di PolarDB-X. Selain itu, PolarDB-X mengaitkan MDL dengan versi minor metadata, sehingga metadata setiap versi memiliki MDL terpisah.
Berdasarkan mekanisme OSC, dua versi metadata diizinkan tidak hanya antara node komputasi (CN) yang berbeda dalam kluster tetapi juga dalam satu CN pada titik waktu tertentu. Oleh karena itu, setiap kali versi metadata berkembang untuk pernyataan DDL yang dieksekusi secara logis, PolarDB-X memperoleh kunci tulis MDL hanya untuk metadata versi sebelumnya. Dalam hal ini, transaksi baru dapat mengakses metadata versi baru dan meminta MDL baca yang sesuai.
Berdasarkan optimalisasi MDL dua versi, PolarDB-X memastikan bahwa tidak ada tabel yang terkunci dan lalu lintas tidak turun menjadi nol selama eksekusi pernyataan DDL yang dieksekusi secara logis.