Google Cloud SQL til MySQL er en fuldt administreret databasetjeneste, der hjælper dig med at opsætte, vedligeholde, administrere og administrere dine MySQL-relationsdatabaser på Google Cloud Platform. Der er dog forskelle mellem Cloud SQL og standard MySQL-funktionalitet som begrænset kontrol, begrænsede ressourcer, datalokalitet, budget og sikkerhed, hvilket kan påvirke din endelige beslutning om at flytte ud fra Google Cloud SQL-instanserne og være vært for databasetjenesten i on- lokalernes infrastruktur i stedet.
Dette blogindlæg vil guide dig gennem, hvordan du udfører online migrering fra Google Cloud SQL til en lokal server. Vores måldatabase på den lokale server er en Debian-server, men trinene og procedurerne gælder for andre versioner af Linux, så længe pakkerne er korrekt installeret.
Vores Google Cloud MySQL-instans kører på MySQL 5.7, og det, vi har brug for, er:
- En replikeringsslavebruger oprettet på masteren.
- Slaven skal installeres med samme hovedversion som masteren.
- SSL skal være aktiveret til geografisk replikering af sikkerhedsmæssige årsager.
Da Google Cloud som standard aktiverede GTID-replikering til MySQL, vil vi lave en migrering baseret på dette replikeringsskema. Derfor bør instruktionerne beskrevet i dette indlæg også fungere i MySQL 8.0-forekomster.
Oprettelse af en replikeringsslavebruger
Først og fremmest skal vi oprette en replikeringsslavebruger på vores Google Cloud SQL-instans. Log ind på Google Cloud Platform -> Databaser -> SQL -> vælg MySQL-forekomsten -> Brugere -> Tilføj brugerkonto, og indtast de nødvendige detaljer:
202.187.194.255 er den offentlige slave-IP-adresse, der findes i vores on- lokaler, der kommer til at replikere fra denne instans. Som du kan se, er der ingen privilegiekonfiguration, da brugere oprettet fra denne grænseflade vil have de højeste privilegier, Google Cloud SQL kan tilbyde (næsten alt undtagen SUPER og FILE). For at bekræfte privilegierne kan vi bruge følgende kommando:
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
Det ser ud til, at vores slavebruger har den nødvendige tilladelse til at køre som slave (REPLICATION SLAVE).
Tag en mysqldump-sikkerhedskopi
Før vi opretter en ekstern mysqldump-sikkerhedskopi, skal vi konfigurere klientens SSL-certifikater på grund af risikoen for at forbinde instansen via et offentligt netværk. For at gøre dette skal du gå til Forbindelser -> Konfigurer SSL-klientcertifikater -> Opret et klientcertifikat:
Download ovenstående filer (server-ca.pem, client-cert. pem og client-key.pem) og gem dem inde på slaveserveren. Vi vil bruge disse certifikater til at oprette forbindelse til masteren sikkert fra slaveserven. For at forenkle processen vil alle ovenstående certifikater og nøglefiler blive placeret i en mappe kaldet "gcloud-certs":
$ mkdir -p /root/gcloud-certs # put the certs/key here
Sørg for, at tilladelserne er korrekte, især den private nøglefil, client-key.pem:
$ chmod 600 /root/gcloud-certs/client-key.pem
Nu er vi klar til at tage en mysqldump-sikkerhedskopi fra vores Google Cloud SQL MySQL 5.7-instans sikkert:
$ 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
Du bør få følgende advarsel:
"Advarsel:Et delvist dump fra en server, der har GTID'er, vil som standard inkludere GTID'erne for alle transaktioner, også dem, der ændrede undertrykte dele af databasen. Hvis du ikke vil gendan GTID'er, pass --set-gtid-purged=OFF. For at lave et komplet dump skal du sende --all-databases --triggers --rutiner --hændelser."
Ovenstående advarsel opstår, fordi vi sprang over at definere flaget --events, som kræver SUPER-privilegiet. Den root-bruger, der er oprettet for hver Google Cloud SQL-instans, kommer ikke med FILE- og SUPER-rettigheder. Dette er en af ulemperne ved at bruge denne metode, at MySQL-begivenheder ikke kan importeres fra Google Cloud SQL.
Konfiguration af slaveserveren
På slaveserveren skal du installere MySQL 5.7 til Debian 10:
$ 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
Føj derefter følgende linjer under [mysqld]-sektionen inde i /etc/mysql/my.cnf (eller enhver anden relevant MySQL-konfigurationsfil):
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
Genstart MySQL-serveren for at anvende ovenstående ændringer:
$ systemctl restart mysql
Gendan mysqldump-sikkerhedskopien på denne server:
$ mysql -uroot -p < fullbackup.sql
På dette tidspunkt bør MySQL root-adgangskoden for slaveserveren være identisk med den i Google Cloud SQL. Du skal logge ind med en anden root-adgangskode fra nu af.
Bemærk, at root-brugeren i Google Cloud ikke har fulde rettigheder. Vi er nødt til at lave nogle ændringer på slavesiden, ved at tillade root-brugeren at have alle privilegier inde i MySQL, da vi har mere kontrol over denne server. For at gøre dette skal vi opdatere MySQL's brugertabel. Log ind på slavens MySQL-server som MySQL-rodbruger og kør følgende sætning:
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
Skyl privilegietabellen:
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Afslut den aktuelle terminal og log på igen. Kør følgende kommando for at bekræfte, at root-brugeren nu har det højeste niveau af privilegier:
mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------------------------------+
| Grants for [email protected] |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
Opsætning af replikeringslinket
Af sikkerhedsmæssige årsager skal replikeringsslavebrugeren oprette forbindelse til masterværten (Google Cloud-forekomst) via en SSL-krypteret kanal. Derfor er vi nødt til at forberede SSL-nøglen og certifikatet med korrekt tilladelse og tilgængelig for mysql-brugeren. Kopier gcloud-mappen til /etc/mysql og tildel den korrekte tilladelse og ejerskab:
$ mkdir -p /etc/mysql
$ cp /root/gcloud-certs /etc/mysql
$ chown -Rf mysql:mysql /etc/mysql/gcloud-certs
Konfigurer replikeringslinket som nedenfor på slaveserveren:
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 derefter replikeringsslaven:
mysql> START SLAVE;
Bekræft outputtet som følgende:
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:
Sørg for, at værdierne Slave_IO_Running og Slave_SQL_Running er 'Yes', samt at Seconds_Behind_Master skal være 0, hvilket betyder, at slaven har indhentet masteren. Bemærk, at Executed_Gtid_Set har to GTID'er:
- 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664
- b1dabe58-14e6-11eb-840f-0800278dc04d:1-2
Det første GTID repræsenterer ændringerne, der kommer fra den aktuelle master (Google Cloud SQL-instans), mens det andet GTID repræsenterer de ændringer, vi har foretaget, da vi ændrede privilegierne for MySQL-rootbrugeren på slaveværten. Vær opmærksom på det første GTID for at se, om databasen replikerer korrekt (heltalsdelen skal stige under replikering).
Bekræft, om vores slavevært er en del af replikationen fra mesterens synspunkt. Log ind på SQL Cloud-forekomsten som 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
Og kør følgende sætning:
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
På dette tidspunkt kan du planlægge dit næste træk for at omdirigere databasens arbejdsbyrde fra applikationerne til denne slaveserver som den nye master og afvikle den gamle master i Google Cloud.
Sidste tanker
Du kan udføre en online migrering fra Google Cloud SQL til MySQL til en lokal server uden meget besvær. Dette giver dig mulighed for at flytte din database uden for cloud-leverandørerne for privatliv og kontrol, når det rigtige tidspunkt er inde.