本頁說明如何使用自訂匯入功能,設定外部伺服器複製作業。如果需要從大型外部資料庫複製資料,建議採取這些步驟。
你必須完成本頁的所有步驟。完成後,您就能以管理及監控其他 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
建立傾印: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
屬性 說明 EXTERNAL_HOST 外部伺服器的 IPv4 或 DNS 位址。 EXTERNAL_PORT 外部伺服器的連接埠。 如果外部伺服器是託管在 Cloud SQL 上,則為 3306
。USERNAME 外部伺服器上具有資料庫讀取權限的複製使用者帳戶或使用者帳戶名稱。 USER_PASSWORD 複寫使用者密碼。 DATABASE_LIST 外部伺服器上所有資料庫的清單 (以半形空格分隔),系統資料庫 ( sys
、mysql
、performance_schema
和information_schema
) 除外。請使用SHOW DATABASES
MySQL 指令列出資料庫。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;
如果是以 binlog 為基礎的複寫,請移除 CHANGE MASTER 陳述式。例如:
... CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360; ...
使用
mysql
CLI 將資料匯入 Cloud SQL 副本:mysql
mysql -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 匯入傾印檔案。請參閱將 SQL 傾印檔案中的資料匯入 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
二進位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 備用資源,以將備用資源升級為獨立執行個體,並停止從外部伺服器複製。