ApsaraDB RDS for MySQL mengoptimalkan penanganan konflik kunci unik selama eksekusi DDL, sehingga mengurangi kegagalan dan meningkatkan tingkat keberhasilan operasi DDL.
Cara kerja
Latar belakang: MySQL Online DDL memungkinkan operasi write, update, dan delete secara konkuren pada tabel target selama operasi DDL berlangsung. Modifikasi tersebut dicatat dalam row log. Tepat sebelum DDL selesai, mesin menerapkan row log untuk memperbarui file data baru. Jika tabel memiliki indeks unik dan terjadi konflik kunci unik dalam perubahan yang dihasilkan selama operasi DDL, penerapan row log gagal sehingga seluruh operasi DDL gagal. Karena penerapan row log terjadi tepat sebelum DDL selesai, kegagalan pada tahap ini sangat merugikan.
Ikhtisar: ApsaraDB RDS for MySQL mengoptimalkan perilaku ini. Dengan optimasi ini diaktifkan, konflik kunci unik yang terjadi selama Online DDL tidak menyebabkan operasi DDL gagal.
Catatan penggunaan
Untuk mengaktifkan optimasi konflik kunci unik DDL, instans basis data Anda harus memenuhi salah satu persyaratan versi berikut. Jika instans Anda tidak memenuhi persyaratan ini, upgrade the major engine version atau upgrade the minor engine version.
MySQL 8.4
MySQL 8.0 dengan versi mesin minor 20250531 atau lebih baru
Batasan berikut berlaku saat Anda menggunakan optimasi konflik kunci unik DDL:
Operasi DDL yang mengubah primary key tidak didukung.
Konflik pada indeks unik yang dibuat selama operasi DDL tidak didukung.
Fitur ini tidak mendukung indeks unik yang berisi kolom virtual atau indeks unik multi-nilai.
Manajemen parameter
Parameter
Anda dapat mengaktifkan atau menonaktifkan optimasi konflik kunci unik DDL dengan mengatur parameter innodb_online_alter_ignore_dup_key_error_for_uk.
Parameter | Description |
|
|
Modify the parameter
Buka halaman Instances. Pada bilah navigasi atas, pilih wilayah tempat instans RDS berada. Lalu, temukan instans RDS tersebut dan klik ID-nya.
Pada panel navigasi, klik parameter settings.
Pada tab editable parameters, temukan parameter tersebut dan atur nilainya.
Klik OK, lalu klik submit parameters. Pada kotak dialog yang muncul, pilih kapan perubahan tersebut berlaku.
Verifikasi fitur
Prosedur pengujian
Ikuti langkah-langkah berikut untuk menguji perilaku eksekusi DDL ketika optimasi konflik kunci unik DDL diaktifkan dan dinonaktifkan:
Buat tabel dengan kunci unik dan masukkan data.
-- Buat tabel dengan kunci unik CREATE DATABASE IF NOT EXISTS test_db; USE test_db; DROP TABLE IF EXISTS unique_test; CREATE TABLE unique_test ( id INT AUTO_INCREMENT PRIMARY KEY, user_id VARCHAR(50) NOT NULL, name VARCHAR(100), UNIQUE KEY uk_user_id (user_id) ); -- Masukkan data awal (misalnya, 2.000.000 baris) DELIMITER $$ DROP PROCEDURE IF EXISTS insert_initial_data $$ CREATE PROCEDURE insert_initial_data(IN num_rows INT) BEGIN DECLARE i INT DEFAULT 1; START TRANSACTION; WHILE i <= num_rows DO SET @uid = CONCAT('user_', i); SET @name = CONCAT('Name_', i); INSERT INTO unique_test (user_id, name) VALUES (@uid, @name); SET i = i + 1; END WHILE; COMMIT; END $$ DELIMITER ; CALL insert_initial_data(2000000);Jalankan sesi dan terus-menerus masukkan nilai duplikat untuk memicu konflik kunci unik.
USE test_db; DELIMITER $$ DROP PROCEDURE IF EXISTS insert_duplicate_loop $$ CREATE PROCEDURE insert_duplicate_loop( IN loop_count INT ) BEGIN DECLARE i INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR 1062 BEGIN END; -- Abaikan error kunci duplikat WHILE i < loop_count DO -- Coba masukkan user_id yang sudah ada untuk memicu konflik kunci unik INSERT INTO unique_test (user_id, name) VALUES ('user_1', 'ConflictUser'); SET i = i + 1; END WHILE; END $$ DELIMITER ; -- Ulangi 100.000 kali untuk memasukkan duplikat CALL insert_duplicate_loop(100000);Jalankan sesi lain untuk menguji perilaku eksekusi DDL dengan optimasi konflik kunci unik DDL diaktifkan dan dinonaktifkan.
ALTER TABLE test_db.unique_test ENGINE = InnoDB;
Hasil pengujian
Saat optimasi konflik kunci unik DDL dinonaktifkan, operasi DDL gagal dan mengembalikan error.
-- innodb_online_alter_ignore_dup_key_error_for_uk = OFF mysql> ALTER TABLE test_db.unique_test ENGINE = InnoDB; ERROR 1062 (23000): Duplicate entry 'user_1' for key 'unique_test.uk_user_id'Saat optimasi konflik kunci unik DDL diaktifkan, operasi DDL berhasil diselesaikan.
-- innodb_online_alter_ignore_dup_key_error_for_uk = ON mysql> ALTER TABLE test_db.unique_test ENGINE = InnoDB; Query OK, 0 rows affected (6.03 sec) Records: 0 Duplicates: 0 Warnings: 0