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, |
Instance utama |
| Memetakan definisi ke grup | CALL mysql.cloudsql_replica_idx_group_add(INDEX_DEFINITION_ID, 'GROUP_NAME');
|
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:
Buat definisi indeks pada instance utama:
Panggil prosedur tersimpan
mysql.cloudsql_replica_idx_defn_createpada 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_idyang ditampilkan (ID bilangan bulat unik untuk definisi) dari output prosedur. Cloud SQL menyimpan data ini dimysql.cloudsql_replica_idx_defn, dan Anda dapat mengambilidx_idnanti dengan mengkueri tabel ini.Tambahkan definisi indeks ke grup replika:
Petakan definisi indeks ke nama grup replika yang ditentukan dengan memanggil
mysql.cloudsql_replica_idx_group_addpada 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 tersimpanmysql.cloudsql_replica_idx_defn_createuntuk membuat indeks sekunder.GROUP_NAME: nama pemetaan grup replika (misalnya,reporting_group).GROUP_NAMEadalah 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.Tetapkan grup ke instance replika Anda:
Aktifkan grup yang ditetapkan pada replika baca dengan menetapkan flag database
cloudsql_index_recreate_replica_groupke nama grup Anda (misalnya,reporting_group).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 SQLCREATE INDEX.action: operasi yang sedang dilakukan (CREATEatauDROP).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_droppada 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_droppada 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:
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).
Buat definisi indeks baru di instance utama:
Panggil
mysql.cloudsql_replica_idx_defn_createdengan 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_idbaru yang ditampilkan dalam output prosedur tersimpan.Petakan definisi indeks baru ke grup replika:
Panggil
mysql.cloudsql_replica_idx_group_addpada 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 keon. Menetapkan flag keoffakan segera menghentikan operasi pemeliharaan indeks yang sedang berlangsung.cloudsql_index_recreate_replica_group: nama grup replika yang ditetapkan untuk replika (defaultnya adalahNULL). 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, gunakanUNIQUEuntuk membuat indeks unik.idxName: nama indeks.tableName: nama tabel dalam formatschema.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 opsiINVISIBLEuntuk 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 formatschema.name.idxOption: semua opsi tambahan yang akan digunakan saat menghapus indeks. Misalnya, opsi algoritma sepertiINPLACE.
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:
Daftarkan definisi indeks pada instance utama:
Panggil
mysql.cloudsql_replica_idx_defn_createdi 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_idyang ditampilkan (ID bilangan bulat unik untuk definisi) dari output prosedur.Tambahkan definisi indeks ke grup replika:
Petakan definisi indeks ke nama grup replika yang ditentukan dengan memanggil
mysql.cloudsql_replica_idx_group_addpada instance utama:CALL mysql.cloudsql_replica_idx_group_add (INDEX_DEFINITION_ID, 'REPLICA_GROUP');
Konfigurasikan flag grup replika pada replika baca:
Tetapkan flag database
cloudsql_index_recreate_replica_grouppada 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_groupsama persis dengan nama grup yang ditentukan dimysql.cloudsql_replica_idx_group_add.Verifikasi atau transisikan indeks yang ada:
Karena indeks sudah ada di replika baca, Anda mungkin melihat error dengan status
FAILEDdimysql.cloudsql_replica_idx_statussaat proses latar belakang mencoba membuat indeks. Anda dapat memilih salah satu pendekatan berikut:- Tunggu pembuatan ulang replika: Anda dapat mengabaikan status
FAILEDdi 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.
- Tunggu pembuatan ulang replika: Anda dapat mengabaikan status
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_enableditetapkan keonpada 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_statusatau jalankanCALL 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
- Pelajari lebih lanjut indeks replika baca.
- Pelajari cara mengelola replika baca.
- Pelajari cara membuat replika baca.
- Pelajari replikasi di Cloud SQL.
- Pelajari jeda replikasi.
- Pelajari cara mengonfigurasi flag database.
- Pelajari prosedur tersimpan untuk Cloud SQL untuk MySQL.
- Pelajari disaster recovery (DR) lanjutan.
- Pelajari cara terhubung menggunakan klien MySQL.