全部产品
Search
文档中心

PolarDB:DDL Preemptif

更新时间:Jul 03, 2025

PolarDB for MySQL mendukung fitur DDL preemptif. DDL preemptif membantu menyelesaikan kegagalan operasi DDL yang disebabkan oleh kueri besar atau transaksi jangka panjang pada node baca-saja.

Gejala

Kegagalan sinkronisasi kunci metadata (MDL) terjadi saat operasi DDL dilakukan pada kluster PolarDB for MySQL. Pesan kesalahan:

ERROR HY000: Gagal mendapatkan MDL pada replika selama sinkronisasi DDL
ERROR HY000: Gagal mendapatkan kunci tabel pada replika; Anda dapat 'set polar_support_mdl_sync_preemption = ON' dan mencoba memulai ulang transaksi

Prasyarat

Kluster PolarDB for MySQL Anda harus menjalankan salah satu versi mesin database berikut:

  • PolarDB for MySQL 5.6 dengan versi revisi 5.6.1.0.43 atau lebih baru.

  • PolarDB for MySQL 5.7 dengan versi revisi 5.7.1.0.34 atau lebih baru.

  • PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.39 atau lebih baru.

  • PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.14 atau lebih baru.

Untuk informasi tentang cara melihat versi mesin database suatu kluster, lihat Kueri versi mesin.

Batasan

Fitur DDL preemptif hanya didukung untuk node baca-saja.

Catatan penggunaan

  • Jika Anda mengaktifkan fitur DDL preemptif, koneksi ke tabel pada node baca-saja mungkin terputus atau pernyataan SQL yang belum dieksekusi pada tabel tersebut dapat dibatalkan. Lanjutkan dengan hati-hati.

  • Fitur DDL preemptif hanya berlaku jika nilai parameter loose_replica_lock_wait_timeout lebih besar dari jumlah nilai parameter loose_polar_mdl_sync_preempt_after_wait_second ditambah 5.

  • Untuk memastikan bahwa DDL preemptif berlaku ketika Anda mengganti nama tabel di MySQL for PolarDB 8.0.1 atau MySQL for PolarDB 8.0.2, gunakan pernyataan ALTER TABLE RENAME alih-alih pernyataan RENAME.

Informasi latar belakang

PolarDB for MySQL menggunakan arsitektur penyimpanan bersama. Ketika Anda melakukan operasi DDL, sistem memperoleh kunci MDL-X pada node utama dan kemudian memberi tahu node baca-saja untuk memperoleh kunci MDL-X. Jika tabel pada node baca-saja sedang diakses, thread sinkronisasi MDL-X terblokir. Jika node baca-saja tidak dapat memperoleh kunci MDL-X dalam periode timeout yang ditentukan, klien mengembalikan kode kesalahan dan pesan kesalahan berikut: ERROR 8007 (HY000): Gagal mendapatkan MDL pada replika selama sinkronisasi DDL. Masalah ini sering terjadi di kluster PolarDB for MySQL yang berisi beberapa node baca-saja. Anda dapat menggunakan fitur DDL preemptif untuk menyelesaikan masalah ini.

Penggunaan

Anda dapat mengatur parameter loose_polar_support_mdl_sync_preemption ke ON untuk mengaktifkan fitur DDL preemptif dan kemudian mengonfigurasi parameter loose_polar_mdl_sync_preempt_after_wait_second untuk menentukan periode timeout dalam mana sinkronisasi MDL harus selesai. Untuk informasi lebih lanjut, lihat Konfigurasikan parameter kluster dan node. Tabel berikut menjelaskan parameter tersebut.

Parameter

Tingkat

Deskripsi

loose_polar_support_mdl_sync_preemption

Sesi

Menentukan apakah akan mengaktifkan fitur DDL preemptif. Nilai valid:

  • ON

  • OFF (default)

loose_polar_mdl_sync_preempt_after_wait_second

Global

Periode timeout dalam mana sinkronisasi MDL harus selesai. Jika kunci MDL tidak disinkronkan ketika periode timeout yang ditentukan berakhir, thread preemption dimulai.

Nilai valid: 1 hingga 31536000. Unit: detik. Nilai default: 10.

Contoh

DDL Preemptif dinonaktifkan

  1. Kueri tabel test.t1 pada node baca-saja.

    mysql> use test;
    Database changed
    # Jalankan kueri besar selama 100 detik.
    mysql> select sleep(100) from t1;
  2. Tambahkan kolom pada node utama.

    mysql > alter table t1 add column c int;
    ERROR 8007 (HY000): Gagal mendapatkan MDL pada replika selama sinkronisasi DDL

    Contoh di atas menunjukkan bahwa ketika fitur DDL preemptif dinonaktifkan, sinkronisasi MDL gagal dan operasi DDL pada node baca-saja terblokir akibat adanya transaksi jangka panjang di node tersebut, sehingga menyebabkan kegagalan operasi DDL.

    image..png

DDL Preemptif diaktifkan

  1. Kueri tabel test.t1 pada node baca-saja.

    mysql> use test;
    Database changed
    # Jalankan kueri besar selama 100 detik.
    mysql> select sleep(100) from t1;
  2. Tambahkan kolom pada node utama.

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

    Contoh di atas menunjukkan bahwa ketika fitur DDL preemptif diaktifkan, sinkronisasi kunci MDL terblokir karena transaksi jangka panjang pada node baca-saja. Setelah periode waktu tertentu, thread preemption dimulai, dan operasi DDL berhasil.

    image..png

Hubungi kami

Jika Anda memiliki pertanyaan tentang operasi DDL, hubungi kami.