本頁說明如何使用自訂匯入功能,設定外部伺服器複製作業。如果您需要從大型外部資料庫複製資料,這些步驟是最佳選擇。
請務必完成本頁的所有步驟。完成後,您就能以管理及監控其他 Cloud SQL 執行個體的方式,管理及監控副本。
只有設定為使用以全域交易 ID (GTID) 為基礎的複製功能時,才支援這個程序。您必須先將外部伺服器的資料載入 Cloud SQL 備用資源,才能啟動複製作業。如果您未使用以 GTID 為基礎的複製功能,Cloud SQL 就無法判斷要從哪個確切的二進位記錄檔位置開始複製。如果無法使用以 GTID 為基礎的複製作業,您必須設定傾印工具,在傾印程序期間建立全域唯讀鎖定。
事前準備
開始前,請先設定外部伺服器、建立來源代表執行個體,以及設定 Cloud SQL 備用資源。
更新複製使用者的權限
外部伺服器上的複製使用者已設為接受來自任何主機 (%) 的連線。您應更新這個使用者帳戶,確保只能與 Cloud SQL 副本搭配使用。在來源資料庫伺服器上開啟終端機,然後輸入下列指令:
mysql 用戶端
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;
示例
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;
| 屬性 | 說明 |
|---|---|
| NEW_HOST | 指定 Cloud SQL 備用資源的輸出 IP。 |
| OLD_HOST | 您要變更的 Host 目前值。 |
| USERNAME | 外部伺服器上的複製使用者帳戶。 |
| GCP_USERNAME | GCP 使用者帳戶的使用者名稱。 |
| HOST | GCP 使用者帳戶的主機名稱。 |
將 Cloud SQL 副本設為主要執行個體
由於 Cloud SQL 備用資源執行個體為唯讀,如要執行自訂匯入作業,您必須將 Cloud SQL 備用資源升級為獨立執行個體。完成初始資料匯入後,請將執行個體降級為副本。
執行自訂傾印和匯入作業
本節將說明如何建立傾印檔案,並使用 mydumper 或 mysqldump 用戶端公用程式,將檔案匯入最終的 Cloud SQL 副本。
傾印資料時,如果來源執行個體上有 MySQL 通用資料庫 (包括 mysql 和 sys),您可能需要排除這些資料庫。否則資料匯入作業會失敗。請參閱「如何排除 (或納入) 資料庫?」。
使用 mydumper 和 myloader
如要建立傾印檔案並匯入 Cloud SQL,請按照下列步驟操作:
使用
mydumper建立外部伺服器資料庫的傾印檔案。$ mydumper -u USERNAME -p PASSWORD \ --threads=16 -o ./backup \ -h HOST \ --no-locks \ --regex '^(?!(mysql\.|sys\.))'
屬性 說明 USERNAME 外部伺服器上具有資料庫讀取權限的複製使用者帳戶或使用者帳戶名稱。 PASSWORD 複寫使用者密碼。 HOST 外部伺服器的 IPv4 或 DNS 位址。 使用
myloader將資料匯入 Cloud SQL 執行個體。$ myloader -u REPLICA_USERNAME -p REPLICA_PASSWORD \ --threads=16 \ -d ./backup -h HOST -o
屬性 說明 REPLICA_USERNAME Cloud SQL 執行個體上的使用者帳戶。 REPLICA_PASSWORD Cloud SQL 執行個體使用者密碼。 HOST Cloud SQL 執行個體的 IPv4。 記下資料轉儲的 GTID 或 binlog 資訊。使用預存程序設定複製時,需要這項資訊。
如要取得資料傾印的 GTID 或二進位記錄檔資訊,請執行下列指令:
sudo cat ./backup/metadata
使用mysqldump
使用
mysqldump建立傾印:mysqldumpmysqldump \ --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
屬性 說明 EXTERNAL_HOST 外部伺服器的 IPv4 或 DNS 位址。 EXTERNAL_PORT 外部伺服器的連接埠。 如果外部伺服器是託管在 Cloud SQL 上,則為 3306。USERNAME 外部伺服器上具有資料庫讀取權限的複製使用者帳戶或使用者帳戶名稱。 USER_PASSWORD 複寫使用者密碼。 DATABASE_LIST 外部伺服器上所有資料庫的清單 (以空格分隔),系統資料庫 ( sys、mysql、performance_schema和information_schema) 除外。使用SHOW DATABASESMySQL 指令列出資料庫。EXTERNAL_DATA 如果外部伺服器不支援 GTID,且您有權存取該伺服器上的全域讀取鎖定,請使用 --master-data=1。否則請勿使用這項屬性。GTID_PURGED 如果外部伺服器支援 GTID,請使用 --set-gtid-purged=on;否則請勿使用這個屬性。ADD_DROP_TABLE 如要在每個 CREATE TABLE陳述式前加入DROP TABLE陳述式,請加入--add-drop-table。ROUTINES 如要在傾印資料庫的輸出內容中顯示預存常式 (例如程序和函式),請加入 --routines。COMPRESS 如要壓縮 Cloud SQL 副本和外部伺服器之間傳送的所有資訊,請使用 --compress。GZIP 如要進一步壓縮傾印檔案,請使用 | gzip。如果資料庫包含未妥善壓縮的資料,例如無法壓縮的二進位資料或 JPG 圖片,請勿使用這項功能。示例
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
記下資料轉儲的 GTID 或 binlog 資訊。您需要這項資訊,才能使用 Cloud SQL 儲存程序設定複製作業。
如要查看 GTID,請尋找類似下列內容的行:
SET @@GLOBAL.GTID_PURGED='32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496';
如果是 binlog,請尋找類似下列內容的行:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360;
從需要超級權限的傾印檔案中移除下列程式碼行。由於 Cloud SQL 使用者沒有超級權限,這些行會導致匯入作業失敗。
以 GTID 為基礎的複製模式:移除 SET GTID_PURGED 陳述式,以及傾印中的工作階段變數設定陳述式。例如:
... 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;
如果是以二進位記錄為基礎的複寫,請移除 CHANGE MASTER 陳述式。例如:
... CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360; ...
使用
mysqlCLI 將資料匯入 Cloud SQL 副本:mysqlmysql -h REPLICA_HOST -u REPLICA_USER \ -p REPLICA_DATABASE_NAME RESULT_FILE
屬性 說明 REPLICA_HOST MySQL 伺服器所在的主機。 REPLICA_USER 連線至伺服器時要使用的 MySQL 使用者名稱。 REPLICA_DATABASE_NAME 資料所在資料庫的名稱。 RESULT_FILE 要匯入的傾印檔案名稱。 示例
mysql -h 255.255.255.255 -u replica_username -p replica_db < result.sql
您也可以使用 Google Cloud bucket 匯入 dump 檔案。請參閱將 SQL dump 檔案中的資料匯入 Cloud SQL。
降級 Cloud SQL 執行個體
如要將 Cloud SQL 執行個體降級為 Cloud SQL 副本,請對該執行個體使用 demoteMaster 方法。
準備要求 JSON 檔案,其中包含要降級的執行個體名稱。
來源 JSON
{ "demoteMasterContext": { "masterInstanceName": SOURCE_REPRESENTATION_INSTANCE_NAME, "skipReplicationSetup": true } }
屬性 說明 SOURCE_REPRESENTATION_INSTANCE_NAME 來源代表執行個體的名稱。 示例
{ "demoteMasterContext": { "masterInstanceName": "cloudsql-source-instance", "skipReplicationSetup": true } }
開啟終端機,然後使用下列指令叫用
demoteMaster: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
屬性 說明 JSON_PATH JSON檔案的路徑。PROJECT_ID Google Cloud中的專案 ID。 INSTANCE-NAME 要降級的執行個體名稱。 示例
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
完成後應會看到的畫面
如要確保執行個體設定正確無誤,請前往 Cloud SQL 執行個體頁面。
您應該會看到來源代表執行個體和 Cloud SQL 副本。類似以下範例:
| 執行個體 ID | 類型 | 公開 IP |
|---|---|---|
| (-) source-representation-instance | MySQL 外部主要資料庫 | 10.68.48.3:3306 |
| replica-instance | MySQL 唯讀複本 | 34.66.48.59 |
在 Cloud SQL 執行個體上啟動複製作業
這個步驟會使用 Cloud SQL 預存程序。呼叫 demoteMaster 要求後,系統會安裝 Cloud SQL 預存程序。呼叫 promoteReplica 後,系統會移除這些回呼。詳情請參閱「Stored procedures for replication management」。
- 登入副本執行個體。詳情請參閱使用本機電腦中的資料庫用戶端建立連線。
使用
mysql.resetMaster預存程序重設複製設定。mysql> call mysql.resetMaster();
設定複製作業。這個步驟需要您先前記下的 GTID 或記錄檔資訊。
GTID
- 使用
mysql.skipTransactionWithGtid(GTID_TO_SKIP)預存程序設定gtid_purged欄位。
屬性 說明 GTID_TO_SKIP 要設定的 GTID 集值。 例如:
mysql> call mysql.skipTransactionWithGtid('32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496');
- 執行
mysql.setupExternalSourceAutoPosition(HOST, PORT, USER_NAME, USER_PASSWORD, MASTER_AUTO_POSITION, USE_SSL, USE_SSL_CLIENT_AUTH)預存程序。
屬性 說明 HOST 來源端點。 PORT 來源通訊埠。 USER_NAME 來源使用者。 USER_PASSWORD 來源使用者密碼。 MASTER_AUTO_POSITION master_auto_position參數的值。可能的值為0、1。USE_SSL 是否要使用以 SSL 為基礎的複寫功能。可能的值為 true、false。如果true,則必須在DemoteMaster要求中設定caCertificate欄位。USE_SSL_CLIENT_AUTH 是否要使用 SSL 用戶端驗證。可能的值為 true、false。如果true,您需要在demoteMaster要求中設定clientKey和clientCertificates欄位。mysql> call mysql.setupExternalSourceAutoPosition('1.1.1.1', 3306, \ 'USERNAME', 'PASSWORD', \ /* master_auto_position= */ 1,false, false); \
binlog
執行
mysql.setupExternalSource(HOST, PORT, USER_NAME, USER_PASSWORD, SOURCE_LOG_NAME, SOURCE_LOG_POS, USE_SSL, USE_SSL_CLIENT_AUTH)預存程序。屬性 說明 HOST 來源端點。 PORT 來源通訊埠。 USER_NAME 來源使用者。 USER_PASSWORD 來源使用者密碼。 SOURCE_LOG_NAME 來源資料庫執行個體上的二進位記錄名稱,其中包含複寫資訊。 SOURCE_LOG_POS 複製作業開始讀取複製資訊時, mysql_binary_log_file_name二進位記錄中的位置。USE_SSL 是否要使用以 SSL 為基礎的複寫功能。可能的值為 true、false。如果true,則必須在DemoteMaster要求中設定caCertificate欄位。USE_SSL_CLIENT_AUTH 是否要使用 SSL 用戶端驗證。可能的值為 true、false。如果true,您需要在demoteMaster要求中設定clientKey和clientCertificates欄位。mysql> call mysql.setupExternalSource('1.1.1.1', 3306, \ 'user_name', 'password', 'mysql-bin-changelog.033877', 360, \ false, false);
- 使用
使用
mysql.startReplication()預存程序,從外部資料庫啟動複製作業。mysql> call mysql.startReplication();
確認複製狀態。確認
Slave_IO_Running和Slave_SQL_Running欄位都顯示YES。mysql> show slave status\G
這項指令會輸出類似以下的結果:
*************************** 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)
繼續複製
從外部伺服器啟動複製作業後,您需要監控複製作業,然後完成遷移作業。詳情請參閱「監控複製作業」。
疑難排解
| 問題 | 疑難排解 |
|---|---|
Lost connection to MySQL server during query when dumping table。 |
來源可能已無法使用,或傾印包含的封包過大。
確認外部主要裝置可供連線。 您也可以修改來源執行個體上的 net_read_timeout 和 net_write_timeout 旗標值,停止發生錯誤。如要進一步瞭解這些旗標的允許值,請參閱「設定資料庫旗標」。 如要進一步瞭解如何使用 |
| 初始資料遷移作業已順利完成,但系統未複製任何資料。 | 其中一個可能的原因是來源資料庫定義了複製標記,導致部分或所有資料庫變更未複製過來。 請確認複製旗標 (例如 在主要執行個體上執行 |
| 初始資料遷移作業成功,但資料複製作業在一段時間後停止運作。 | 建議做法:
如果發現
|
mysqld check failed: data disk is full。 |
副本執行個體的資料磁碟已滿。
增加副本執行個體的磁碟大小。您可以手動增加磁碟大小,也可以啟用儲存空間自動增加功能。 |
查看複寫記錄
驗證複製設定時,系統會產生記錄。
如要查看這些記錄,請按照下列步驟操作:
前往 Google Cloud 控制台的記錄檢視器。
- 從「執行個體」下拉式選單中選取 Cloud SQL 副本。
- 選取
replication-setup.log記錄檔。
如果 Cloud SQL 備用資源無法連線至外部伺服器,請確認下列事項:
- 外部伺服器上的任何防火牆都已設定為允許來自 Cloud SQL 副本傳出 IP 位址的連線。
- 您的 SSL/TLS 設定正確無誤。
- 複製使用者、主機和密碼正確無誤。
後續步驟
- 瞭解如何更新執行個體。
- 瞭解如何管理備用資源。
- 瞭解如何監控執行個體。
- 瞭解如何升級 Cloud SQL 副本,以便將副本升級為獨立執行個體,並停止從外部伺服器複製。