sql >> Databáze >  >> RDS >> Mysql

Migrace Google Cloud SQL pro MySQL na On-Prem Server

Google Cloud SQL pro MySQL je plně spravovaná databázová služba, která vám pomůže nastavit, udržovat, spravovat a spravovat vaše relační databáze MySQL na platformě Google Cloud Platform. Mezi Cloud SQL a standardní funkcí MySQL však existují rozdíly, jako je omezená kontrola, omezené zdroje, datová lokalita, rozpočet a zabezpečení, které mohou ovlivnit vaše konečné rozhodnutí odejít z instancí Google Cloud SQL a hostit databázovou službu na místo toho infrastruktura prostor.

Tento blogový příspěvek vás provede online migrací z Google Cloud SQL na místní server. Naší cílovou databází na místním serveru je server Debian, ale kroky a postupy platí i pro ostatní verze Linuxu, pokud jsou balíčky správně nainstalovány.

Naše instance Google Cloud MySQL běží na MySQL 5.7 a potřebujeme:

  • Replikační podřízený uživatel vytvořený na hlavním serveru.
  • Podřízená jednotka musí být nainstalována se stejnou hlavní verzí jako hlavní.
  • Pro geografickou replikaci musí být z bezpečnostních důvodů povoleno SSL.

Vzhledem k tomu, že Google Cloud ve výchozím nastavení umožňoval replikaci GTID pro MySQL, provedeme migraci založenou na tomto schématu replikace. Pokyny popsané v tomto příspěvku by tedy měly fungovat i v instancích MySQL 8.0.

Vytvoření podřízeného uživatele replikace

Nejprve musíme vytvořit replikačního slave uživatele v naší instanci Google Cloud SQL. Přihlaste se do Google Cloud Platform -> Databáze -> SQL -> vyberte instanci MySQL -> Uživatelé -> Přidat uživatelský účet a zadejte požadované údaje:

202.187.194.255 je podřízená veřejná IP adresa umístěná v našem on- prostory, které se budou z této instance replikovat. Jak vidíte, neexistuje žádná konfigurace oprávnění, protože uživatelé vytvoření z tohoto rozhraní budou mít nejvyšší oprávnění, která může Google Cloud SQL nabídnout (téměř vše kromě SUPER a FILE). K ověření oprávnění můžeme použít následující příkaz:

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

Zdá se, že náš uživatel typu slave má požadované oprávnění ke spuštění jako slave (REPLICATION SLAVE).

Provedení zálohy mysqldump

Než vytvoříme externí zálohu mysqldump, musíme nakonfigurovat SSL certifikáty klienta kvůli riziku připojení instance přes veřejnou síť. Chcete-li to provést, přejděte na Připojení -> Konfigurace klientských certifikátů SSL -> Vytvořit klientský certifikát:

Stáhněte si výše uvedené soubory (server-ca.pem, client-cert. pem a client-key.pem) a uložte je na podřízeném serveru. Tyto certifikáty použijeme k bezpečnému připojení k hlavnímu zařízení z podřízeného serveru. Pro zjednodušení procesu budou všechny výše uvedené certifikáty a klíčový soubor umístěny do adresáře s názvem „gcloud-certs“:

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

Ujistěte se, že jsou správná oprávnění, zejména soubor soukromého klíče client-key.pem:

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

Nyní jsme připraveni bezpečně provést zálohu mysqldump z naší instance Google Cloud SQL MySQL 5.7:

$ 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

Mělo by se zobrazit následující varování:

"Upozornění:Částečný výpis ze serveru, který má GTID, bude ve výchozím nastavení obsahovat GTID všech transakcí, dokonce i těch, které změnily potlačené části databáze. Pokud nechcete obnovte GTID, předejte --set-gtid-purged=OFF. Chcete-li vytvořit úplný výpis, předejte --all-databases --triggers --routines --events.“

Výše uvedené varování se objevuje, protože jsme přeskočili definování příznaku --events, který vyžaduje oprávnění SUPER. Uživatel root vytvořený pro každou instanci Google Cloud SQL nemá oprávnění FILE a SUPER. To je jedna z nevýhod použití této metody, že události MySQL nelze importovat z Google Cloud SQL.

Konfigurace podřízeného serveru

Na podřízeném serveru nainstalujte MySQL 5.7 pro 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

Potom přidejte následující řádky do sekce [mysqld] uvnitř /etc/mysql/my.cnf (nebo jakéhokoli jiného relevantního konfiguračního souboru MySQL):

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

Chcete-li použít výše uvedené změny, restartujte server MySQL:

$ systemctl restart mysql

Obnovte zálohu mysqldump na tomto serveru:

$ mysql -uroot -p < fullbackup.sql

V tuto chvíli by mělo být kořenové heslo MySQL podřízeného serveru totožné s heslem v Google Cloud SQL. Od této chvíle byste se měli přihlašovat jiným heslem root.

Upozorňujeme, že uživatel root ve službě Google Cloud nemá úplná oprávnění. Musíme provést nějaké úpravy na straně slave tím, že umožníme uživateli root mít všechna oprávnění v MySQL, protože máme nad tímto serverem větší kontrolu. K tomu potřebujeme aktualizovat uživatelskou tabulku MySQL. Přihlaste se k podřízenému serveru MySQL jako uživatel root MySQL a spusťte následující příkaz:

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

Vyprázdnit tabulku oprávnění:

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

Opusťte aktuální terminál a znovu se přihlaste. Spuštěním následujícího příkazu ověřte, že uživatel root má nyní nejvyšší úroveň oprávnění:

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

Nastavení replikačního odkazu

Z bezpečnostních důvodů se musí podřízený uživatel replikace připojit k hlavnímu hostiteli (instanci Google Cloud) prostřednictvím kanálu šifrovaného SSL. Proto musíme připravit klíč a certifikát SSL se správným oprávněním a přístupné uživateli mysql. Zkopírujte adresář gcloud do /etc/mysql a přiřaďte správná oprávnění a vlastnictví:

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

Na podřízeném serveru nakonfigurujte odkaz na replikaci, jak je uvedeno níže:

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';

Potom spusťte podřízenou replikaci:

mysql> START SLAVE;

Ověřte výstup takto:

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:

Ujistěte se, že hodnoty Slave_IO_Running a Slave_SQL_Running jsou 'Yes' a Seconds_Behind_Master by měly být 0, což znamená, že slave dohonil master. Všimněte si, že Executed_Gtid_Set má dvě GTID:

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

První GTID představuje změny pocházející z aktuálního hlavního serveru (instance Google Cloud SQL), zatímco druhé GTID představuje změny, které jsme provedli, když jsme upravili oprávnění pro kořenového uživatele MySQL na podřízeném hostiteli. Věnujte pozornost prvnímu GTID, abyste viděli, zda se databáze replikuje správně (celočíselná část by se měla při replikaci zvyšovat).

Ověřte, zda je náš podřízený hostitel součástí replikace z pohledu hlavního. Přihlaste se k instanci SQL Cloud jako 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

A spusťte následující příkaz:

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

V tomto okamžiku můžete naplánovat svůj další přesun, abyste přesměrovali zátěž databáze z aplikací na tento podřízený server jako nový hlavní server a vyřadili z provozu starý hlavní server ve službě Google Cloud.

Poslední myšlenky

Online migraci z Google Cloud SQL pro MySQL na místní server můžete provést bez větších potíží. To vám dává možnost přesunout svou databázi mimo cloudové dodavatele pro ochranu soukromí a kontrolu, když nadejde správný čas.


  1. Odstranění událostí z protokolu pošty databáze SQL Server (T-SQL)

  2. Co je nového v PostgreSQL 11

  3. Načítání komentářů z PostgreSQL DB

  4. Vynulujte počítadlo automatického přírůstku v postgresu