Membuat dan mengelola indeks replika baca

Dokumen ini menjelaskan cara membuat, mengelola, dan memantau indeks sekunder pada replika baca Cloud SQL.

Untuk mengetahui informasi konseptual tentang cara kerja indeks replika terkelola, lihat Ringkasan indeks replika baca.

Indeks replika terkelola

Tabel berikut merangkum alur kerja untuk membuat, mengonfigurasi, dan memantau indeks replika terkelola:

Langkah Prosedur tersimpan atau flag database Tempat melakukan langkah
Membuat definisi indeks CALL mysql.cloudsql_replica_idx_defn_create('INDEX_DEFINITION_NAME', 'CREATE_INDEX_STATEMENT');

Prosedur tersimpan ini menampilkan ID bilangan bulat unik untuk definisi indeks, INDEX_DEFINITION_ID.

Instance utama
Memetakan definisi ke grup CALL mysql.cloudsql_replica_idx_group_add(INDEX_DEFINITION_ID, 'GROUP_NAME');

GROUP_NAME adalah nama kustom yang dapat Anda pilih. Jika grup tersebut tidak ada, Cloud SQL akan membuat grup baru.

Instance utama
Menetapkan grup ke replika Flag database: cloudsql_index_recreate_replica_group = GROUP_NAME Instance replika baca
Periksa status CALL mysql.cloudsql_replica_idx_show_status(); Instance replika baca
Error audit CALL mysql.cloudsql_replica_idx_show_errors(); Instance replika baca

Setiap panggilan prosedur tersimpan menjalankan pernyataan COMMIT yang menyelesaikan perubahan dalam sesi Anda saat ini. Akibatnya, pernyataan bahasa pengolahan data (DML) yang dijalankan menggunakan prosedur tersimpan ini tidak dapat di-roll back dalam transaksi.

Cloud SQL tidak mendukung pembaruan atau pengubahan metadata indeks yang ada. Untuk mengubah indeks replika terkelola, Anda harus menghapus definisi indeks yang ada (atau menghapusnya dari grup replika) dan membuat definisi indeks baru. Untuk mengetahui informasi selengkapnya, lihat Mengubah indeks replika terkelola.

Peran dan hak istimewa yang diperlukan

Anda harus menggunakan akun pengguna database yang diberi peran cloudsqlsuperuser untuk menjalankan prosedur tersimpan untuk indeks replika terkelola.

Membuat indeks replika terkelola

Untuk membuat dan mengelola indeks replika terkelola pada replika baca, ikuti langkah-langkah berikut:

  1. Buat definisi indeks pada instance utama:

    Panggil prosedur tersimpan mysql.cloudsql_replica_idx_defn_create pada instance utama database Anda:

    CALL mysql.cloudsql_replica_idx_defn_create
    ('INDEX_DEFINITION_NAME', 'CREATE_INDEX_STATEMENT');

    Ganti kode berikut:

    • INDEX_DEFINITION_NAME: nama definisi indeks.
    • CREATE_INDEX_STATEMENT: pernyataan SQL yang membuat indeks sekunder (misalnya, CREATE INDEX idx_age ON university.students (age)). Perhatikan bahwa pernyataan ini harus diawali dengan skema.

    Catat idx_id yang ditampilkan (ID bilangan bulat unik untuk definisi) dari output prosedur. Cloud SQL menyimpan data ini di mysql.cloudsql_replica_idx_defn, dan Anda dapat mengambil idx_id nanti dengan mengkueri tabel ini.

  2. Tambahkan definisi indeks ke grup replika:

    Petakan definisi indeks ke nama grup replika yang ditentukan dengan memanggil mysql.cloudsql_replica_idx_group_add pada instance utama:

    CALL mysql.cloudsql_replica_idx_group_add
    (INDEX_DEFINITION_ID, 'GROUP_NAME');

    Ganti kode berikut:

    • INDEX_DEFINITION_ID: ID bilangan bulat unik yang ditampilkan saat Anda menjalankan prosedur tersimpan mysql.cloudsql_replica_idx_defn_create untuk membuat indeks sekunder.
    • GROUP_NAME: nama pemetaan grup replika (misalnya, reporting_group). GROUP_NAME adalah nama kustom yang dapat Anda pilih. Jika grup tersebut tidak ada, Cloud SQL akan membuat grup baru.

    Cloud SQL menyimpan data ini di mysql.cloudsql_replica_idx_group_map, dan Anda dapat mengambil pemetaan grup nanti dengan mengkueri tabel ini.

  3. Tetapkan grup ke instance replika Anda:

    Aktifkan grup yang ditetapkan pada replika baca dengan menetapkan flag database cloudsql_index_recreate_replica_group ke nama grup Anda (misalnya, reporting_group).

  4. Verifikasi progres pemulihan:

    Hubungkan ke instance replika baca, lalu periksa progres pembuatan dan status indeks Anda.

    • Memeriksa progres pembuatan indeks yang sedang berlangsung:

      CALL mysql.cloudsql_replica_idx_show_status();
      
    • Periksa upaya yang gagal dan pesan error:

      CALL mysql.cloudsql_replica_idx_show_errors();
      
    • Mencantumkan status, detail percobaan ulang, dan durasi untuk semua indeks terkelola:

      CALL mysql.cloudsql_replica_idx_show_all();
      

Memeriksa status indeks replika terkelola

Untuk memeriksa status operasi indeks, hubungkan ke instance replika baca dan buat kueri tabel mysql.cloudsql_replica_idx_status:

SELECT * FROM mysql.cloudsql_replica_idx_status;

Outputnya mirip dengan hal berikut ini:

+--------+----------------------------------------------------+--------+-----------+---------------------+---------------------+-------------+---------+--------------------+---------+
| idx_id | create_stmt                                        | action | thread_id | start_time          | end_time            | retry_count | err_msg | comment_tag        | status  |
+--------+----------------------------------------------------+--------+-----------+---------------------+---------------------+-------------+---------+--------------------+---------+
|      2 | CREATE INDEX t1_fname ON sampletest.t1(first_name) | CREATE |      8140 | 2026-08-26 10:52:13 | NULL                |           0 | NULL    | [SIC_4_1787741231] | RUNNING |
|      4 | CREATE INDEX t2_lname ON sampletest.t2(last_name)  | DROP   |      NULL | 2026-08-26 10:52:13 | 2026-08-26 10:53:15 |           0 | NULL    | [SIC_4_1787741533] | DONE    |
|      5 | CREATE INDEX t1_lname ON sampletest.t1(last_name)  | CREATE |      8142 | 2026-08-26 10:53:14 | NULL                |           0 | NULL    | [SIC_5_1787741594] | RUNNING |
+--------+----------------------------------------------------+--------+-----------+---------------------+---------------------+-------------+---------+--------------------+---------+

Cloud SQL melakukan pemeliharaan indeks replika terkelola dalam batch. Saat Cloud SQL mengambil sekelompok tindakan CREATE atau DROP, Cloud SQL akan membuat entri status PENDING untuk setiap indeks, lalu menjalankan setiap pernyataan bahasa definisi data (DDL) secara serial. Kegagalan pada satu indeks tidak akan memblokir eksekusi indeks berikutnya dalam antrean. Cloud SQL kemudian mengambil batch berikutnya setelah sekitar lima menit.

Jika pembuatan indeks gagal, Cloud SQL akan menandai statusnya sebagai FAILED dan otomatis mencoba kembali operasi setelah satu jam.

Tabel mysql.cloudsql_replica_idx_status berisi semua entri status operasi indeks dan mencakup kolom berikut:

  • idx_id: ID bilangan bulat unik untuk definisi indeks.
  • create_stmt: pernyataan SQL CREATE INDEX.
  • action: operasi yang sedang dilakukan (CREATE atau DROP).
  • thread_id: ID thread MySQL yang menjalankan operasi.
  • start_time: stempel waktu saat operasi dimulai.
  • end_time: stempel waktu saat operasi selesai.
  • retry_count: jumlah upaya percobaan ulang untuk operasi. Cloud SQL akan mencoba kembali pembuatan indeks yang gagal setelah satu jam.
  • err_msg: pesan error dari operasi terakhir yang gagal.
  • comment_tag: tag [SIC_X_Y] yang ditambahkan ke komentar indeks. Tag ini hanya digunakan untuk pengelolaan internal dan tidak memiliki fungsi.
  • status: status operasi saat ini:
    • PENDING: operasi indeks telah ditambahkan ke antrean.
    • RUNNING: eksekusi operasi indeks telah dimulai.
    • DONE: operasi indeks berhasil diselesaikan.
    • FAILED: operasi indeks gagal. Cloud SQL akan mencoba kembali pembuatan indeks yang gagal setelah satu jam.

Menghapus indeks replika terkelola

Untuk menghapus indeks dari grup replika atau menghapus definisi indeks sepenuhnya, panggil prosedur tersimpan yang sesuai di instance utama Anda:

  • Menghapus definisi indeks dari grup replika:

    Panggil mysql.cloudsql_replica_idx_group_drop pada instance utama:

    CALL mysql.cloudsql_replica_idx_group_drop
    (INDEX_DEFINITION_ID, 'GROUP_NAME');

    Ganti kode berikut:

    • INDEX_DEFINITION_ID: ID bilangan bulat unik yang ditampilkan saat Anda membuat definisi indeks sekunder.
    • GROUP_NAME: nama pemetaan grup replika (misalnya, reporting_group).
  • Menghapus definisi indeks:

    Panggil mysql.cloudsql_replica_idx_defn_drop pada instance utama:

    CALL mysql.cloudsql_replica_idx_defn_drop
    (INDEX_DEFINITION_ID);

    Ganti kode berikut:

    • INDEX_DEFINITION_ID: ID bilangan bulat unik dari definisi indeks yang akan dihapus.

Untuk mengetahui informasi selengkapnya tentang prosedur tersimpan, lihat Prosedur tersimpan indeks replika terkelola.

Mengubah indeks replika terkelola

Cloud SQL tidak mendukung pembaruan atau pengubahan metadata indeks yang ada. Anda tidak dapat mengubah definisi indeks yang ada atau pernyataan SQL-nya secara langsung.

Untuk mengubah indeks replika terkelola (misalnya, untuk mengubah kolom yang diindeks atau opsi indeks), Anda harus menghapus definisi indeks yang ada, lalu membuat definisi indeks baru.

Untuk mengubah indeks replika terkelola, ikuti langkah-langkah berikut:

  1. Hapus definisi indeks yang ada di instance utama:

    • Untuk menghapus definisi indeks dari grup replika, panggil mysql.cloudsql_replica_idx_group_drop:

      CALL mysql.cloudsql_replica_idx_group_drop
      (INDEX_DEFINITION_ID, 'GROUP_NAME');
    • Untuk menghapus definisi indeks sepenuhnya, panggil mysql.cloudsql_replica_idx_defn_drop:

      CALL mysql.cloudsql_replica_idx_defn_drop
      (INDEX_DEFINITION_ID);

    Ganti kode berikut:

    • INDEX_DEFINITION_ID: ID bilangan bulat unik dari definisi indeks yang akan dihapus.
    • GROUP_NAME: nama pemetaan grup replika (misalnya, reporting_group).
  2. Buat definisi indeks baru di instance utama:

    Panggil mysql.cloudsql_replica_idx_defn_create dengan pernyataan indeks yang diperbarui:

    CALL mysql.cloudsql_replica_idx_defn_create
    ('INDEX_DEFINITION_NAME', 'CREATE_INDEX_STATEMENT');

    Ganti kode berikut:

    • INDEX_DEFINITION_NAME: nama definisi indeks baru.
    • CREATE_INDEX_STATEMENT: pernyataan SQL yang diperbarui yang membuat indeks sekunder (misalnya, CREATE INDEX idx_age ON university.students (age, name)).

    Catat idx_id baru yang ditampilkan dalam output prosedur tersimpan.

  3. Petakan definisi indeks baru ke grup replika:

    Panggil mysql.cloudsql_replica_idx_group_add pada instance utama:

    CALL mysql.cloudsql_replica_idx_group_add
    (INDEX_DEFINITION_ID, 'GROUP_NAME');

    Ganti kode berikut:

    • INDEX_DEFINITION_ID: ID bilangan bulat unik baru yang ditampilkan di langkah 2.
    • GROUP_NAME: nama pemetaan grup replika (misalnya, reporting_group).

Setelah Anda memetakan definisi indeks baru ke grup replika, proses pemeliharaan latar belakang akan menghapus indeks yang ada dari replika baca, lalu membuat indeks baru pada replika menggunakan definisi yang telah diupdate.

Flag konfigurasi database untuk indeks replika terkelola

Anda dapat menyesuaikan perilaku indeks replika terkelola secara dinamis menggunakan flag database global berikut:

  • cloudsql_index_recreate_enable: mengaktifkan atau menonaktifkan proses pembuatan ulang. Secara default, flag ditetapkan ke on. Menetapkan flag ke off akan segera menghentikan operasi pemeliharaan indeks yang sedang berlangsung.

  • cloudsql_index_recreate_replica_group: nama grup replika yang ditetapkan untuk replika (defaultnya adalah NULL). Replika hanya dapat ditetapkan ke satu grup replika dalam satu waktu. Replika membangun semua indeks yang dipetakan ke nama grup replika ini.

Indeks replika yang dikelola sendiri

Cloud SQL menyertakan dua prosedur tersimpan dalam skema mysql yang dapat Anda gunakan untuk menambahkan dan menghapus indeks sekunder pada replika baca MySQL. Perlu diingat bahwa meskipun dapat berjalan pada instance sumber utama, prosedur tersimpan ini dirancang untuk replika baca.

Indeks ini tidak akan dipertahankan jika replika dibuat ulang.

mysql.addSecondaryIdxOnReplica
Menambahkan indeks sekunder pada database. Prosedur tersimpan ini adalah sebuah wrapper untuk pernyataan DDL BUAT INDEX.

Parameter:

  • idxType: jenis indeks yang akan dibuat. Misalnya, gunakan UNIQUE untuk membuat indeks unik.
  • idxName: nama indeks.
  • tableName: nama tabel dalam format schema.name.
  • idxDefinition: definisi indeks. Jangan sertakan tanda kurung bagian luar.
  • idxOption: semua opsi tambahan yang akan digunakan pada pembuatan indeks. Misalnya, di MySQL 8.0, Anda dapat meneruskan opsi INVISIBLE untuk indeks tak terlihat.

Sintaksis:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
Menghapus indeks sekunder pada database. Prosedur tersimpan ini adalah sebuah wrapper untuk pernyataan DDL HAPUS INDEX.

Parameter:

  • idxName: nama indeks.
  • tableName: nama tabel dalam format schema.name.
  • idxOption: semua opsi tambahan yang akan digunakan saat menghapus indeks. Misalnya, opsi algoritma seperti INPLACE.

Sintaksis:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

Untuk parameter idxType dan idxOption, merujuklah pada dokumentasi untuk mengetahui versi utama MySQL yang berjalan di instance Cloud SQL.

Contoh

Bagian ini memberikan contoh cara menambahkan atau menghapus indeks replika yang dikelola sendiri dengan benar atau salah.

Penggunaan yang benar

Berikut adalah beberapa contoh pemanggilan prosedur. Misalkan Anda memiliki tabel dengan definisi berikut:

CREATE TABLE sampletest.t1(
   id int(10) unsigned NOT NULL AUTO_INCREMENT,
   first_name varchar(64) NOT NULL,
   last_name varchar(64) NOT NULL,
   license_id int NOT NULL,
   PRIMARY KEY (id),
   KEY idx_fname (first_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Jika Anda ingin membuat indeks reguler bernama t1_fname_lname pada kolom first_name dan last_name, jalankan pernyataan berikut:

CALL mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')

Jika Anda juga ingin membuat indeks unik bernama t1_license_id pada kolom license_id dengan komentar "ID lisensi unik", jalankan pernyataan berikut:

CALL mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment "unique license ID"')

Jika Anda ingin menghapus indeks t1_fname_lname, jalankan pernyataan berikut:

CALL mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')

Penggunaan yang salah

Upaya berikut untuk membuat indeks di kolom first_name dan last_name gagal karena tanda kurung luar dalam parameter idxDefinition:

CALL mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')

Anda hanya dapat menambahkan indeks pada tabel yang dibuat pelanggan. Upaya berikut untuk membuat indeks di kolom host pada tabel mysql.servers akan gagal:

CALL mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')

Anda hanya dapat menggunakan prosedur dropSecondaryIdxOnReplica untuk menghapus indeks yang pernah dibuat sebelumnya menggunakan prosedur addSecondaryIdxOnReplica. Misalnya, panggilan berikut untuk menghapus indeks idx_fname yang sudah ada akan gagal:

CALL mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')

Injeksi SQL dalam panggilan prosedur ini akan gagal. Misalnya, injeksi SQL berikut dengan urutan komentar akan gagal:

CALL mysql.addSecondaryIdxOnReplica("user 'a'@'%' --", 'idx_fname', 'sampletest.t1', 'first_name', '')

Begitu pula dengan upaya injeksi SQL dengan pembatas akan gagal:

CALL mysql.addSecondaryIdxOnReplica('', 'idx_fname', 'sampletest.t1', 'first_name', ';flush status')

Bermigrasi dari indeks replika yang dikelola sendiri ke indeks replika terkelola

Meskipun indeks replika terkelola dan indeks replika yang dikelola sendiri dapat berdampingan di instance yang sama, Anda dapat bermigrasi ke indeks replika terkelola.

Untuk bermigrasi dari indeks replika yang dikelola sendiri ke indeks replika terkelola, ikuti langkah-langkah berikut:

  1. Daftarkan definisi indeks pada instance utama:

    Panggil mysql.cloudsql_replica_idx_defn_create di instance utama Anda untuk setiap indeks sekunder:

    CALL mysql.cloudsql_replica_idx_defn_create
    ('INDEX_DEFINITION_NAME',
    'CREATE INDEX INDEX_NAME ON DATABASE.TABLE (COLUMNS)');

    Catat idx_id yang ditampilkan (ID bilangan bulat unik untuk definisi) dari output prosedur.

  2. Tambahkan definisi indeks ke grup replika:

    Petakan definisi indeks ke nama grup replika yang ditentukan dengan memanggil mysql.cloudsql_replica_idx_group_add pada instance utama:

    CALL mysql.cloudsql_replica_idx_group_add
    (INDEX_DEFINITION_ID, 'REPLICA_GROUP');
  3. Konfigurasikan flag grup replika pada replika baca:

    Tetapkan flag database cloudsql_index_recreate_replica_group pada instance replika baca Anda untuk menargetkan nama grup:

    gcloud sql instances patch REPLICA_INSTANCE_NAME \
    --database-flags=EXISTING_FLAGS,cloudsql_index_recreate_replica_group=REPLICA_GROUP

    Pastikan nama grup yang diberikan dalam flag database cloudsql_index_recreate_replica_group sama persis dengan nama grup yang ditentukan di mysql.cloudsql_replica_idx_group_add.

  4. Verifikasi atau transisikan indeks yang ada:

    Karena indeks sudah ada di replika baca, Anda mungkin melihat error dengan status FAILED di mysql.cloudsql_replica_idx_status saat proses latar belakang mencoba membuat indeks. Anda dapat memilih salah satu pendekatan berikut:

    • Tunggu pembuatan ulang replika: Anda dapat mengabaikan status FAILED di tabel status dengan aman. Cloud SQL otomatis membuat ulang indeks sekunder menggunakan metode indeks replika terkelola setelah peristiwa pembuatan ulang replika.
    • Transisi segera: jika Anda ingin Cloud SQL segera mengelola indeks tanpa menunggu pembuatan ulang replika, hubungkan ke replika baca dan hapus indeks yang dikelola sendiri menggunakan prosedur tersimpan mysql.dropSecondaryIdxOnReplica:

      CALL mysql.dropSecondaryIdxOnReplica('INDEX_NAME', 'DATABASE.TABLE', '');

      Selama siklus pemeliharaan latar belakang berikutnya (kira-kira setiap lima menit), Cloud SQL akan otomatis membuat ulang dan melacak indeks replika terkelola.

Memecahkan masalah indeks replika

Untuk memecahkan masalah indeks replika, pastikan hal berikut:

  • Pastikan indeks replika terkelola diaktifkan untuk instance replika:

    Jika Anda menggunakan indeks replika terkelola, pastikan flag database cloudsql_index_recreate_enable ditetapkan ke on pada replika baca.

    Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi flag database, lihat Mengonfigurasi flag database.

  • Memeriksa status operasi dan error:

    Hubungkan ke replika baca dan buat kueri mysql.cloudsql_replica_idx_status atau jalankan CALL mysql.cloudsql_replica_idx_show_errors(); untuk melihat pesan error untuk setiap operasi yang gagal. Kegagalan pada satu indeks tidak akan memblokir eksekusi indeks berikutnya dalam antrean.

Langkah berikutnya