In diesem Dokument wird beschrieben, wie Sie sekundäre Indexe für Cloud SQL-Lesereplikate erstellen, verwalten und überwachen.
Konzeptionelle Informationen zur Funktionsweise von verwalteten Replikatindexen finden Sie unter Übersicht über Lesereplikatindexe.
Verwaltete Replikatindexe
In der folgenden Tabelle ist der Workflow zum Erstellen, Konfigurieren und Überwachen von verwalteten Replikatindexen zusammengefasst:
| Schritt | Gespeicherte Prozedur oder Datenbank-Flag | Wo der Schritt ausgeführt werden soll |
|---|---|---|
| Indexdefinition erstellen | CALL mysql.cloudsql_replica_idx_defn_create('INDEX_DEFINITION_NAME', 'CREATE_INDEX_STATEMENT');
Diese gespeicherte Prozedur gibt eine eindeutige Ganzzahl-ID für die Indexdefinition |
Primäre Instanz |
| Definition einer Gruppe zuordnen | CALL mysql.cloudsql_replica_idx_group_add(INDEX_DEFINITION_ID, 'GROUP_NAME');
|
Primäre Instanz |
| Gruppe dem Replikat zuweisen | Datenbank-Flag: cloudsql_index_recreate_replica_group = GROUP_NAME |
Lesereplikatinstanz |
| Status prüfen | CALL mysql.cloudsql_replica_idx_show_status(); |
Lesereplikatinstanz |
| Prüfungsfehler | CALL mysql.cloudsql_replica_idx_show_errors(); |
Lesereplikatinstanz |
Bei jedem Aufruf einer gespeicherten Prozedur wird eine COMMIT-Anweisung ausgeführt, mit der die Änderungen in der aktuellen Sitzung abgeschlossen werden. Daher können DML-Anweisungen (Datenbearbeitungssprache), die mit diesen gespeicherten Prozeduren ausgeführt werden, nicht innerhalb einer Transaktion rückgängig gemacht werden.
Cloud SQL unterstützt nicht das Aktualisieren oder Ändern vorhandener Indexmetadaten. Wenn Sie einen verwalteten Replikatindex ändern möchten, müssen Sie die vorhandene Indexdefinition löschen (oder aus der Replikatgruppe entfernen) und eine neue Indexdefinition erstellen. Weitere Informationen finden Sie unter Verwaltete Replikatindexe ändern.
Erforderliche Rolle und Berechtigungen
Sie müssen ein Datenbanknutzerkonto verwenden, dem die Rolle cloudsqlsuperuser zugewiesen ist, um gespeicherte Prozeduren für verwaltete Replikatindexe auszuführen.
Verwaltete Replikatindexe erstellen
So erstellen und verwalten Sie verwaltete Replikatindexe auf Ihren Lesereplikaten:
Erstellen Sie eine Indexdefinition auf der primären Instanz:
Rufen Sie die gespeicherte Prozedur
mysql.cloudsql_replica_idx_defn_createauf der primären Instanz Ihrer Datenbank auf:CALL mysql.cloudsql_replica_idx_defn_create ('INDEX_DEFINITION_NAME', 'CREATE_INDEX_STATEMENT');
Ersetzen Sie Folgendes:
INDEX_DEFINITION_NAME: der Name der Indexdefinition.CREATE_INDEX_STATEMENT: die SQL-Anweisung, die den sekundären Index erstellt (z. B.CREATE INDEX idx_age ON university.students (age)). Beachten Sie, dass diese Anweisung ein Schema-Präfix haben muss.
Notieren Sie sich die zurückgegebene
idx_id(eine eindeutige Ganzzahlkennung für die Definition) aus der Ausgabe des Verfahrens. Cloud SQL speichert diese Daten inmysql.cloudsql_replica_idx_defn. Sie können dieidx_idspäter abrufen, indem Sie diese Tabelle abfragen.Indexdefinition zu einer Replikatgruppe hinzufügen:
Ordnen Sie die Indexdefinition einem bestimmten Replikatgruppennamen zu, indem Sie
mysql.cloudsql_replica_idx_group_addauf der primären Instanz aufrufen:CALL mysql.cloudsql_replica_idx_group_add (INDEX_DEFINITION_ID, 'GROUP_NAME');
Ersetzen Sie Folgendes:
INDEX_DEFINITION_ID: die eindeutige Ganzzahl-ID, die zurückgegeben wurde, als Sie die gespeicherte Prozedurmysql.cloudsql_replica_idx_defn_createausgeführt haben, um den sekundären Index zu erstellen.GROUP_NAME: der Name der Replikationsgruppenzuordnung (z. B.reporting_group).GROUP_NAMEist ein benutzerdefinierter Name, den Sie auswählen können. Wenn diese Gruppe nicht vorhanden ist, erstellt Cloud SQL eine neue.
Cloud SQL speichert diese Daten in
mysql.cloudsql_replica_idx_group_map. Sie können die Gruppenzuordnungen später durch Abfragen dieser Tabelle abrufen.Weisen Sie die Gruppe Ihrer Replikatinstanz zu:
Aktivieren Sie die festgelegte Gruppe auf Ihrem Lesereplikat, indem Sie das Datenbank-Flag
cloudsql_index_recreate_replica_groupauf den Namen Ihrer Gruppe festlegen (z. B.reporting_group).Prüfen Sie den Fortschritt der Wiederherstellung:
Stellen Sie eine Verbindung zu Ihrer Lesereplikatinstanz her und prüfen Sie den Erstellungsfortschritt und den Status Ihrer Indexe.
So prüfen Sie den Fortschritt der Indexerstellung:
CALL mysql.cloudsql_replica_idx_show_status();Fehlgeschlagene Versuche und Fehlermeldungen prüfen:
CALL mysql.cloudsql_replica_idx_show_errors();Listen Sie den Status, die Wiederholungsdetails und die Dauer für alle verwalteten Indexe auf:
CALL mysql.cloudsql_replica_idx_show_all();
Status des verwalteten Replikatindex prüfen
Wenn Sie den Status des Indexvorgangs prüfen möchten, stellen Sie eine Verbindung zu Ihrer Lesereplikatinstanz her und fragen Sie die Tabelle mysql.cloudsql_replica_idx_status ab:
SELECT * FROM mysql.cloudsql_replica_idx_status;
Die Ausgabe sieht etwa so aus:
+--------+----------------------------------------------------+--------+-----------+---------------------+---------------------+-------------+---------+--------------------+---------+ | 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 führt die Indexwartung für verwaltete Replikate in Batches durch. Wenn Cloud SQL eine Gruppe von CREATE- oder DROP-Aktionen aufnimmt, wird für jeden Index ein PENDING-Statuseintrag erstellt und dann jede DDL-Anweisung (Data Definition Language) nacheinander ausgeführt. Ein Fehler bei einem Index blockiert nicht die Ausführung nachfolgender Indexe in der Warteschlange.
Cloud SQL ruft dann nach etwa fünf Minuten den nächsten Batch ab.
Wenn die Indexerstellung fehlschlägt, markiert Cloud SQL den Status als FAILED und wiederholt den Vorgang nach einer Stunde automatisch.
Die Tabelle mysql.cloudsql_replica_idx_status enthält alle Statuseinträge für Indexvorgänge und die folgenden Spalten:
idx_id: die eindeutige Ganzzahl-ID für die Indexdefinition.create_stmt: die SQL-AnweisungCREATE INDEX.action: der ausgeführte Vorgang (CREATEoderDROP).thread_id: Die MySQL-Thread-ID, die den Vorgang ausführt.start_time: der Zeitstempel, der angibt, wann der Vorgang gestartet wurde.end_time: der Zeitstempel, der angibt, wann der Vorgang abgeschlossen wurde.retry_count: die Anzahl der Wiederholungsversuche für den Vorgang. Cloud SQL versucht nach einer Stunde noch einmal, fehlgeschlagene Indexerstellungen auszuführen.err_msg: die Fehlermeldung des letzten fehlgeschlagenen Vorgangs.comment_tag: Das Tag[SIC_X_Y], das dem Indexkommentar vorangestellt wird. Dieses Tag wird nur für die interne Verwaltung verwendet und hat keine Funktion.status: der aktuelle Status des Vorgangs:PENDING: Der Indexvorgang wurde der Warteschlange hinzugefügt.RUNNING: Die Ausführung des Indexvorgangs hat begonnen.DONE: Der Indexvorgang wurde erfolgreich abgeschlossen.FAILED: Der Indexvorgang ist fehlgeschlagen. Cloud SQL wiederholt fehlgeschlagene Indexerstellungen nach einer Stunde.
Verwaltete Replikatsindexe löschen
Wenn Sie einen Index aus einer Replikatgruppe entfernen oder eine Indexdefinition vollständig löschen möchten, rufen Sie die entsprechende gespeicherte Prozedur auf Ihrer primären Instanz auf:
Indexdefinition aus einer Replikationsgruppe entfernen:
Rufen Sie
mysql.cloudsql_replica_idx_group_dropfür die primäre Instanz auf:CALL mysql.cloudsql_replica_idx_group_drop (INDEX_DEFINITION_ID, 'GROUP_NAME');
Ersetzen Sie Folgendes:
INDEX_DEFINITION_ID: Die eindeutige Ganzzahl-ID, die beim Erstellen der sekundären Indexdefinition zurückgegeben wurde.GROUP_NAME: der Name der Zuordnung der Replikatgruppe (z. B.reporting_group).
Indexdefinition löschen:
Rufen Sie
mysql.cloudsql_replica_idx_defn_dropfür die primäre Instanz auf:CALL mysql.cloudsql_replica_idx_defn_drop (INDEX_DEFINITION_ID);
Ersetzen Sie Folgendes:
INDEX_DEFINITION_ID: die eindeutige Ganzzahl-ID der zu löschenden Indexdefinition.
Weitere Informationen zu gespeicherten Prozeduren finden Sie unter Gespeicherte Prozeduren für verwaltete Replikatindexe.
Verwaltete Replikatindexe ändern
Cloud SQL unterstützt nicht das Aktualisieren oder Ändern vorhandener Indexmetadaten. Sie können eine vorhandene Indexdefinition oder die zugehörige SQL-Anweisung nicht direkt ändern.
Wenn Sie einen verwalteten Replikatindex ändern möchten (z. B. um indexierte Spalten oder Indexoptionen zu ändern), müssen Sie die vorhandene Indexdefinition entfernen oder löschen und dann eine neue Indexdefinition erstellen.
So ändern Sie einen verwalteten Replikatindex:
Entfernen oder löschen Sie die vorhandene Indexdefinition auf der primären Instanz:
Rufen Sie
mysql.cloudsql_replica_idx_group_dropauf, um die Indexdefinition aus einer Replikatgruppe zu entfernen:CALL mysql.cloudsql_replica_idx_group_drop (INDEX_DEFINITION_ID, 'GROUP_NAME');
Wenn Sie die Indexdefinition vollständig löschen möchten, rufen Sie
mysql.cloudsql_replica_idx_defn_dropauf:CALL mysql.cloudsql_replica_idx_defn_drop (INDEX_DEFINITION_ID);
Ersetzen Sie Folgendes:
INDEX_DEFINITION_ID: die eindeutige Ganzzahl-ID der Indexdefinition, die entfernt oder gelöscht werden soll.GROUP_NAME: der Name der Zuordnung der Replikatgruppe (z. B.reporting_group).
Erstellen Sie eine neue Indexdefinition auf der primären Instanz:
Rufen Sie
mysql.cloudsql_replica_idx_defn_createmit der aktualisierten Indexanweisung auf:CALL mysql.cloudsql_replica_idx_defn_create ('INDEX_DEFINITION_NAME', 'CREATE_INDEX_STATEMENT');
Ersetzen Sie Folgendes:
INDEX_DEFINITION_NAME: der Name der neuen Indexdefinition.CREATE_INDEX_STATEMENT: die aktualisierte SQL-Anweisung, mit der der sekundäre Index erstellt wird, z. B.CREATE INDEX idx_age ON university.students (age, name).
Notieren Sie sich den neuen
idx_id, der in der Ausgabe der gespeicherten Prozedur zurückgegeben wird.Neue Indexdefinition der Replikatgruppe zuordnen:
Rufen Sie
mysql.cloudsql_replica_idx_group_addfür die primäre Instanz auf:CALL mysql.cloudsql_replica_idx_group_add (INDEX_DEFINITION_ID, 'GROUP_NAME');
Ersetzen Sie Folgendes:
INDEX_DEFINITION_ID: die neue eindeutige Ganzzahl-ID, die in Schritt 2 zurückgegeben wurde.GROUP_NAME: der Name der Zuordnung der Replikatgruppe (z. B.reporting_group).
Nachdem Sie die neue Indexdefinition der Replikatgruppe zugeordnet haben, wird der vorhandene Index vom Hintergrundwartungsprozess aus dem Lesereplikat gelöscht und dann der neue Index auf dem Replikat mit der aktualisierten Definition erstellt.
Datenbankkonfigurations-Flags für verwaltete Replikatindexe
Sie können das Verhalten des verwalteten Replikatindex dynamisch mit den folgenden globalen Datenbank-Flags anpassen:
cloudsql_index_recreate_enable: Aktiviert oder deaktiviert den Neuerstellungsprozess. Standardmäßig ist das Flag aufongesetzt. Wenn Sie das Flag aufoffsetzen, werden laufende Indexwartungsvorgänge sofort beendet.cloudsql_index_recreate_replica_group: Name der zugewiesenen Replikatgruppe für das Replikat (Standard istNULL). Ein Replikat kann jeweils nur einer Replikatgruppe zugewiesen werden. Replikate erstellen alle Indexe, die diesem Replikatgruppennamen zugeordnet sind.
Selbstverwaltete Replikatindexe
Cloud SQL enthält zwei gespeicherte Prozeduren im mysql-Schema, mit denen Sie sekundäre Indexe auf einem MySQL-Lesereplikat hinzufügen und löschen können. Diese gespeicherten Prozeduren können zwar auf einer primären Quellinstanz ausgeführt werden, sind aber für Lesereplikate konzipiert.
Diese Indexe bleiben nicht erhalten, wenn das Replikat neu erstellt wird.
- mysql.addSecondaryIdxOnReplica
- Fügt Sie der Datenbank einen sekundären Index hinzu. Diese gespeicherte Prozedur ist ein Wrapper für die DDL-Anweisung CREATE INDEX.
Parameter:
idxType: Typ des zu erstellenden Index. Übergeben Sie beispielsweiseUNIQUE, um einen eindeutigen Index zu erstellen.idxName: Name des Index.tableName: Name der Tabelle im Formatschema.name.idxDefinition: Definition des Index. Geben Sie nicht die äußeren Klammern an.idxOption: Alle zusätzlichen Optionen, die bei der Indexerstellung übergeben werden sollen. In MySQL 8.0 können Sie beispielsweise die OptionINVISIBLEfür einen unsichtbaren Index übergeben.
Syntax:
mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption) - mysql.dropSecondaryIdxOnReplica
- Löscht einen sekundären Index für die Datenbank. Diese gespeicherte Prozedur ist ein Wrapper für die DDL-Anweisung DROP INDEX.
Parameter:
idxName: Name des Index.tableName: Name der Tabelle im Formatschema.name.idxOption: Alle zusätzlichen Optionen, die beim Löschen eines Index übergeben werden sollen. Beispiel: eine Algorithmusoption wieINPLACE.
Syntax:
mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
Informationen zu den Parametern idxType und idxOption finden Sie in der Dokumentation der Hauptversion von MySQL, die auf der Cloud SQL-Instanz ausgeführt wird.
Beispiele
In diesem Abschnitt finden Sie Beispiele dafür, wie Sie selbstverwaltete Replikatindexe richtig oder falsch hinzufügen oder löschen können.
Richtige Verwendung
Im Folgenden finden Sie einige Beispielaufrufe der Prozeduren. Angenommen, Sie haben eine Tabelle mit der folgenden Definition:
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
Wenn Sie einen regulären Index mit dem Namen t1_fname_lname für die Spalten first_name und last_name erstellen möchten, führen Sie die folgende Anweisung aus:
CALL mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')
Wenn Sie außerdem einen eindeutigen Index mit dem Namen t1_license_id für die Spalte license_id mit dem Kommentar „eindeutige Lizenz-ID“ erstellen möchten, führen Sie die folgende Anweisung aus:
CALL mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment "unique license ID"')
Wenn Sie den Index t1_fname_lname löschen möchten, führen Sie die folgende Anweisung aus:
CALL mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')
Falsche Verwendung
Der folgende Versuch, einen Index für die Spalten first_name und last_name zu erstellen, schlägt aufgrund der äußeren Klammern im Parameter idxDefinition fehl:
CALL mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')
Sie können nur Indizes zu vom Kunden erstellten Tabellen hinzufügen. Der folgende Versuch, einen Index für die Spalte host der Tabelle mysql.servers zu erstellen, schlägt fehl:
CALL mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')
Sie können die Prozedur dropSecondaryIdxOnReplica nur verwenden, um Indexe zu löschen, die zuvor mit der Prozedur addSecondaryIdxOnReplica erstellt wurden. Der folgende Aufruf zum Löschen des vorhandenen Index idx_fname schlägt beispielsweise fehl:
CALL mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')
SQL-Injection in diesen Prozeduraufrufen schlagen fehl. Die folgende SQL-Injection mit einer Kommentarsequenz schlägt beispielsweise fehl:
CALL mysql.addSecondaryIdxOnReplica("user 'a'@'%' --", 'idx_fname', 'sampletest.t1', 'first_name', '')
Ähnlich schlägt dieser SQL-Injection-Versuch mit einem Trennzeichen fehl:
CALL mysql.addSecondaryIdxOnReplica('', 'idx_fname', 'sampletest.t1', 'first_name', ';flush status')
Von selbstverwalteten zu verwalteten Replikatindexen migrieren
Obwohl sowohl verwaltete als auch selbstverwaltete Replikatindexe auf derselben Instanz vorhanden sein können, können Sie zu verwalteten Replikatindexen migrieren.
So migrieren Sie von selbstverwalteten zu verwalteten Replikatindexen:
Indexdefinitionen auf der primären Instanz registrieren:
Rufen Sie
mysql.cloudsql_replica_idx_defn_createfür jeden sekundären Index auf Ihrer primären Instanz auf:CALL mysql.cloudsql_replica_idx_defn_create ('INDEX_DEFINITION_NAME', 'CREATE INDEX INDEX_NAME ON DATABASE.TABLE (COLUMNS)');
Notieren Sie sich die zurückgegebene
idx_id(eine eindeutige Ganzzahlkennung für die Definition) aus der Ausgabe des Verfahrens.Indexdefinition zu einer Replikatgruppe hinzufügen:
Ordnen Sie die Indexdefinition einem bestimmten Replikatgruppennamen zu, indem Sie
mysql.cloudsql_replica_idx_group_addauf der primären Instanz aufrufen:CALL mysql.cloudsql_replica_idx_group_add (INDEX_DEFINITION_ID, 'REPLICA_GROUP');
Konfigurieren Sie das Flag für die Replikatgruppe auf dem Lesereplikat:
Legen Sie das Datenbank-Flag
cloudsql_index_recreate_replica_groupauf Ihrer Lesereplikatinstanz auf den Gruppennamen fest:gcloud sql instances patch REPLICA_INSTANCE_NAME \ --database-flags=EXISTING_FLAGS,cloudsql_index_recreate_replica_group=REPLICA_GROUP
Achten Sie darauf, dass der im Datenbank-Flag
cloudsql_index_recreate_replica_groupangegebene Gruppenname genau mit dem inmysql.cloudsql_replica_idx_group_addangegebenen Gruppennamen übereinstimmt.Vorhandene Indexe prüfen oder umstellen:
Da der Index bereits im Lesereplikat vorhanden ist, werden möglicherweise Fehler mit dem Status
FAILEDinmysql.cloudsql_replica_idx_statusangezeigt, wenn der Hintergrundprozess versucht, den Index zu erstellen. Sie können einen der folgenden Ansätze wählen:- Warten Sie, bis das Replikat neu erstellt wurde: Sie können den Status
FAILEDin der Statustabelle ignorieren. Cloud SQL erstellt den sekundären Index nach einem Ereignis zur Neuerstellung des Replikats automatisch mit der Methode für verwaltete Replikatindexe neu. Sofort umstellen: Wenn Sie möchten, dass Cloud SQL den Index sofort verwaltet, ohne auf die Neuerstellung eines Replikats zu warten, stellen Sie eine Verbindung zum Lesereplikat her und entfernen Sie den selbstverwalteten Index mit der gespeicherten Prozedur
mysql.dropSecondaryIdxOnReplica:CALL mysql.dropSecondaryIdxOnReplica('INDEX_NAME', 'DATABASE.TABLE', '');
Während des nächsten Wartungszyklus im Hintergrund (etwa alle fünf Minuten) erstellt und verfolgt Cloud SQL den verwalteten Replikatindex automatisch neu.
- Warten Sie, bis das Replikat neu erstellt wurde: Sie können den Status
Fehlerbehebung bei Replikatindexen
Prüfen Sie Folgendes, um Probleme mit Replikatindexen zu beheben:
Prüfen Sie, ob verwaltete Replikatindexe für die Replikatinstanz aktiviert sind:
Wenn Sie verwaltete Replikatindexe verwenden, muss das Datenbank-Flag
cloudsql_index_recreate_enableauf dem Lesereplikat aufongesetzt sein.Weitere Informationen zum Konfigurieren von Datenbank-Flags finden Sie unter Datenbank-Flags konfigurieren.
Vorgangsstatus und Fehler prüfen:
Stellen Sie eine Verbindung zum Lesereplikat her und fragen Sie
mysql.cloudsql_replica_idx_statusab oder führen SieCALL mysql.cloudsql_replica_idx_show_errors();aus, um Fehlermeldungen für fehlgeschlagene Vorgänge aufzurufen. Ein Fehler bei einem Index blockiert nicht die Ausführung nachfolgender Indexe in der Warteschlange.
Nächste Schritte
- Weitere Informationen zu Lesereplikatsindexen
- Lesereplikate verwalten
- Lesereplikate erstellen
- Mehr über Replikation in Cloud SQL erfahren
- Informationen zur Replikationsverzögerung.
- Datenbank-Flags konfigurieren
- Gespeicherte Prozeduren für Cloud SQL for MySQL
- Erweiterte Notfallwiederherstellung
- Verbindung über einen MySQL-Client herstellen