Replikation aus großen externen Datenbanken mithilfe eines benutzerdefinierten Imports einrichten

Auf dieser Seite wird die Vorgehensweise zur Einrichtung der Replikation von einem externen Server mithilfe eines benutzerdefinierten Imports erläutert. Diese Schritte werden empfohlen, wenn Sie aus einer großen externen Datenbank replizieren müssen.

Es müssen dafür alle Schritte auf dieser Seite ausgeführt werden. Nach Abschluss können Sie das Replikat auf die gleiche Weise verwalten und überwachen wie jede andere Cloud SQL-Instanz.

Dieser Prozess wird nur für externe Server unterstützt, die so konfiguriert sind, dass sie die auf einer globalen Transaktions-ID (GTID) basierende Replikation verwenden. Bevor die Replikation initiiert werden kann, müssen Sie Daten vom externen Server in das Cloud SQL-Replikat laden. Wenn Sie keine GTID-basierte Replikation verwenden, kann Cloud SQL die genaue Position des binären Logs, ab der die Replikation beginnen soll, nicht identifizieren. Wenn Sie keine GITD-basierte Replikation verwenden können, müssen Sie Ihr Dump-Tool so konfigurieren, dass während des Dumpprozesses eine globale schreibgeschützte Sperre eingerichtet wird.

Vorbereitung

Für diesen Vorgang muss der externe Server konfiguriert, die Quelldarstellungsinstanz erstellt und das Cloud SQL-Replikat eingerichtet sein.

Berechtigungen für den Replikationsnutzer aktualisieren

Das Nutzerkonto für die Replikation auf dem externen Server ist so konfiguriert, dass Verbindungen von jedem Host (%) akzeptiert werden. Aktualisieren Sie dieses Nutzerkonto so, dass es nur mit dem Cloud SQL-Replikat verwendet werden kann. Öffnen Sie auf dem Quelldatenbankserver ein Terminal und geben Sie die folgenden Befehle ein:

MYSQL-Client

    UPDATE mysql.user
    SET Host='NEW_HOST' WHERE Host='OLD_HOST' AND User='USERNAME';
    GRANT REPLICATION SLAVE, EXECUTE ON *.*
    TO 'GCP_USERNAME'@'HOST';
    FLUSH PRIVILEGES;

Beispiel

UPDATE mysql.user
SET Host='192.0.2.0' WHERE Host='%' AND User='replicationUser';
GRANT REPLICATION SLAVE, EXECUTE ON *.*
TO 'gcp_user'@'gmail.com';
FLUSH PRIVILEGES;
Attribut Beschreibung
NEW_HOST Geben Sie die ausgehende IP des Cloud SQL-Replikats an.
OLD_HOST Der aktuelle, dem Host zugewiesene Wert, den Sie ändern möchten.
USERNAME Das Nutzerkonto für die Replikation auf dem externen Server.
GCP_USERNAME Der Nutzername für das GCP-Nutzerkonto.
HOST Der Hostname für das GCP-Nutzerkonto.

Cloud SQL-Replikat als primäre Instanz einrichten

Da Cloud SQL-Replikatinstanzen schreibgeschützt sind, müssen Sie für einen benutzerdefinierten Import das Cloud SQL-Replikat zu einer eigenständigen Instanz hochstufen. Nach Abschluss des anfänglichen Datenimports stufen Sie die Instanz wieder auf ein Replikat zurück.

Benutzerdefinierten Dump/Import durchführen

In diesem Abschnitt wird gezeigt, wie Sie die Dumpdatei erstellen und sie mithilfe des Clientdienstprogramms mydumper odermysqldump in das letztendliche Cloud SQL-Replikat importieren.

Beim Auslesen der Daten müssen Sie möglicherweise generische MySQL-Datenbanken, einschließlich mysql und sys, ausschließen, sofern sie auf der Quellinstanz vorhanden sind. Andernfalls schlägt der Datenimport fehl. Weitere Informationen finden Sie unter Datenbanken ausschließen oder einschließen.

mydumper und myloader verwenden

So erstellen Sie eine Dumpdatei und importieren sie in Cloud SQL:

  1. Erstellen Sie mit mydumper eine Dumpdatei der externen Serverdatenbank.

       $ mydumper -u USERNAME -p PASSWORD \
                  --threads=16 -o ./backup \
                  -h HOST \
                  --no-locks \
                  --regex '^(?!(mysql\.|sys\.))'
    
    Attribut Beschreibung
    USERNAME Der Name des Nutzerkontos für die Replikation oder der Name des Nutzerkontos mit Datenbankleseberechtigungen auf dem externen Server.
    PASSWORD Nutzerpasswort für die Replikation.
    HOST Die IPv4- oder DNS-Adresse des externen Servers.
  2. Importieren Sie die Daten mit myloader in die Cloud SQL-Instanz.

     $ myloader -u REPLICA_USERNAME -p REPLICA_PASSWORD \
                --threads=16 \
                -d ./backup -h HOST -o
    
    Attribut Beschreibung
    REPLICA_USERNAME Das Nutzerkonto in der Cloud SQL-Instanz.
    REPLICA_PASSWORD Nutzerpasswort für die Cloud SQL-Instanz.
    HOST Die IPv4-Adresse für die Cloud SQL-Instanz.
  3. Notieren Sie sich die GTID- oder binlog-Informationen des Datendumps. Sie benötigen diese Informationen, wenn Sie die Replikation mit den gespeicherten Prozeduren konfigurieren.

    Führen Sie den folgenden Befehl aus, um die GTID- oder binlog-Informationen der Datenverschiebung abzurufen:

      sudo cat ./backup/metadata
    

mysqldump verwenden

  1. Erstellen Sie einen Dump mithilfe von mysqldump:

    mysqldump

    mysqldump \
        --host=EXTERNAL_HOST \
        --port=EXTERNAL_PORT \
        --user=USERNAME\
        --password=PASSWORD \
        --databases=DATABASE_LIST  \
        --hex-blob \
        --master-data=EXTERNAL_DATA  \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        GTID_PURGED \
        ADD_DROP_TABLE \
        ROUTINES \
        COMPRESS \
        GZIP
    
    Attribut Beschreibung
    EXTERNAL_HOST Die IPv4- oder DNS-Adresse des externen Servers.
    EXTERNAL_PORT Der Port für den externen Server. Wenn der externe Server in Cloud SQL gehostet wird, lautet dieser Port 3306.
    USERNAME Der Name des Nutzerkontos für die Replikation oder der Name des Nutzerkontos mit Datenbankleseberechtigungen auf dem externen Server.
    USER_PASSWORD Nutzerpasswort für die Replikation.
    DATABASE_LIST Durch Leerzeichen getrennte Liste aller Datenbanken auf dem externen Server mit Ausnahme der Systemdatenbanken (sys, mysql, performance_schema und information_schema). Verwenden Sie den MySQL-Befehl SHOW DATABASES, um Ihre Datenbanken aufzulisten.
    EXTERNAL_DATA Wenn der externe Server GTID nicht unterstützt und Sie berechtigt sind, auf dessen globale Lesesperre zuzugreifen, verwenden Sie --master-data=1. Andernfalls sollten Sie dieses Attribut nicht nutzen.
    GTID_PURGED Wenn der externe Server GTID unterstützt, verwenden Sie --set-gtid-purged=on. Andernfalls sollten Sie dieses Attribut nicht nutzen.
    ADD_DROP_TABLE Wenn Sie vor jeder CREATE TABLE-Anweisung eine DROP TABLE-Anweisung einfügen möchten, fügen Sie --add-drop-table hinzu.
    ROUTINES Wenn Sie gespeicherte Routinen wie Prozeduren und Funktionen anzeigen lassen möchten, geben Sie in der Ausgabe für Dumpdatenbanken --routines an.
    COMPRESS Um alle Informationen zu komprimieren, die zwischen dem Cloud SQL-Replikat und dem externen Server gesendet werden, verwenden Sie --compress.
    GZIP Wenn Sie die Dumpdatei noch stärker komprimieren möchten, verwenden Sie | gzip. Verwenden Sie dies nicht, wenn Ihre Datenbank Daten enthält, die sich nicht gut komprimieren lassen, z. B. nicht komprimierbare Binärdaten oder JPG-Bilder.

    Beispiel

    mysqldump \
        --host=192.0.2.1 \
        --port=3306 \
        --user=replicationUser \
        --password \
        --databases guestbook journal \
        --hex-blob \
        --master-data=1 \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --compress \
        | gzip
    
  2. Notieren Sie sich die GTID- oder binlog-Informationen des Datendumps. Sie benötigen diese Informationen, um die Replikation mit den gespeicherten Prozeduren von Cloud SQL zu konfigurieren.

    Suchen Sie für GTID eine Zeile wie die folgende:

       SET @@GLOBAL.GTID_PURGED='32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496';
    

    Suchen Sie für binlog eine Zeile wie die folgende:

       CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360;
    
  3. Entfernen Sie die folgenden Zeilen in der Dumpdatei, die Superberechtigungen benötigen. Da Cloud SQL-Nutzer keine Superberechtigungen haben, führen diese Zeilen dazu, dass der Import fehlschlägt.

    Entfernen Sie bei der GTID-basierten Replikation die Anweisung SET GTID_PURGED zusammen mit der Anweisung zur Festlegung der Sitzungsvariablen im Dump. Beispiel:

       ...
       SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
       SET @@SESSION.SQL_LOG_BIN= 0;
       ...
       SET @@GLOBAL.GTID_PURGED='32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496';
       ...
       SET @@SESSION.SQL_LOG_BIN=@MYSQLDUMP_TEMP_LOG_BIN;
    

    Entfernen Sie bei der binlogbasierten Replikation die Anweisung CHANGE MASTER. Beispiel:

       ...
       CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360;
        ...
    
  4. Importieren Sie die Daten mit der mysql-Befehlszeile in das Cloud SQL-Replikat:

    mysql

    mysql -h REPLICA_HOST -u REPLICA_USER \
    -p REPLICA_DATABASE_NAME RESULT_FILE
    
    Attribut Beschreibung
    REPLICA_HOST Host, auf dem sich der MySQL-Server befindet.
    REPLICA_USER MySQL-Nutzername, der beim Herstellen einer Verbindung zum Server verwendet werden soll.
    REPLICA_DATABASE_NAME Name der Datenbank, in der sich die Daten befinden.
    RESULT_FILE Name der Dumpdatei, die importiert werden soll.

    Beispiel

      mysql -h 255.255.255.255 -u replica_username -p replica_db < result.sql
    

Sie können die Dumpdatei auch mithilfe eines Google Cloud-Buckets importieren. Weitere Informationen dazu erhalten Sie unter Daten aus einer SQL-Dumpdatei in Cloud SQL importieren.

Cloud SQL-Instanz zurückstufen

Um die Cloud SQL-Instanz auf ein Cloud SQL-Replikat zurückzustufen, verwenden Sie auf der Instanz die Methode demoteMaster.

  1. Bereiten Sie eine JSON-Anfragedatei mit dem Namen der Instanz vor, die Sie zurückstufen möchten.

    Source JSON

     {
        "demoteMasterContext": {
          "masterInstanceName": SOURCE_REPRESENTATION_INSTANCE_NAME,
          "skipReplicationSetup": true
          }
     }
    
    Attribut Beschreibung
    SOURCE_REPRESENTATION_INSTANCE_NAME Der Name der Quelldarstellungsinstanz.

    Beispiel

       {
         "demoteMasterContext": {
           "masterInstanceName": "cloudsql-source-instance",
           "skipReplicationSetup": true
         }
       }
    
  2. Öffnen Sie ein Terminal und rufen Sie mit den folgenden Befehlen demoteMaster auf:

    curl

      gcloud auth login
      ACCESS_TOKEN="$(gcloud auth print-access-token)"
      curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
        --header 'Content-Type: application/json' \
        --data @JSON_PATH \
        -X POST \
      https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE-NAME/demoteMaster
    
    Attribut Beschreibung
    JSON_PATH Der Pfad zur Datei JSON.
    PROJECT_ID Die ID Ihres Projekts in Google Cloud.
    INSTANCE-NAME Der Name der Instanz, die zurückgestuft werden soll.

    Beispiel

       gcloud auth login
       ACCESS_TOKEN="$(gcloud auth print-access-token)"
       curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @./source.json \
         -X POST \
       https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-replica-instance/demoteMaster
    

Was Sie nach dem Abschluss sehen sollten

Rufen Sie die Seite Cloud SQL-Instanzen auf, um zu prüfen, ob die Instanzen korrekt eingerichtet wurden.

Sie sollten die Quelldarstellungsinstanz und das Cloud SQL-Replikat sehen. Sie sehen etwa so aus:

Instanz-ID Typ Öffentliche IP-Adresse
(-) source-representation-instance Externe primäre MySQL-Instanz 10.68.48.3:3306
     Replikatinstanz MySQL-Lesereplikat 34.66.48.59

Replikation in der Cloud SQL-Instanz starten

In diesem Schritt werden gespeicherte Prozeduren von Cloud SQL verwendet. Die gespeicherten Prozeduren von Cloud SQL werden nach dem Aufruf der demoteMaster-Anfrage installiert. Nach dem Aufruf von promoteReplica werden Sie wieder entfernt. Weitere Informationen finden Sie unter Gespeicherte Prozeduren für die Replikationsverwaltung.

  1. Melden Sie sich bei der Replikatinstanz an. Weitere Informationen finden Sie unter Verbindung mithilfe eines Datenbankclients von einem lokalen Computer herstellen.
  2. Verwenden Sie die gespeicherte Prozedur mysql.resetMaster, um die Replikationseinstellungen zurückzusetzen.

     mysql> call mysql.resetMaster();
    
  3. Konfigurieren Sie die Replikation. Für diesen Schritt sind die zuvor notierten GTID- oder binlog-Informationen erforderlich.

    GTID

    1. Konfigurieren Sie das Feld gtid_purged mit der gespeicherten Prozedur mysql.skipTransactionWithGtid(GTID_TO_SKIP).
    Attribut Beschreibung
    GTID_TO_SKIP Der GTID-Satzwert, der konfiguriert werden soll.

    Beispiel:

        mysql> call mysql.skipTransactionWithGtid('32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496');
    

    1. Führen Sie die gespeicherte Prozedur mysql.setupExternalSourceAutoPosition(HOST, PORT, USER_NAME, USER_PASSWORD, MASTER_AUTO_POSITION, USE_SSL, USE_SSL_CLIENT_AUTH) aus.
    Attribut Beschreibung
    HOST Quellendpunkt.
    PORT Quellport.
    USER_NAME Quellnutzer.
    USER_PASSWORD Quellnutzerpasswort.
    MASTER_AUTO_POSITION Wert des Parameters master_auto_position. Folgende Werte sind möglich: 0, 1.
    USE_SSL Legt fest, ob die SSL-basierte Replikation verwendet werden soll. Folgende Werte sind möglich: true, false. Für true müssen Sie das Feld caCertificate in der DemoteMaster-Anfrage festlegen.
    USE_SSL_CLIENT_AUTH Legt fest, ob die SSL-Clientauthentifizierung verwendet werden soll. Folgende Werte sind möglich: true, false. Für true müssen Sie die Felder clientKey und clientCertificates in der demoteMaster-Anfrage festlegen.
        mysql> call mysql.setupExternalSourceAutoPosition('1.1.1.1', 3306, \
        'USERNAME', 'PASSWORD', \
        /* master_auto_position= */ 1,false, false); \
    

    binlog

    Führen Sie die gespeicherte Prozedur mysql.setupExternalSource(HOST, PORT, USER_NAME, USER_PASSWORD, SOURCE_LOG_NAME, SOURCE_LOG_POS, USE_SSL, USE_SSL_CLIENT_AUTH) aus.

    Attribut Beschreibung
    HOST Quellendpunkt.
    PORT Quellport.
    USER_NAME Quellnutzer.
    USER_PASSWORD Quellnutzerpasswort.
    SOURCE_LOG_NAME Der Name des binären Logs auf der Quelldatenbankinstanz, die die Replikationsinformationen enthält.
    SOURCE_LOG_POS Der Speicherort im Binärlog mysql_binary_log_file_name, an dem die Replikation mit dem Lesen der Replikationsinformationen startet.
    USE_SSL Legt fest, ob die SSL-basierte Replikation verwendet werden soll. Folgende Werte sind möglich: true, false. Für true müssen Sie das Feld caCertificate in der DemoteMaster-Anfrage festlegen.
    USE_SSL_CLIENT_AUTH Legt fest, ob die SSL-Clientauthentifizierung verwendet werden soll. Folgende Werte sind möglich: true, false. Für true müssen Sie die Felder clientKey und clientCertificates in der demoteMaster-Anfrage festlegen.
        mysql> call mysql.setupExternalSource('1.1.1.1', 3306, \
        'user_name', 'password', 'mysql-bin-changelog.033877', 360, \
        false, false);
    
  4. Verwenden Sie die gespeicherte Prozedur mysql.startReplication(), um die Replikation aus der externen Datenbank zu starten.

       mysql> call mysql.startReplication();
    
  5. Prüfen Sie den Replikationsstatus. Achten Sie darauf, dass sowohl für das Feld Slave_IO_Running als auch für das Feld Slave_SQL_Running der Wert YES gilt.

       mysql> show slave status\G
    

    Die Ausgabe dieses Befehls sieht in etwa so aus:

       *************************** 1. row ***************************
                       Slave_IO_State: Waiting for master to send event
                          Master_Host: 1.1.1.1
                          Master_User: user_name
                          Master_Port: 3306
                        Connect_Retry: 60
                      Master_Log_File: mysql-bin-changelog.000001
                  Read_Master_Log_Pos: 1
                       Relay_Log_File: relay-log.000002
                        Relay_Log_Pos: 1
                Relay_Master_Log_File: mysql-bin-changelog.000001
                     Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes
                      Replicate_Do_DB:
                  Replicate_Ignore_DB:
                   Replicate_Do_Table:
               Replicate_Ignore_Table:
              Replicate_Wild_Do_Table:
          Replicate_Wild_Ignore_Table: mysql.%
                           Last_Errno: 0
                           Last_Error:
                         Skip_Counter: 0
                  Exec_Master_Log_Pos: 412
                      Relay_Log_Space: 752
                      Until_Condition: None
                       Until_Log_File:
                        Until_Log_Pos: 0
                   Master_SSL_Allowed: No
                   Master_SSL_CA_File:
                   Master_SSL_CA_Path:
                      Master_SSL_Cert:
                    Master_SSL_Cipher:
                       Master_SSL_Key:
                Seconds_Behind_Master: 0
        Master_SSL_Verify_Server_Cert: No
                        Last_IO_Errno: 0
                        Last_IO_Error:
                       Last_SQL_Errno: 0
                       Last_SQL_Error:
          Replicate_Ignore_Server_Ids:
                     Master_Server_Id: 1509941531
                          Master_UUID: 1cb2c80e-90f0-11eb-9ea3-02389b1c2e6f
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all r
               Master_Retry_Count: 86400
                      Master_Bind:
          Last_IO_Error_Timestamp:
         Last_SQL_Error_Timestamp:
                   Master_SSL_Crl:
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set:
                Executed_Gtid_Set: 478af53c-bd24-11eb-be72-42010a80002a:1-226
                    Auto_Position: 0
       1 row in set (0.00 sec)
    

Mit Replikation fortfahren

Nachdem Sie die Replikation vom externen Server gestartet haben, müssen Sie die Replikation überwachen und dann die Migration ausführen. Weitere Informationen finden Sie unter Replikation überwachen.

Fehlerbehebung

Problem Fehlerbehebung
Lost connection to MySQL server during query when dumping table. Die Quelle war möglicherweise nicht mehr verfügbar oder der Dump enthielt zu große Pakete.

Sorgen Sie dafür, dass die externe primäre Instanz für die Verbindungsherstellung verfügbar ist. Sie können die Werte der Flags net_read_timeout und net_write_timeout auf der Quellinstanz auch ändern, um den Fehler zu beenden. Weitere Informationen zu den zulässigen Werten für diese Flags finden Sie unter Datenbank-Flags konfigurieren.

Weitere Informationen zur Verwendung von mysqldump-Flags für die verwaltete Importmigration finden Sie unter Zulässige und standardmäßige Flags für die erste Synchronisierung.

Die erste Datenmigration war erfolgreich, aber es werden keine Daten repliziert. Dies kann daran liegen, dass in der Quelldatenbank bestimmte Replikations-Flags definiert sind, die die Replikation von manchen oder allen Datenbankänderungen verhindern.

Achten Sie darauf, dass Replikations-Flags wie binlog-do-db, binlog-ignore-db, replicate-do-db und replicate-ignore-db nicht so festgelegt sind, dass sie Konflikte verursachen.

Führen Sie den Befehl show master status in der primären Instanz aus, um die aktuellen Einstellungen aufzurufen.

Die Datenmigration verlief anfangs erfolgreich, danach jedoch nicht mehr. Versuchen Sie Folgendes:

  • Prüfen Sie die Replikationsmesswerte für Ihre Replikatinstanz im Bereich "Cloud Monitoring" der Google Cloud Console.
  • Die Fehler aus dem MySQL-E/A-Thread oder dem SQL-Thread finden Sie unter Cloud Logging in den mysql.err log-Dateien.
  • Dieser Fehler kann auch auftreten, wenn eine Verbindung zur Replikatinstanz hergestellt wird. Führen Sie den Befehl SHOW SLAVE STATUS aus und suchen Sie in der Ausgabe nach folgenden Feldern:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full. Das Datenlaufwerk der Replikatinstanz ist voll.

Erhöhen Sie die Laufwerkgröße der Replikatinstanz. Sie können die Laufwerkgröße manuell erhöhen oder die automatische Speichererweiterung aktivieren.

Replikationslogs prüfen

Beim Prüfen der Replikationseinstellungen werden Logs erstellt.

So können Sie diese Logs abrufen:

  1. Rufen Sie in der Google Cloud Console die Loganzeige auf.

    Zur Loganzeige

  2. Wählen Sie aus dem Drop-down-Menü Instanz das Cloud SQL-Replikat aus.
  3. Wählen Sie die Logdatei replication-setup.log aus.

Prüfen Sie, ob Folgendes zutrifft, wenn das Cloud SQL-Replikat keine Verbindung zum externen Server herstellen kann.

  • Jede Firewall auf dem externen Server ist so konfiguriert, dass Verbindungen von der ausgehenden IP-Adresse des Cloud SQL-Replikats zugelassen sind.
  • Ihre SSL/TLS-Konfiguration ist korrekt.
  • Nutzername, Host und Passwort des Nutzerkontos für die Replikation sind korrekt.

Nächste Schritte