All Products
Search
Document Center

ApsaraDB RDS:Optimasi konflik kunci unik DDL

Last Updated:May 13, 2026

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

innodb_online_alter_ignore_dup_key_error_for_uk

  • Description: Mengaktifkan atau menonaktifkan optimasi konflik kunci unik DDL.

  • Scope: global parameter.

  • Data type: Boolean.

  • Default value: ON.

  • Valid values: ON atau OFF.

  • Restart required: No.

Modify the parameter

  1. Buka halaman Instances. Pada bilah navigasi atas, pilih wilayah tempat instans RDS berada. Lalu, temukan instans RDS tersebut dan klik ID-nya.

  2. Pada panel navigasi, klik parameter settings.

  3. Pada tab editable parameters, temukan parameter tersebut dan atur nilainya.

  4. 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:

  1. 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);
  2. 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);
  3. 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