sql >> Database >  >> RDS >> Mysql

Migreren van Google Cloud SQL voor MySQL naar een lokale server

Google Cloud SQL voor MySQL is een volledig beheerde databaseservice waarmee u uw relationele MySQL-databases op Google Cloud Platform kunt instellen, onderhouden, beheren en beheren. Er zijn echter verschillen tussen Cloud SQL en standaard MySQL-functionaliteit, zoals beperkte controle, beperkte bronnen, gegevenslocatie, budget en beveiliging, die van invloed kunnen zijn op uw uiteindelijke beslissing om de Google Cloud SQL-instanties te verlaten en de databaseservice te hosten in de on- gebouweninfrastructuur in plaats daarvan.

In deze blogpost wordt uitgelegd hoe u een online migratie uitvoert van Google Cloud SQL naar een on-premises server. Onze doeldatabase op de on-premises server is een Debian-server, maar de stappen en procedures zijn van toepassing op andere versies van Linux en zolang de pakketten correct zijn geïnstalleerd.

Onze Google Cloud MySQL-instantie draait op MySQL 5.7 en wat we nodig hebben is:

  • Een replicatie-slave-gebruiker gemaakt op de master.
  • De slave moet worden geïnstalleerd met dezelfde hoofdversie als de master.
  • SSL moet om veiligheidsredenen zijn ingeschakeld voor geografische replicatie.

Aangezien Google Cloud standaard GTID-replicatie voor MySQL heeft ingeschakeld, gaan we een migratie uitvoeren op basis van dit replicatieschema. Daarom zouden de instructies die in dit bericht worden beschreven ook moeten werken in MySQL 8.0-instanties.

Een replicatieslave-gebruiker maken

Allereerst moeten we een replicatieslave-gebruiker maken op onze Google Cloud SQL-instantie. Log in op het Google Cloud Platform -> Databases -> SQL -> kies de MySQL-instantie -> Gebruikers -> Gebruikersaccount toevoegen en voer de vereiste gegevens in:

De 202.187.194.255 is het openbare IP-adres van de slaaf in onze on- gebouwen die van deze instantie gaan repliceren. Zoals u kunt zien, is er geen configuratie van privileges, aangezien gebruikers die vanuit deze interface zijn gemaakt, de hoogste privileges hebben die Google Cloud SQL kan bieden (bijna alles behalve SUPER en FILE). Om de privileges te verifiëren, kunnen we de volgende opdracht gebruiken:

mysql> SHOW GRANTS FOR [email protected]\G
*************************** 1. row ***************************
Grants for [email protected]: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, 
DROP, RELOAD, SHUTDOWN, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, 
CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, 
CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, 
CREATE TABLESPACE ON *.* TO 'slave'@'202.187.194.255' WITH GRANT OPTION

Het lijkt erop dat onze slave-gebruiker de vereiste toestemming heeft om als slave te werken (REPLICATION SLAVE).

Een mysqldump-back-up maken

Voordat we een externe mysqldump-back-up maken, moeten we de SSL-certificaten van de client configureren vanwege het risico om de instantie via een openbaar netwerk te verbinden. Ga hiervoor naar Verbindingen -> SSL-clientcertificaten configureren -> Een clientcertificaat maken:

Download de bovenstaande bestanden (server-ca.pem, client-cert. pem en client-key.pem) en sla ze op in de slave-server. We gaan deze certificaten gebruiken om vanaf de slave-server veilig verbinding te maken met de master. Om het proces te vereenvoudigen, worden alle bovenstaande certificaten en het sleutelbestand in een map met de naam "gcloud-certs" geplaatst:

$ mkdir -p /root/gcloud-certs # put the certs/key here

Zorg ervoor dat de rechten correct zijn, vooral het privésleutelbestand, client-key.pem:

$ chmod 600 /root/gcloud-certs/client-key.pem

Nu zijn we klaar om veilig een mysqldump-back-up te maken van onze Google Cloud SQL MySQL 5.7-instantie:

$ mysqldump -uroot -p \
-h 35.198.197.171 \
--ssl-ca=/root/gcloud-certs/server-ca.pem \
--ssl-cert=/root/gcloud-certs/client-cert.pem \
--ssl-key=/root/gcloud-certs/client-key.pem \
--single-transaction \
--all-databases \
--triggers \
--routines > fullbackup.sql

U zou de volgende waarschuwing moeten krijgen:

"Waarschuwing:een gedeeltelijke dump van een server die GTID's heeft, bevat standaard de GTID's van alle transacties, zelfs de transacties die onderdrukte delen van de database hebben gewijzigd. Als u dat niet wilt herstel GTID's, geef --set-gtid-purged=OFF door. Om een ​​volledige dump te maken, geef --all-databases --triggers --routines --events door."

De bovenstaande waarschuwing treedt op omdat we het definiëren van de vlag --events hebben overgeslagen, waarvoor het SUPER-privilege vereist is. De rootgebruiker die voor elke Google Cloud SQL-instantie is gemaakt, heeft geen FILE- en SUPER-rechten. Dit is een van de nadelen van het gebruik van deze methode, dat MySQL-gebeurtenissen niet kunnen worden geïmporteerd uit Google Cloud SQL.

De slaveserver configureren

Installeer MySQL 5.7 voor Debian 10 op de slave-server:

$ echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list
$ apt-key adv --keyserver pgp.mit.edu --recv-keys 5072E1F5
$ apt update
$ apt -y install mysql-community-server

Voeg vervolgens de volgende regels toe onder de sectie [mysqld] in /etc/mysql/my.cnf (of een ander relevant MySQL-configuratiebestand):

server-id = 1111 # different value than the master
log_bin = binlog
log_slave_updates = 1
expire_logs_days = 7
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = 1
sync_binlog = 1
report_host = 202.187.194.255 # IP address of this slave

Start de MySQL-server opnieuw om de bovenstaande wijzigingen toe te passen:

$ systemctl restart mysql

Herstel de mysqldump-back-up op deze server:

$ mysql -uroot -p < fullbackup.sql

Op dit moment moet het MySQL-rootwachtwoord van de slaveserver identiek zijn aan dat in Google Cloud SQL. Je moet vanaf nu inloggen met een ander root-wachtwoord.

Houd er rekening mee dat de rootgebruiker in Google Cloud geen volledige rechten heeft. We moeten enkele wijzigingen aanbrengen aan de slave-kant, door de rootgebruiker alle rechten binnen MySQL te geven, aangezien we meer controle hebben over deze server. Om dit te doen, moeten we de gebruikerstabel van MySQL bijwerken. Log in op de MySQL-server van de slave als MySQL-rootgebruiker en voer de volgende instructie uit:

mysql> UPDATE mysql.user SET Super_priv = 'Y', File_priv = 'Y' WHERE User = 'root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Flush de privilegetabel:

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Verlaat de huidige terminal en log opnieuw in. Voer de volgende opdracht uit om te controleren of de rootgebruiker nu het hoogste niveau van rechten heeft:

mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------------------------------+
| Grants for [email protected]                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+

De replicatielink instellen

Om veiligheidsredenen moet de replicatieslave-gebruiker verbinding maken met de masterhost (Google Cloud-instantie) via een SSL-gecodeerd kanaal. Daarom moeten we de SSL-sleutel en het certificaat voorbereiden met de juiste toestemming en toegankelijk voor de mysql-gebruiker. Kopieer de gcloud-map naar /etc/mysql en wijs de juiste toestemming en eigendom toe:

$ mkdir -p /etc/mysql
$ cp /root/gcloud-certs /etc/mysql
$ chown -Rf mysql:mysql /etc/mysql/gcloud-certs

Configureer op de slave-server de replicatielink zoals hieronder:

mysql> CHANGE MASTER TO MASTER_HOST = '35.198.197.171', 
MASTER_USER = 'slave', 
MASTER_PASSWORD = 'slavepassword', 
MASTER_AUTO_POSITION = 1, 
MASTER_SSL = 1, 
MASTER_SSL_CERT = '/etc/mysql/gcloud-certs/client-cert.pem', 
MASTER_SSL_CA = '/etc/mysql/gcloud-certs/server-ca.pem', 
MASTER_SSL_KEY = '/etc/mysql/gcloud-certs/client-key.pem';

Start vervolgens de replicatieslave:

mysql> START SLAVE;

Controleer de uitvoer als volgt:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 35.198.197.171
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1120160
               Relay_Log_File: puppet-master-relay-bin.000002
                Relay_Log_Pos: 15900
        Relay_Master_Log_File: mysql-bin.000003
             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:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1120160
              Relay_Log_Space: 16115
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /etc/mysql/gcloud-certs/server-ca.pem
           Master_SSL_CA_Path:
              Master_SSL_Cert: /etc/mysql/gcloud-certs/client-cert.pem
            Master_SSL_Cipher:
               Master_SSL_Key: /etc/mysql/gcloud-certs/client-key.pem
        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: 2272712871
                  Master_UUID: 8539637e-14d1-11eb-ae3c-42010a94001a
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:5611-5664
            Executed_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664,
b1dabe58-14e6-11eb-840f-0800278dc04d:1-2
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:

Zorg ervoor dat de Slave_IO_Running en Slave_SQL_Running waarden 'Ja' zijn, en dat Seconds_Behind_Master 0 moet zijn, wat betekent dat de slave de master heeft ingehaald. Merk op dat de Executed_Gtid_Set twee GTID's heeft:

  • 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664
  • b1dabe58-14e6-11eb-840f-0800278dc04d:1-2

De eerste GTID vertegenwoordigt de wijzigingen die afkomstig zijn van de huidige master (Google Cloud SQL-instantie), terwijl de tweede GTID de wijzigingen vertegenwoordigt die we hebben aangebracht toen we de privileges voor de MySQL-rootgebruiker op de slave-host wijzigden. Let op de eerste GTID om te zien of de database correct wordt gerepliceerd (het integer-gedeelte zou moeten toenemen tijdens het repliceren).

Controleer of onze slave-host deel uitmaakt van de replicatie vanuit het oogpunt van de master. Log in op de SQL Cloud-instantie als root:

$ mysql -uroot -p \
-h 35.198.197.171 \
--ssl-ca=/root/gcloud-certs/server-ca.pem \
--ssl-cert=/root/gcloud-certs/client-cert.pem \
--ssl-key=/root/gcloud-certs/client-key.pem

En voer het volgende statement uit:

mysql> SHOW SLAVE HOSTS;
*************************** 1. row ***************************
 Server_id: 1111
      Host: 202.187.194.255
      Port: 3306
 Master_id: 2272712871
Slave_UUID: b1dabe58-14e6-11eb-840f-0800278dc04d

Op dit punt kunt u uw volgende stap plannen om de database-workload van de applicaties om te leiden naar deze slave-server als de nieuwe master en de oude master buiten gebruik te stellen in Google Cloud.

Laatste gedachten

U kunt zonder veel gedoe een online migratie uitvoeren van Google Cloud SQL voor MySQL naar een on-premises server. Dit geeft u de mogelijkheid om uw database buiten de cloudleveranciers te plaatsen voor privacy en controle wanneer het juiste moment is gekomen.


  1. kan ik een alleen-lezen database openen vanuit de res/asset-map in Android zonder te kopiëren naar de databasemap?

  2. Voorwaardelijke bestelling door

  3. Deadlocks in PostgreSQL bij het uitvoeren van UPDATE

  4. MySQL-groep per SUM