Cloud SQL-Datenbankexporte mit Cloud Scheduler planen

In dieser Anleitung wird gezeigt, wie Sie mit Cloud Scheduler und Cloud Functions eine Cloud SQL for MySQL-Datenbank automatisch in Cloud Storage exportieren. Mithilfe von Datenbankexporten in Cloud Storage können Sie einen robusten, vielschichtigen Notfallwiederherstellungsplan erstellen. Sie haben beispielsweise die Möglichkeit, einen Export in eine andere Region oder einen Import in andere Cloud SQL-Instanzen oder andere MySQL-Datenbanken auszuführen.

Architektur

Diese Anleitung umfasst die folgenden Google Cloud-Komponenten:

Ein Cloud Scheduler-Job sendet eine Nachricht an ein Pub/Sub-Thema mit Informationen zum Cloud SQL-Instanznamen, zur Datenbank, zur Projekt-ID und zum Cloud Storage-Speicherort, an dem die Datensicherung gespeichert werden soll. Dieses Ereignis löst eine Cloud Functions-Funktion aus, die diese Nutzlast abruft und einen Datenbankexport in Cloud SQL über die SQL Admin API startet. Die Datenbank generiert den Export und speichert ihn in Cloud Storage. Das folgende Diagramm zeigt diesen Vorgang.

Grafik: Workflow von Cloud Scheduler zu Pub/Sub, das eine Cloud Functions-Funktion auslöst, die den Export startet.

Ziele

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Vorbereitung

  1. Wählen Sie in der Cloud Console auf der Seite für die Projektauswahl ein Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  2. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  3. Aktivieren Sie Cloud Shell in der Cloud Console.

    Cloud Shell aktivieren

  4. Aktivieren Sie die Cloud SQL Admin, Cloud Functions, Cloud Scheduler, and App Engine APIs.

    Aktivieren Sie die API

In dieser Anleitung führen Sie alle Befehle über Cloud Shell aus.

Umgebung einrichten

Als Erstes klonen Sie das Repository, das die Beispieldaten enthält. Anschließend konfigurieren Sie Ihre Umgebung und erstellen benutzerdefinierte Rollen mit den Berechtigungen, die für diese Anleitung erforderlich sind.

  1. Klonen Sie das Repository, das die Beispieldaten enthält:

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
    

    Sie verwenden die Daten aus dem Repository training-data-analyst, um eine Datenbank mit einigen Beispieldatensätzen zu erstellen.

  2. Konfigurieren Sie die folgenden Umgebungsvariablen:

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="sql-export-tutorial"
    export BUCKET_NAME=${USER}-mysql-$(date +%s)
    export SQL_INSTANCE="${DEMO}-sql"
    export GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export SQL_ROLE="sqlExporter"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-west2"
    
  3. Erstellen Sie zwei benutzerdefinierte Rollen, die nur die für diese Anleitung erforderlichen Berechtigungen haben:

    gcloud iam roles create ${STORAGE_ROLE} --project ${PROJECT_ID} \
        --title "Simple Storage Role" \
        --description "Grant permissions to view and create objects in Cloud Storage" \
        --permissions "storage.objects.create,storage.objects.get"
    
    gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \
        --title "SQL Exporter Role" \
        --description "Grant permissions to export data from a Cloud SQL instance to a Cloud Storage bucket as a SQL dump or CSV file" \
        --permissions "cloudsql.instances.export"
    

    Diese Rollen reduzieren den Zugriffsbereich von Cloud Functions- und Cloud SQL-Dienstkonten nach dem Prinzip der geringsten Berechtigung.

Cloud Storage-Bucket und Cloud SQL-Instanz erstellen

In diesem Bereich erstellen Sie zuerst einen Cloud Storage-Bucket und eine MySQL-Instanz von Cloud SQL. Dann erstellen Sie eine Beispieldatenbank und füllen sie mit Beispieldaten.

Cloud Storage-Bucket erstellen

Sie verwenden Sie das gsutil-Befehlszeilentool zum Erstellen eines Cloud Storage-Buckets.

  • Erstellen Sie einen Cloud Storage-Bucket, in dem die Datenexporte gespeichert werden sollen:

    gsutil mb -l ${REGION} gs://${BUCKET_NAME}
    

Cloud SQL-Instanz erstellen und zugehörigem Dienstkonto Berechtigungen erteilen

Als Nächstes erstellen Sie eine Cloud SQL-Instanz und erteilen dem zugehörigen Dienstkonto die Berechtigung zum Exportieren von Daten in Cloud Storage.

  1. Erstellen Sie eine Instanz von Cloud SQL for MySQL 5.7:

    gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --region ${REGION}
    

    Dieser Vorgang dauert einige Minuten.

  2. Prüfen Sie, ob die Cloud SQL-Instanz ausgeführt wird:

    gcloud sql instances list --filter name=${SQL_INSTANCE}
    

    Die Ausgabe sieht dann ungefähr so aus:

    NAME                     DATABASE_VERSION  LOCATION    TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    sql-export-tutorial-sql  MYSQL_5_7         us-west2-b  db-n1-standard-1  34.94.173.98     -                RUNNABLE
    
  3. Erteilen Sie Ihrem Cloud SQL-Dienstkonto die Berechtigung zum Exportieren von Daten in Cloud Storage mit der einfachen Speicherrolle:

    export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
        --project ${PROJECT_ID} \
        --format "value(serviceAccountEmailAddress)"`)
    
    gsutil iam ch serviceAccount:${SQL_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

Cloud SQL-Instanz mit Beispieldaten füllen

Jetzt können Sie Dateien in Ihren Bucket hochladen und die Beispieldatenbank erstellen und füllen.

  1. Wechseln Sie in das geklonten Repository:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Laden Sie die Dateien im Verzeichnis in den neuen Bucket hoch:

    gsutil cp * gs://${BUCKET_NAME}
    
  3. Erstellen und füllen Sie eine Beispieldatenbank. Klicken Sie bei entsprechender Aufforderung auf yes, um fortzufahren:

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \
        --database recommendation_spark \
        --table Accommodation
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \
        --database recommendation_spark \
        --table Rating
    

Pub/Sub-Thema, Cloud Functions-Funktion und Cloud Scheduler-Job erstellen

In diesem Bereich erstellen Sie ein benutzerdefiniertes Dienstkonto und binden es an die von Ihnen erstellte benutzerdefinierte SQL-Rolle. Anschließend erstellen Sie ein Pub/Sub-Thema, mit dem die Ausführung einer Cloud Functions-Funktion ausgelöst wird. Sie erstellen außerdem einen Cloud Scheduler-Job, um die Datenexportfunktion regelmäßig auszuführen.

Dienstkonto für die Cloud Functions-Funktion erstellen

Im ersten Schritt erstellen Sie ein benutzerdefiniertes Dienstkonto und binden es an die von Ihnen erstellte benutzerdefinierte SQL-Rolle.

  1. Erstellen Sie ein IAM-Dienstkonto, das von der Cloud Functions-Funktion verwendet werden soll:

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Gewähren Sie dem Cloud Functions-Dienstkonto Zugriff auf die benutzerdefinierte SQL-Rolle:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
    

Pub/Sub-Thema erstellen

Im nächsten Schritt erstellen Sie ein Pub/Sub-Thema, mit dem die Cloud Functions-Funktion ausgelöst wird, die mit der Cloud SQL-Datenbank interagiert.

  • Erstellen Sie das Pub/Sub-Thema:

    gcloud pubsub topics create ${PUBSUB_TOPIC}
    

Cloud Functions-Funktion erstellen

Als Nächstes erstellen Sie die Cloud Functions-Funktion.

  1. Erstellen Sie eine main.py-Datei. Fügen Sie dazu Folgendes in Cloud Shell ein:

    cat <<EOF > main.py
    
    import base64
    import logging
    import json
    
    from datetime import datetime
    from httplib2 import Http
    
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    from oauth2client.client import GoogleCredentials
    
    def main(event, context):
        pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8'))
        credentials = GoogleCredentials.get_application_default()
    
        service = discovery.build('sqladmin', 'v1beta4', http=credentials.authorize(Http()), cache_discovery=False)
    
        datestamp = datetime.now().strftime("%Y%m%d%H%M") # format timestamp: YearMonthDayHourMinute
        uri = "{0}/backup-{1}-{2}.gz".format(pubsub_message['gs'], pubsub_message['db'], datestamp)
    
        instances_export_request_body = {
          "exportContext": {
            "kind": "sql#exportContext",
            "fileType": "SQL",
            "uri": uri,
            "databases": [
              pubsub_message['db']
            ]
          }
        }
    
        try:
          request = service.instances().export(
                project=pubsub_message['project'],
                instance=pubsub_message['instance'],
                body=instances_export_request_body
            )
          response = request.execute()
        except HttpError as err:
            logging.error("Could NOT run backup. Reason: {}".format(err))
        else:
          logging.info("Backup task status: {}".format(response))
    EOF
    
  2. Erstellen Sie eine requirements.txt-Datei. Fügen Sie dazu Folgendes in Cloud Shell ein:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. Stellen Sie den Code bereit. Wenn Sie gefragt werden, ob Sie nicht authentifizierte Aufrufe der neuen Funktion zulassen möchten, antworten Sie mit no.

    gcloud functions deploy ${GCF_NAME} \
        --trigger-topic ${PUBSUB_TOPIC} \
        --runtime python37 \
        --entry-point main \
        --service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    

Cloud Scheduler-Job erstellen

Als Letztes erstellen Sie einen Cloud Scheduler-Job, um die Datenexportfunktion regelmäßig auszuführen.

  1. Erstellen Sie eine App Engine-Instanz für den Cloud Scheduler-Job:

    gcloud app create --region=${REGION}
    
  2. Erstellen Sie einen Cloud Scheduler-Job, um die Datenexportfunktion regelmäßig auszuführen:

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} --schedule '0 23 * * *' --topic ${PUBSUB_TOPIC} --message-body '{"db":"recommendation_spark","instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"',"gs":'\"gs://${BUCKET_NAME}\"'}' --time-zone 'America/Los_Angeles'
    

    Dieser Job ist so geplant, dass er täglich um 23:00 Uhr ausgeführt wird.

Lösung testen

Im letzten Schritt testen Sie Ihre Lösung. Dazu führen Sie als Erstes den Cloud Scheduler-Job aus.

  1. Führen Sie den Cloud Scheduler-Job manuell aus, um einen MySQL-Dump Ihrer Datenbank auszulösen.

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. Listen Sie die Vorgänge auf, die für die MySQL-Instanz ausgeführt wurden. Prüfen Sie, ob ein Vorgang vom Typ EXPORT vorhanden ist:

    gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
    

    Die Ausgabe zeigt einen abgeschlossenen Exportjob. Beispiel:

    NAME                                  TYPE    START                          END                            ERROR  STATUS
    8b031f0b-9d66-47fc-ba21-67dc20193749  EXPORT  2020-02-06T21:55:22.240+00:00  2020-02-06T21:55:32.614+00:00  -      DONE
    
  3. Sehen Sie im Cloud Storage-Bucket nach, ob die Datenbank-Dumpdatei erstellt wurde:

    gsutil ls gs://${BUCKET_NAME} | grep backup-recommendation_spark
    

    Sie sehen eine Datei namens STATUS, wenn der backup-database_name-timestamp.gz-Vorgang aus dem vorherigen Schritt DONE zurückgibt.

Bereinigen

Wenn Sie Kosten für Ihr Google Cloud-Konto für die in dieser Anleitung verwendeten Ressourcen vermeiden möchten, können Sie die folgenden Schritte ausführen. Am einfachsten vermeiden Sie weitere Kosten, indem Sie das für die Anleitung erstellte Projekt löschen.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite "Ressourcen verwalten"

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen .
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Weitere Informationen