全部产品
Search
文档中心

PolarDB:Mencegah transaksi yang lama pada node baca saja menghalangi operasi DDL

更新时间:Jul 06, 2025

PolarDB menyediakan parameter polar_slave_work_on_nonblock_mdl_mode. Anda dapat menyetel parameter ini ke ON untuk mencegah transaksi yang lama pada node baca saja PolarDB menghalangi operasi bahasa definisi data (DDL) pada node utama. Topik ini menjelaskan cara mengonfigurasi parameter ini untuk PolarDB.

Batasan

Kluster PolarDB Anda harus memenuhi salah satu persyaratan berikut:

  • Kluster PolarDB untuk MySQL 8.0 dengan versi revisi 8.0.1.1.23 atau lebih baru.

  • Kluster PolarDB untuk MySQL 5.7 dengan versi revisi 5.7.1.0.19 atau lebih baru.

  • Kluster PolarDB untuk MySQL 5.6 dengan versi revisi 5.6.1.0.32 atau lebih baru.

Catatan

Untuk informasi tentang cara melihat versi kernel kluster Anda, lihat Kueri Versi Engine.

Parameter polar_slave_work_on_nonblock_mdl_mode hanya efektif jika tingkat isolasi transaksi pada node baca saja PolarDB adalah Read Committed atau Read Uncommitted.

Parameter polar_slave_work_on_nonblock_mdl_mode hanya berlaku untuk node baca saja PolarDB.

Informasi latar belakang

Transaksi yang lama pada node baca saja PolarDB memegang kunci metadata (MDLs) pada tabel data yang diakses. Dalam kasus ini, operasi DDL pada node utama PolarDB tidak dapat mensinkronkan MDLs. Akibatnya, kesalahan timeout terjadi dan pesan kesalahan "ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize" dikembalikan.

Catatan

Parameter replica_lock_wait_timeout menentukan periode timeout untuk sinkronisasi MDL. Periode timeout default adalah 50 detik.

Jika sinkronisasi MDL timeout, jalankan pernyataan show processlist pada node utama PolarDB. Jika nilai yang dikembalikan untuk parameter State adalah Wait for syncing with replicas, Anda dapat menjalankan pernyataan select * from information_schema.innodb_log_mdl_slot where slot_state = "SLOT_ACQUIRING" pada node baca saja PolarDB untuk menanyakan MDLs yang dalam keadaan menunggu. Jika sistem mengembalikan tabel serupa dengan tabel berikut, itu menunjukkan bahwa transaksi yang lama pada node baca saja PolarDB memegang MDLs.

+---------+----------------+-----------+----------+-----------+
| slot_id | slot_state     | slot_name | slot_lsn | thread_id |
+---------+----------------+-----------+----------+-----------+
|       0 | SLOT_ACQUIRING | test/t    | 35025648 | thread-0  |
+---------+----------------+-----------+----------+-----------+

Tindakan pencegahan

Parameter polar_slave_work_on_nonblock_mdl_mode dapat digunakan untuk menyelesaikan hanya masalah pemblokiran DDL yang disebabkan oleh transaksi yang lama. Setelah Anda menyetel parameter polar_slave_work_on_nonblock_mdl_mode ke ON, kegagalan sinkronisasi MDL mungkin terjadi karena kueri paralel memakan waktu lebih lama daripada periode timeout sinkronisasi MDL.

MDLs yang digunakan untuk mengunci atau membersihkan tabel harus diperoleh dengan membuka kunci tabel secara eksplisit. Oleh karena itu, masalah pemblokiran MDL yang disebabkan oleh penguncian atau pembersihan tabel tidak dapat diselesaikan dengan menyetel parameter polar_slave_work_on_nonblock_mdl_mode ke ON.

Prosedur

  1. Masuk ke Konsol PolarDB.

  2. Di pojok kiri atas, pilih wilayah tempat kluster diterapkan.

  3. Temukan kluster dan klik ID-nya.

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

  5. Temukan parameter loose_polar_slave_work_on_nonblock_mdl_mode dan klik Modify Parameter.

    parameter configuration

  6. Setelah Anda memodifikasi parameter, klik Submit Changes. Di kotak dialog Save Changes, klik OK.

    Simpan perubahan

Contoh

Setelah Anda menyetel parameter polar_slave_work_on_nonblock_mdl_mode ke ON, sebuah transaksi pada node baca saja mungkin mengembalikan struktur tabel yang berbeda.

  1. Kueri tabel test.t pada node baca saja.

    mysql> begin;
    mysql> select * from test.t;
    +------+
    | a    |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
  2. Lakukan operasi DDL pada test.t pada node utama.

    mysql> alter table test.t add column b int;
    Query OK, 0 rows affected (0.32 sec)
    Records: 0  Duplicates: 0  Warnings: 0
  3. Kueri tabel test.t lagi pada node baca saja.

    mysql> select * from test.t;
    +------+------+
    | a    | b    |
    +------+------+
    |    1 | NULL |
    +------+------+
    1 row in set (0.00 sec)

Contoh di atas menunjukkan bahwa setelah parameter polar_slave_work_on_nonblock_mdl_mode disetel ke ON, sebuah transaksi pada node baca saja mengembalikan jumlah kolom yang berbeda ketika transaksi tersebut dilakukan sebelum dan sesudah operasi DDL dilakukan pada node utama. Setelah Anda menyetel parameter polar_slave_work_on_nonblock_mdl_mode ke OFF, operasi DDL pada node utama tidak diizinkan hingga transaksi pada node baca saja selesai atau timeout terjadi. Dalam hal ini, pesan kesalahan "ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize" dikembalikan.

Hubungi kami

Jika Anda memiliki pertanyaan tentang operasi DDL, hubungi kami.