Auf dieser Seite wird beschrieben, wie Sie mit der Data API SQL-Anweisungen für Datenbanken auf Cloud SQL-Instanzen ausführen. Mit der Data API verwenden Sie die Cloud SQL Admin API und die gcloud CLI, um SQL-Anweisungen für jede Instanz auszuführen, für die Sie den Data API-Zugriff aktiviert haben.
Sie können die Data API mit Instanzen verwenden, die öffentliche IP-Adressen, den Zugriff auf private Dienste oder Private Service Connect nutzen. Die Data API unterstützt alle Arten von SQL-Anweisungen, einschließlich DML (Datenbearbeitungssprache), DDL (Datendefinitionssprache) und DQL (Datenabfragesprache). Die Data API eignet sich gut für die Ausführung kleiner und schneller administrativer Anweisungen, z. B. zum Erstellen von Datenbankrollen oder ‑Nutzern und für kleine Schemaaktualisierungen.
Hinweis
Bevor Sie SQL-Anweisungen für eine Instanz ausführen können, müssen Sie die folgenden Schritte ausführen.
Datenbanknutzer konfigurieren
Die Data API muss sich als Datenbanknutzer authentifizieren, um SQL-Anweisungen auszuführen.
So authentifizieren Sie sich als integrierter Nutzer mit einem Passwort:
- Erstellen Sie ein
Nutzerkonto mit einem nicht leeren Passwort.
Sie können auch den Standardnutzer
sqlserververwenden. - Gewähren Sie dem Konto die
erforderlichen Rollen oder Berechtigungen zum Ausführen von SQL-Anweisungen. Wenn der Nutzer nicht
sqlserver, gewähren Sie ihm diedb_ownerRolle. - Erstellen Sie mit Secret Manager ein regionales Secret, um das Passwort zu speichern. Aus Sicherheitsgründen fordert die Data API in der API-Anfrage den Ressourcennamen des Secrets anstelle des Passworts an. Das regionale Secret sollte in derselben Region wie Ihre Cloud SQL-Instanz gespeichert werden. Secrets, die mit dem globalen Endpunkt von Secret Manager erstellt wurden, werden nicht unterstützt, auch wenn sie in derselben Region gespeichert sind.
- Als Best Practice sollten Sie IAM Bedingungen definieren, um einem Nutzer Zugriff auf ein bestimmtes Secret zu gewähren, aber nicht auf andere Secrets im Projekt.
Erforderliche Rollen oder Berechtigungen
Standardmäßig haben Nutzer- oder Dienstkonten mit einer der folgenden Rollen die Berechtigung, SQL-Anweisungen für eine Cloud SQL-Instanz auszuführen (cloudsql.instances.executesql):
Cloud SQL Admin(roles/cloudsql.admin)Cloud SQL Instance User(roles/cloudsql.instanceUser)Cloud SQL Studio User(roles/cloudsql.studioUser)
Sie können auch eine benutzerdefinierte IAM-Rolle
für das Nutzer- oder Dienstkonto definieren, die die cloudsql.instances.executesql
Berechtigung enthält. Diese Berechtigung wird
unterstützt in
benutzerdefinierten IAM-Rollen.
Data API aktivieren oder deaktivieren
Wenn Sie die Data API verwenden möchten, müssen Sie sie für jede Instanz aktivieren. Sie können die Data API jederzeit deaktivieren.
Console
-
Öffnen Sie in der Google Cloud Console die Cloud SQL-Instanzen Seite.
- Klicken Sie auf den Instanznamen, um die Seite Übersicht einer Instanz zu öffnen.
- Wählen Sie im SQL-Navigationsmenü die Option Verbindungen aus.
- Klicken Sie auf den Tab Netzwerk.
- Klicken Sie auf das Kästchen Data API zulassen.
- Klicken Sie auf Speichern.
gcloud
Verwenden Sie den gcloud sql instances patch Befehl mit dem --data-api-access=ALLOW_DATA_API Flag, um den Data API-Zugriff für eine Instanz zu aktivieren:
gcloud sql instances patch INSTANCE_NAME --data-api-access=ALLOW_DATA_API
Verwenden Sie das Flag --data-api-access=DISALLOW_DATA_API, um den Data API-Zugriff zu deaktivieren:
gcloud sql instances patch INSTANCE_NAME --data-api-access=DISALLOW_DATA_API
Ersetzen Sie INSTANCE_NAME durch den Namen der Instanz, für die Sie die Data API aktivieren oder deaktivieren möchten.
SQL-Anweisung ausführen
Sie können SQL-Anweisungen für Datenbanken auf Ihrer Cloud SQL Instanz entweder mit der gcloud CLI oder der REST API ausführen.
Mit Passwort authentifizieren
Sie können SQL-Anweisungen mit der integrierten Passwortauthentifizierung ausführen, wenn das Passwort als regionales Secret mit Secret Manager in derselben Region wie die Cloud SQL-Instanz gespeichert ist.
gcloud
Verwenden Sie den Befehl gcloud sql instances execute-sql, um eine SQL-Anweisung für eine Datenbank auf einer Instanz mit der gcloud CLI auszuführen.
gcloud sql instances execute-sql INSTANCE_NAME \ --database=DATABASE_NAME \ --sql=SQL_STATEMENT \ --user=USER \ --password-secret-version=PASSWORD_SECRET_VERSION \ --partial-result-mode=PARTIAL_RESULT_MODE
Ersetzen Sie die folgenden Werte:
- INSTANCE_NAME: der Name der Instanz.
- DATABASE_NAME: der Name der Datenbank in der Instanz.
- SQL_STATEMENT: die auszuführende SQL-Anweisung. Wenn die Anweisung Leerzeichen oder Shell-Sonderzeichen enthält, muss sie in Anführungszeichen gesetzt werden.
- USER: der Datenbanknutzer, als der die Authentifizierung erfolgen soll.
- PASSWORD_SECRET_VERSION: der Ressourcenname des
Secret Manager-Secrets, das das Passwort für den Datenbanknutzer enthält.
Das Secret sollte ein
regionales Secret sein und in derselben Region wie die Cloud SQL
-Instanz gespeichert werden. Das erwartete Ressourcennameformat ist
projects/{project}/locations/{location}/secrets/{secret}/versions/{secret_version}. - PARTIAL_RESULT_MODE: optional. Steuert, wie reagiert werden soll, wenn das Ergebnis unvollständig ist. Mögliche Werte sind
ALLOW_PARTIAL_RESULT,FAIL_PARTIAL_RESULToderPARTIAL_RESULT_MODE_UNSPECIFIED. Weitere Informationen finden Sie unter Verhalten bei der Kürzung ändern.
Terraform
Sie können die Data API in Terraform verwenden, um Ressourcen in der Datenbank wie Datenbanken, Tabellen, Erweiterungen, Nutzer und Berechtigungen bereitzustellen, ohne manuell eine Verbindung zur Instanz herzustellen. Verwenden Sie die
google_sql_provision_script Terraform-Ressource, um ein SQL-Skript in Terraform auszuführen.
resource "google_sql_user" "built_in_user" { name = "tf-user" host = "%" # Don't set this field for PostgreSQL and SQL Server. instance = google_sql_database_instance.instance.name password = "changeme" type = "BUILT_IN" } # Create a regional secret. Global secrets are not supported even if # located in one region only. resource "google_secret_manager_regional_secret" "secret" { secret_id = "db-password" # Use the same region as the Cloud SQL instance. location = "us-central1" } resource "google_secret_manager_regional_secret_version" "secret_version" { secret = google_secret_manager_regional_secret.secret.id secret_data = "changeme" } resource "google_sql_provision_script" "script" { # You can inline the script or import from a file likescript = file("${path.module}/script.sql")# When modified, the whole script will be executed again. It's recommended to # make the script idempotent with patterns likecreate if not exists ...or #if not exists (select ...) then ... end if. script = "CREATE TABLE IF NOT EXISTS table1 ( col VARCHAR(16) NOT NULL );" instance = google_sql_database_instance.instance.name database = google_sql_database.database.name description = "sql script to create tables" user = google_sql_user.built_in_user.name # The location should be the same as the Cloud SQL instance's location. password_secret_version = "projects/my-project/locations/us-central1/secrets/db-password/versions/latest" # The built-in database user and password secret version must be created # first. Cloud SQL will retrieve password from Secret Manager # and connect to this user account to execute your script. depends_on = [ google_sql_user.built_in_user, google_secret_manager_regional_secret_version.secret_version ] }
Änderungen anwenden
Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre Terraform-Konfiguration auf ein Google Cloud Projekt anzuwenden.
Cloud Shell vorbereiten
- Rufen Sie Cloud Shell auf.
-
Legen Sie das Standard Google Cloud projekt fest, auf das Sie Ihre Terraform-Konfigurationen anwenden möchten.
Sie müssen diesen Befehl nur einmal pro Projekt und in jedem beliebigen Verzeichnis ausführen.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Umgebungsvariablen werden überschrieben, wenn Sie in der Terraform-Konfigurationsdatei explizite Werte festlegen.
Verzeichnis vorbereiten
Jede Terraform-Konfigurationsdatei muss ein eigenes Verzeichnis haben (auch als Stammmodul bezeichnet).
-
Erstellen Sie in Cloud Shell ein Verzeichnis und eine neue Datei in diesem Verzeichnis. Der Dateiname muss die Erweiterung
.tfhaben, z. B.main.tf. In dieser Anleitung wird die Datei alsmain.tfbezeichnet.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Wenn Sie einer Anleitung folgen, können Sie den Beispielcode in jedem Abschnitt oder Schritt kopieren.
Kopieren Sie den Beispielcode in das neu erstellte
main.tf.Kopieren Sie optional den Code aus GitHub. Dies wird empfohlen, wenn das Terraform-Snippet Teil einer End-to-End-Lösung ist.
- Prüfen und ändern Sie die Beispielparameter, die auf Ihre Umgebung angewendet werden sollen.
- Speichern Sie die Änderungen.
-
Initialisieren Sie Terraform. Dies ist nur einmal für jedes Verzeichnis erforderlich.
terraform init
Fügen Sie optional die Option
-upgradeein, um die neueste Google-Anbieterversion zu verwenden:terraform init -upgrade
Änderungen anwenden
-
Prüfen Sie die Konfiguration und prüfen Sie, ob die Ressourcen, die Terraform erstellen oder aktualisieren wird, Ihren Erwartungen entsprechen:
terraform plan
Korrigieren Sie die Konfiguration nach Bedarf.
-
Wenden Sie die Terraform-Konfiguration an. Führen Sie dazu den folgenden Befehl aus und geben Sie
yesan der Eingabeaufforderung ein:terraform apply
Warten Sie, bis Terraform die Meldung „Apply complete“ anzeigt.
- Öffnen Sie Ihr Google Cloud Projekt, um die Ergebnisse aufzurufen. Rufen Sie in der Google Cloud Console Ihre Ressourcen in der Benutzeroberfläche auf, um sicherzustellen dass Terraform sie erstellt oder aktualisiert hat.
Änderungen löschen
Durch das Löschen einer google_sql_provision_script-Ressource werden die von ihr erstellten Ressourcen in der Datenbank nicht gelöscht. Wenn Sie sie löschen möchten, können Sie dem Skript explizit Anweisungen wie drop ... if exists hinzufügen und dann die Änderungen anwenden.
REST
Senden Sie eine POST-Anfrage an den Endpunkt executeSql, um eine SQL-Anweisung für eine Datenbank auf einer Instanz mit der REST API auszuführen:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME/executeSql
Der Anfragetext sollte den Datenbanknamen und die SQL-Anweisung enthalten:
{ "database": "DATABASE_NAME", "sqlStatement": "SQL_STATEMENT", "user": "USER", "passwordSecretVersion": "PASSWORD_SECRET_VERSION", "partialResultMode": "PARTIAL_RESULT_MODE" }
Ersetzen Sie die folgenden Werte:
- PROJECT_ID: Ihre Projekt-ID.
- INSTANCE_NAME: der Name der Instanz.
- DATABASE_NAME: der Name der Datenbank in der Instanz.
- SQL_STATEMENT: die auszuführende SQL-Anweisung.
- USER: der Datenbanknutzer, als der die Authentifizierung erfolgen soll.
- PASSWORD_SECRET_VERSION: der Ressourcenname des
Secret Manager-Secrets, das das Passwort für den Datenbanknutzer enthält.
Das Secret sollte ein
regionales Secret sein und in derselben Region wie die Cloud SQL
-Instanz gespeichert werden. Das erwartete Ressourcennameformat ist
projects/{project}/locations/{location}/secrets/{secret}/versions/{secret_version}. - PARTIAL_RESULT_MODE: optional. Steuert, wie die API reagiert
wenn das Ergebnis 10 MB überschreitet. Mögliche Werte sind
FAIL_PARTIAL_RESULT,ALLOW_PARTIAL_RESULToderPARTIAL_RESULT_MODE_UNSPECIFIED. Weitere Informationen finden Sie unter Verhalten bei der Kürzung ändern.
Verhalten bei der Kürzung ändern
Sie können festlegen, wie große Ergebnisse bei der Ausführung von SQL-Anweisungen verarbeitet werden, indem Sie
das "partialResultMode" Feld in die Anfrage einfügen. Für dieses Feld sind die folgenden Werte zulässig:
FAIL_PARTIAL_RESULT: Standard. Gibt einen Fehler aus, wenn das Ergebnis 10 MB überschreitet oder nur ein Teilergebnis abgerufen werden kann. Gibt das Ergebnis nicht zurück.ALLOW_PARTIAL_RESULT: Gibt ein gekürztes Ergebnis zurück und setztpartial_resultauf „true“, wenn das Ergebnis 10 MB überschreitet oder nur ein Teilergebnis aufgrund eines Fehlers abgerufen werden kann. Gibt keinen Fehler aus.PARTIAL_RESULT_MODE_UNSPECIFIED: Nicht angegebener Modus, entspricht im WesentlichenFAIL_PARTIAL_RESULT.
Beschränkungen
- Die maximale Größe einer Antwort beträgt 10 MB. Ergebnisse, die diese Größe überschreiten, werden gekürzt, wenn
partialResultModeaufALLOW_PARTIAL_RESULTgesetzt ist. Andernfalls wird ein Fehler ausgegeben. - Anfragen sind auf 0,5 MB begrenzt.
- Sie können SQL-Anweisungen nur für Cloud SQL for SQL Server-Instanzen ausführen, die ausgeführt werden.
- Cloud SQL unterstützt die Verwendung der Data API nicht für Instanzen, die für die Replikation externer Server eingerichtet sind.
- Anfragen, die länger als 30 Sekunden dauern, werden abgebrochen. Das Festlegen eines höheren Zeitlimits für Anweisungen mit
SET LOCK_TIMEOUTwird nicht unterstützt. Cloud SQL begrenzt die Anzahl gleichzeitiger
executeSql-Anfragen pro Instanz, um eine Überlastung zu vermeiden. Wenn das Limit erreicht ist, schlagen nachfolgende Anfragen fehl und geben einen der folgenden Fehler zurück:At most 'x' concurrent queries may be run on this instance. Try again later.Maximum concurrent reads 'x' reached.
Das Limit (
x) beträgt 5 Abfragen für Instanzen mit weniger als 10 GB Gesamtspeicher und 10 Abfragen für Instanzen mit mindestens 10 GB Gesamtspeicher.Jede Antwort kann maximal 10 Datenbankmeldungen oder ‑Warnungen enthalten.
Wenn ein Syntax- oder Ausführungsfehler in der Anweisung auftritt, wird kein Ergebnis zurückgegeben.
Die Data API kann sich nicht als integrierte Nutzer mit leeren Passwörtern authentifizieren.
Die Data API kann aus Gründen der Datenintegrität vorübergehend blockiert werden, wenn bestimmte Wartungsvorgänge für die Instanz ausgeführt werden. Versuchen Sie es später noch einmal.
- Der Befehl
GOwird nicht unterstützt. Dieser Befehl wird in Microsoft SQL Server-Dienstprogrammen verwendet, um anzugeben, dass ein Batch von Anweisungen beendet ist und an SQL Server gesendet werden kann. Wenn eine Abfrage eine binäre Spalte enthält, kann sie von der Data API nicht angezeigt werden. Konvertieren Sie stattdessen binäre Werte in einen String.
Beispiel: Ersetzen Sie
SELECT my_binary_column from my_table2;mit
SELECT CONVERT(NVARCHAR(4000), my_binary_column, 1) from my_table2;Wenn mehrere Abfragen ausgeführt werden und eine davon fehlschlägt, wird der erste aufgetretene Fehler zurückgegeben. Einige der Anweisungen im Batch vor dem Fehler wurden möglicherweise erfolgreich ausgeführt. Sie können mehrere Abfragen in einer
transaction-Anweisung zusammenfassen, um dieses Problem zu vermeiden:BEGIN TRANSACTION YOUR_SQL_STATEMENTS COMMIT;Ersetzen Sie Folgendes:
- YOUR_SQL_STATEMENTS: die Anweisungen, die Sie als Teil dieser Abfrage ausführen möchten
- Das SQL-Skript und die Ausführungsantwort werden möglicherweise über Zwischenstandorte zwischen Ihrem Client und dem Standort der Zielinstanz übertragen. Aus diesem Grund schlagen Anfragen mit dem Fehler „not supported for instances in certain Assured Workloads control packages folders“ für bestimmte Assured Workloads-Projekte und für Projekte fehl, bei denen
constraints/sql.restrictNoncompliantResourceCreationmanuell erzwungen wird.