PolarDB mendukung pernyataan DDL nonblocking yang mencegah kemacetan akibat penantian kunci berkepanjangan saat menjalankan pernyataan DDL. Topik ini menjelaskan tentang pernyataan DDL nonblocking.
Informasi latar belakang
Jika pernyataan DDL blocking dikirimkan dan tabel terpengaruh memiliki transaksi atau query yang belum di-commit, pernyataan DDL tersebut akan menunggu Kunci MDL-X. Selama menunggu, transaksi yang mengoperasikan data pada tabel yang sama masih dapat di-submit. Namun, karena Kunci MDL-X memiliki prioritas tertinggi, transaksi baru harus menunggu hingga pernyataan DDL blocking selesai. Akibatnya, koneksi menjadi macet, yang dapat menyebabkan seluruh sistem bisnis gagal. Sebaliknya, jika pernyataan DDL ini adalah pernyataan DDL nonblocking, transaksi baru tetap dapat dieksekusi sementara pernyataan tersebut menunggu Kunci MDL-X.
Prasyarat
Kluster PolarDB for MySQL Anda memenuhi salah satu persyaratan berikut:
Kluster PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.29 atau lebih baru.
Kluster PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.12 atau lebih baru.
Untuk informasi tentang cara melihat versi kluster Anda, lihat Versi Engine 5.6, 5.7, dan 8.0.
Perhatian
Pernyataan DDL nonblocking memiliki prioritas lebih rendah dan lebih rentan terhadap kegagalan karena kurangnya kunci MDL.
Batasan
Kluster PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.29 atau lebih baru, atau kluster PolarDB for MySQL 8.0.2.2.12:
Hanya pernyataan ALTER TABLE yang mendukung fitur DDL nonblocking. Fitur ini ideal untuk pernyataan berikut:
ALTER TABLE table_name ADD INDEX index_name ('column1', 'column2', 'column3').Untuk mendefragmentasi tabel yang dibuat dalam engine InnoDB, Anda harus mengeksekusi pernyataan
ALTER TABLE table_name engine=innodbalih-alih pernyataanOPTIMIZE TABLE table_name.
Kluster PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.13 atau lebih baru.
Pernyataan ALTER TABLE, OPTIMIZE TABLE, dan TRUNCATE TABLE mendukung fitur DDL nonblocking.
Menggunakan pernyataan DDL nonblocking
Tabel berikut menjelaskan parameter untuk menggunakan pernyataan DDL nonblocking. Untuk informasi lebih lanjut, lihat Konfigurasikan Parameter Kluster dan Node.
Parameter | Tingkat | Deskripsi |
loose_polar_nonblock_ddl_mode | Sesi | Menentukan apakah fitur DDL nonblocking diaktifkan. Nilai default: OFF. Nilai valid:
|
loose_polar_nonblock_ddl_retry_times | Sesi | Jumlah maksimum percobaan ulang setelah upaya pernyataan DDL untuk mendapatkan kunci MDL-X habis waktu. Nilai valid: 0 hingga 31536000. Nilai default: 0. Nilai default dihitung berdasarkan nilai parameter Catatan Kami merekomendasikan Anda untuk menyetel nilai parameter ini ke 4194304. |
loose_polar_nonblock_ddl_retry_interval | Sesi | Interval di mana pernyataan DDL mencoba kembali untuk mendapatkan kunci MDL-X. Nilai valid: 1 hingga 31536000. Unit: detik. Nilai default: 6. |
loose_polar_nonblock_ddl_lock_wait_timeout | Sesi | Periode timeout untuk upaya pernyataan DDL untuk mendapatkan kunci MDL-X. Nilai valid: 1 hingga 31536000. Unit: detik. Nilai default: 1. |
Pengujian performa
Bagian ini membandingkan performa penggunaan pernyataan DDL blocking, pernyataan nonblocking, dan penggunaan gh-ost untuk melakukan perubahan skema.
Test tool
SysBench adalah alat benchmark modular, lintas platform, dan multi-threaded yang digunakan untuk mengevaluasi performa sistem database berdasarkan metrik inti. SysBench memungkinkan Anda menguji performa database tanpa pengaturan benchmark yang kompleks, bahkan tanpa instalasi database. Untuk informasi tentang cara menggunakan SysBench, lihat Pengujian Performa OLTP.
Test environment
Kluster PolarDB for MySQL 8.0 dengan 8 core CPU dan 64 GB memori. Kluster ini menjalankan Edisi Kluster.
Test methods
Gunakan SysBench untuk membuat tabel uji bernama
sbtest1dan masukkan 1 juta baris data ke dalam tabel../oltp_read_write.lua --mysql-host="Titik akhir Kluster" --mysql-port="Nomor Port" --mysql-user="Nama Pengguna" --mysql-password="Kata Sandi" --mysql-db="sbtest" --tables=1 --table-size=1000000 --report-interval=1 --percentile=99 --threads=8 --time=6000 prepareGunakan skrip
oltp_read_write.luauntuk mensimulasikan beban kerja bisnis pengguna../oltp_read_write.lua --mysql-host="Titik akhir Kluster" --mysql-port="Nomor Port" --mysql-user="Nama Pengguna" --mysql-password="Kata Sandi" --mysql-db="sbtest" --tables=1 --table-size=1000000 --report-interval=1 --percentile=99 --threads=8 --time=6000 runMulai transaksi pada tabel
sbtest1tanpa commit transaksi, sehingga transaksi memegang kunci MDL ke tabel./* sesi 1 */ begin; select * from sbtest1;Dalam sesi lain, tambahkan kolom ke tabel
sbtest1dan pantau perubahan TPS./* sesi 2 */ alter table sbtest1 add column d int;Gunakan alat gh-ost untuk menambahkan kolom dan pantau perubahan TPS. Binary logs digunakan untuk pemantauan performa. Untuk informasi lebih lanjut, lihat Aktifkan Binary Logging.
./gh-ost --assume-rbr --user="Nama Pengguna" --password="Kata Sandi" --host="Titik akhir Kluster" --port="Nomor Port" --database="sbtest" --table="sbtest1" --alter="ADD COLUMN d INT" --allow-on-master --aliyun-rds --initially-drop-old-table --initially-drop-ghost-table --execute;
Test results
Saat pernyataan DDL nonblocking dinonaktifkan, TPS turun menjadi nol dan tetap nol untuk periode waktu yang lama. Bisnis sangat terpengaruh.

Saat pernyataan DDL nonblocking diaktifkan, TPS menurun secara periodik, tetapi tidak pernah turun menjadi nol. Penantian kunci hanya sedikit memengaruhi bisnis, dan stabilitas sistem tetap terjaga.

Saat alat gh-ost digunakan untuk memodifikasi skema tabel, TPS turun menjadi nol secara periodik. Dalam hal ini, bisnis sangat terpengaruh, yang disebabkan oleh kunci tabel sementara pada langkah cut-over.

Performance comparison between nonblocking DDL statements and the gh-ost tool
Bagian ini membandingkan performa penambahan kolom ke tabel dengan 100 juta baris data menggunakan pernyataan DDL nonblocking (metode INSTANT, INPLACE, dan COPY) serta menggunakan alat gh-ost.
Saat tabel tidak memiliki beban kerja, pernyataan DDL nonblocking lebih cepat daripada alat gh-ost.

Saat skrip oltp_read_write SysBench digunakan untuk mensimulasikan beban kerja bisnis, pernyataan DDL nonblocking tetap lebih cepat daripada alat gh-ost.

Conclusions
Pernyataan DDL nonblocking tidak memblokir transaksi baru dan menghindari TPS nol, yang membantu memaksimalkan stabilitas sistem dan meningkatkan efisiensi pernyataan DDL.
Hubungi kami
Jika Anda memiliki pertanyaan tentang operasi DDL, hubungi kami.