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.
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.
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
Masuk ke Konsol PolarDB.
Di pojok kiri atas, pilih wilayah tempat kluster diterapkan.
Temukan kluster dan klik ID-nya.
Di panel navigasi sisi kiri, pilih .
Temukan parameter loose_polar_slave_work_on_nonblock_mdl_mode dan klik Modify Parameter.

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

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.
Kueri tabel
test.tpada node baca saja.mysql> begin; mysql> select * from test.t; +------+ | a | +------+ | 1 | +------+ 1 row in set (0.00 sec)Lakukan operasi DDL pada
test.tpada node utama.mysql> alter table test.t add column b int; Query OK, 0 rows affected (0.32 sec) Records: 0 Duplicates: 0 Warnings: 0Kueri tabel
test.tlagi 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.