SQL-Anweisungen mit der Cloud SQL Data API ausführen

Auf dieser Seite wird beschrieben, wie Sie SQL-Anweisungen für Datenbanken in Cloud SQL-Instanzen mit der Data API 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 verwenden. Die Data API unterstützt alle Arten von SQL-Anweisungen, einschließlich DML (Datenbearbeitungssprache), DDL (Datendefinitionssprache) und DQL (Data Query Language). Die Data API eignet sich gut für kleine und schnelle administrative Anweisungen, z. B. zum Erstellen von Datenbankrollen oder ‑nutzern und für kleine Schemaaktualisierungen. Sie können die Data API auch verwenden, um PostgreSQL-Erweiterungen zu aktivieren.

Hinweis

Bevor Sie SQL-Anweisungen für eine Instanz ausführen können, müssen Sie Folgendes tun:

Erforderliche Rollen oder Berechtigungen

Standardmäßig haben Nutzer oder Dienstkonten mit einer der folgenden Rollen die Berechtigung zum Ausführen von SQL-Anweisungen für eine Cloud SQL-Instanz (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 Berechtigung cloudsql.instances.executesql enthält. Diese Berechtigung wird in benutzerdefinierten IAM-Rollen unterstützt.

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

  1. Wechseln Sie in der Cloud de Confiance Console zur Seite Cloud SQL-Instanzen.

    Cloud SQL-Instanzen aufrufen

  2. Klicken Sie auf den Instanznamen, um die Seite Übersicht einer Instanz zu öffnen.
  3. Wählen Sie im SQL-Navigationsmenü die Option Verbindungen aus.
  4. Klicken Sie auf den Tab Netzwerk.
  5. Klicken Sie das Kästchen Data API zulassen an.
  6. Klicken Sie auf Speichern.

gcloud

Verwenden Sie den Befehl gcloud sql instances patch mit dem Flag --data-api-access=ALLOW_DATA_API, 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 in Ihrer Cloud SQL-Instanz entweder mit der gcloud CLI oder der REST API ausführen.

gcloud

Wenn Sie mit der gcloud CLI eine SQL-Anweisung für eine Datenbank in einer Instanz ausführen möchten, verwenden Sie den Befehl gcloud sql instances execute-sql:

gcloud sql instances execute-sql INSTANCE_NAME \
--database=DATABASE_NAME \
--sql=SQL_STATEMENT \
--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.
  • PARTIAL_RESULT_MODE: optional. Steuert, wie reagiert werden soll, wenn das Ergebnis unvollständig ist. Kann ALLOW_PARTIAL_RESULT, FAIL_PARTIAL_RESULT oder PARTIAL_RESULT_MODE_UNSPECIFIED sein. Weitere Informationen finden Sie unter Kürzung anpassen.

Bei Bedarf können Sie auch das Flag --project=PROJECT_ID einfügen.

Terraform

Mit der Data API in Terraform können Sie In-Database-Ressourcen wie Datenbanken, Tabellen, Erweiterungen, Nutzer und Berechtigungen bereitstellen, ohne manuell eine Verbindung zur Instanz herzustellen. Verwenden Sie zum Ausführen eines SQL-Scripts in Terraform die Terraform-Ressource google_sql_provision_script.

resource "google_sql_database_instance" "instance" {
  name             = "my-instance"
  database_version = "POSTGRES_17"

  settings {
    tier            = "db-perf-optimized-N-2"
    data_api_access = "ALLOW_DATA_API"  # This allows the use of Data API.
    database_flags {
      name  = "cloudsql.iam_authentication"
      value = "on"
    }
  }
}

/*
 * Create a database user for your account and grant roles so it has privilege to
 * access the database. Set the type to CLOUD_IAM_USER for huamn account or
 * CLOUD_IAM_SERVICE_ACCOUNT for service account. If a service account is used
 * and the instance is Postgres, trim the ".s3ns-system.iam.gserviceaccount.com"
 * suffix to avoid exceeding the username length limit.
*/
resource "google_sql_user" "iam_user" {
  name     = "account-used-to-apply-this-config@example.com"
  instance = google_sql_database_instance.instance.name
  type     = "CLOUD_IAM_USER"

  # Roles granted to the user. Smaller roles are preferred, if exist.
  database_roles = ["cloudsqlsuperuser"]
}

resource "google_sql_database" "database" {
  name     = "my-database"
  instance = google_sql_database_instance.instance.name
}

resource "google_sql_provision_script" "script" {
  # You can inline the script or import from a file like script  = file("${path.module}/script.sql")
  # When modified, the whole script will be executed again. It's recommended to
  # make the script idempotent with patterns like create 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"

  # The identity account used to apply your Terraform config must exist as an
  # IAM user or IAM service account in the instance. Terraform connects to the
  # instance via IAM database authentication to execute the script.
  depends_on = [google_sql_user.iam_user]
}

Änderungen anwenden

Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre Terraform-Konfiguration auf ein Cloud de Confiance -Projekt anzuwenden.

Cloud Shell vorbereiten

  1. Rufen Sie Cloud Shell auf.
  2. Legen Sie das Standardprojekt Cloud de Confiance 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).

  1. Erstellen Sie in Cloud Shell ein Verzeichnis und eine neue Datei in diesem Verzeichnis. Der Dateiname muss die Erweiterung .tf haben, z. B. main.tf. In dieser Anleitung wird die Datei als main.tf bezeichnet.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 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.

  3. Prüfen und ändern Sie die Beispielparameter, die auf Ihre Umgebung angewendet werden sollen.
  4. Speichern Sie die Änderungen.
  5. Initialisieren Sie Terraform. Dies ist nur einmal für jedes Verzeichnis erforderlich.
    terraform init

    Fügen Sie optional die Option -upgrade ein, um die neueste Google-Anbieterversion zu verwenden:

    terraform init -upgrade

Änderungen anwenden

  1. 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.

  2. Wenden Sie die Terraform-Konfiguration an. Führen Sie dazu den folgenden Befehl aus und geben Sie yes an der Eingabeaufforderung ein:
    terraform apply

    Warten Sie, bis Terraform die Meldung „Apply complete“ anzeigt.

  3. Öffnen Sie Ihr Cloud de Confiance -Projekt, um die Ergebnisse aufzurufen. Rufen Sie in der Cloud de Confiance Console Ihre Ressourcen in der Benutzeroberfläche auf, um sicherzustellen, dass Terraform sie erstellt oder aktualisiert hat.

Änderungen löschen

Wenn Sie eine google_sql_provision_script-Ressource löschen, werden die zugehörigen In-Database-Ressourcen nicht gelöscht. Wenn Sie sie löschen möchten, können Sie dem Skript explizit Anweisungen wie drop ... if exists hinzufügen und die Änderungen dann übernehmen.

REST

Wenn Sie eine SQL-Anweisung für eine Datenbank in einer Instanz mithilfe der REST API ausführen möchten, senden Sie eine POST-Anfrage an den executeSql-Endpunkt:

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",
  "partialResultMode": "PARTIAL_RESULT_MODE"
  "autoIamAuthn": true
}

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.
  • PARTIAL_RESULT_MODE: optional. Steuert, wie die API reagiert, wenn das Ergebnis 10 MB überschreitet. Kann FAIL_PARTIAL_RESULT oder ALLOW_PARTIAL_RESULT sein. Weitere Informationen finden Sie unter Kürzung anpassen.

Abschneideverhalten ändern

Sie können festlegen, wie große Ergebnisse bei der Ausführung von SQL behandelt werden.

  • Fügen Sie das Feld "partialResultMode" in die Anfrage ein. Dieses Feld akzeptiert die folgenden Werte:
    • FAIL_PARTIAL_RESULT: Es wird ein Fehler ausgegeben, wenn das Ergebnis 10 MB überschreitet oder nur ein Teilergebnis abgerufen werden kann. Das Ergebnis nicht zurückgeben.
    • ALLOW_PARTIAL_RESULT: Gibt ein gekürztes Ergebnis zurück und setzt partial_result auf „true“, wenn das Ergebnis 10 MB überschreitet oder aufgrund eines Fehlers nur ein Teilergebnis abgerufen werden kann. Keinen Fehler ausgeben.

Beschränkungen

  • Die Größenbeschränkung für eine Antwort beträgt 10 MB. Ergebnisse, die diese Größe überschreiten, werden gekürzt, wenn partialResultMode auf ALLOW_PARTIAL_RESULT gesetzt ist. Andernfalls wird ein Fehler ausgegeben.
  • Anfragen sind auf 0,5 MB beschränkt.
  • Sie können SQL-Anweisungen nur für Cloud SQL for PostgreSQL-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 auf externen Servern eingerichtet sind.
  • Anfragen, die länger als 30 Sekunden dauern, werden abgebrochen. Das Festlegen eines höheren Anweisungstimeouts mit SET STATEMENT_TIMEOUT wird nicht unterstützt.
  • In Cloud SQL ist die Anzahl der gleichzeitigen executeSql-Anfragen auf 10 pro Instanz und Nutzer begrenzt. Wenn dieses Limit erreicht ist, schlagen nachfolgende Anfragen mit der Fehlermeldung „Auf dieser Instanz können maximal 10 gleichzeitige Abfragen ausgeführt werden. Versuchen Sie es später noch einmal.“ oder „Die maximale Anzahl gleichzeitiger Lesevorgänge (10) wurde erreicht.“
  • Jede Antwort kann maximal 10 Datenbankmeldungen oder ‑warnungen enthalten.
  • Bei einem Syntax- oder Ausführungsfehler wird kein Ergebnis zurückgegeben.
  • Anweisungen, die viel Arbeitsspeicher belegen, können zu Fehlern aufgrund von unzureichendem Arbeitsspeicher führen. Weitere Informationen zum Vermeiden dieser Fehler finden Sie unter Best Practices für die Verwaltung der Arbeitsspeichernutzung. Eine Datenbankinstanz, die mit hoher Arbeitsspeichernutzung ausgeführt wird, führt häufig zu Leistungsproblemen, Ausführungsunterbrechungen oder sogar Datenbankausfällen.
  • Die Data API kann vorübergehend blockiert werden, wenn bestimmte Wartungsvorgänge für die Instanz ausgeführt werden, um die Datenintegrität zu gewährleisten. Versuchen Sie es später noch einmal, falls das Problem auftritt.
  • Die Data API garantiert noch keine Datenspeicherung. Anfragen schlagen mit dem Fehler „not supported for instances in certain Assured Workloads control packages folders“ (nicht unterstützt für Instanzen in bestimmten Assured Workloads-Kontrollpaketordnern) für bestimmte Assured Workloads-Projekte und für Projekte mit manuell erzwungenen constraints/sql.restrictNoncompliantResourceCreation fehl.