此頁面說明使用 Cloud SQL 匯入及匯出資料的最佳做法。如需將資料匯入 Cloud SQL 的逐步操作說明,請參閱匯入資料。
如要從 Cloud SQL 匯出資料,以便在您管理的 MySQL 執行個體中使用,請參閱「使用 SQL dump 檔案匯出及匯入」 或「使用 CSV 檔案匯出及匯入」。
匯入及匯出的最佳作法
以下是匯入及匯出資料時應考慮的最佳做法:
- 匯入和匯出時使用相同的 SQL 模式
- 請勿使用 Cloud Storage Requester Pays bucket
- 盡量減少匯出作業對效能的影響
- 建立 SQL 傾印檔案時使用正確標記
- 壓縮資料以減少費用。
- 減少長時間執行的匯入與匯出程序
- 使用 InnoDB
- MySQL 的匯入和遷移工作,內含中繼資料且包含 DEFINER 子句
- 驗證匯入的資料庫
匯入和匯出時使用相同的 SQL 模式
SQL 模式設定會影響 Cloud SQL 解讀 SQL 查詢的方式。舉例來說,如果您從未啟用嚴格 SQL 的資料庫匯出資料,然後嘗試匯入 Cloud SQL (預設啟用嚴格 SQL),匯入作業可能會失敗。最佳做法是在匯入時使用與匯出時相同的 SQL 模式。
檢查來源和目標資料庫的 SQL 模式,確保兩者相容。 請特別注意啟用嚴格 SQL 模式的旗標。如果資料庫未設定嚴格 SQL,您可能需要移除 Cloud SQL 中的嚴格 SQL。如果移除嚴格 SQL,您必須設定其他旗標。
如要確認 Cloud SQL 執行個體已設為所需模式,請執行 SELECT @@GLOBAL.sql_mode;
。
請勿使用 Cloud Storage「要求者付費」值區
當您從 Cloud SQL 執行匯入和匯出作業時,不能使用已啟用要求者付費的 Cloud Storage 值區。
盡量減少匯出作業對效能的影響
從 Cloud SQL 進行標準匯出時,資料庫必須處於連線狀態。如果匯出的資料量較小,影響可能不大。不過,如果資料庫或物件 (例如資料庫中的 BLOB) 很大,匯出作業可能會導致資料庫效能降低。這可能會影響對資料庫執行資料庫查詢和作業所需的時間。匯出作業開始後,如果資料庫開始緩慢回應,就無法停止作業。
如要避免匯出期間回應速度變慢,請採取下列做法:
從唯讀備用資源匯出資料。如果您經常匯出資料 (每天或更頻繁),但匯出的資料量不大,這或許是不錯的選擇。如要從唯讀副本執行匯出作業,請在唯讀副本執行個體上使用 Google Cloud 控制台、
gcloud
或 REST API 匯出函式。如要進一步瞭解如何建立及管理唯讀副本,請參閱「 建立唯讀副本」。使用無伺服器匯出功能。使用無伺服器匯出功能時,Cloud SQL 會建立獨立的暫時執行個體,卸載匯出作業。卸載匯出作業後,主要執行個體上的資料庫就能繼續以正常效能速率處理查詢及執行作業。資料匯出完成後,系統會自動刪除暫時執行個體。如果您要一次性匯出大型資料庫,建議採取這個方法。使用 Google Cloud 控制台、
gcloud
或 REST API 匯出函式,並加上offload
標記,即可執行無伺服器匯出作業。在無伺服器匯出作業期間,您可以執行其他作業,例如編輯執行個體、匯入及容錯移轉。不過,如果您選取「
請參閱下表,瞭解無伺服器匯出作業執行期間可封鎖的作業:delete
」,匯出作業會在您刪除執行個體後停止,且不會匯出任何資料。目前作業 新作業 遭到封鎖? 任何作業 無伺服器匯出 是 無伺服器匯出 無伺服器匯出以外的任何作業 否 無伺服器匯出以外的任何作業 無伺服器匯出以外的任何作業 是 無伺服器匯出作業需要較長時間,因為系統需要時間建立暫時執行個體。至少需要五分鐘以上,但如果是較大的資料庫,可能需要更長時間。決定要使用哪種匯出類型前,請先考量對時間、效能和費用的影響。
建立 SQL 傾印檔案時使用正確標記
如果將資料匯出至 SQL 傾印檔案時沒有使用正確標記,則匯入作業可能不會成功。如需建立 SQL 傾印檔案以匯入至 Cloud SQL 的相關資訊,請參閱建立 SQL 傾印檔案一文。壓縮資料以減少費用
Cloud SQL 支援匯入及匯出已壓縮及未壓縮的檔案。壓縮可以節省 Cloud Storage 中的大量儲存空間並減少儲存成本,特別是在您要匯出大型執行個體時。
匯出 SQL 傾印檔案或 CSV 檔案時,請使用.gz
副檔名來壓縮資料。匯入副檔名為 .gz
的檔案時,檔案會自動解壓縮。
減少長時間執行的匯入與匯出程序
視處理的資料大小而定,匯入 Cloud SQL 和從 Cloud SQL 匯出資料可能需要很長時間才能完成。這可能會造成下列影響:
- 您無法停止長時間執行的 Cloud SQL 執行個體作業。
- 每個執行個體一次只能執行一項匯入或匯出作業,而且長時間執行的匯入或匯出作業會封鎖其他作業,例如每日自動備份。無伺服器匯出作業可讓您執行其他作業,包括編輯執行個體、匯入、容錯移轉,以及解除封鎖每日自動備份。
如要縮短完成各項作業所需的時間,請使用 Cloud SQL 匯入或匯出功能,但請用於小批資料。
如要匯出資料,您可以從唯讀副本執行匯出作業,或使用無伺服器匯出功能,盡量減少對資料庫效能的影響,並在匯出作業執行期間,讓執行個體執行其他作業。
如需更多提示,請參閱診斷 Cloud SQL 執行個體的問題。使用 InnoDB
MySQL 執行個體只支援 InnoDB 儲存引擎。
您可以透過一組 sed 指令碼連結 mysqldump 的輸出檔案,將資料表從 MyISAM 轉換成 InnoDB,方法如下:
mysqldump --databases [DATABASE_NAME] \ -h [INSTANCE_IP] -u [USERNAME] -p [PASSWORD] \ --hex-blob --default-character-set=utf8mb4 | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/g' > [DATABASE_FILE].sql
包含中繼資料且其中有 DEFINER 子句的 MySQL 匯入和遷移工作
由於 MySQL 匯入或遷移作業不會遷移使用者資料,因此如果來源和傾印檔案含有以 DEFINER
子句定義的中繼資料,就會無法匯入或遷移,因為使用者尚未存在於該處。
如要找出中繼資料中存在的 DEFINER
值,請使用下列查詢 (或在傾印檔案中搜尋),並檢查目標執行個體中是否有 root%localhost
或不存在的使用者項目。
SELECT DISTINCT DEFINER FROM INFORMATION_SCHEMA.EVENTS; SELECT DISTINCT DEFINER FROM INFORMATION_SCHEMA.ROUTINES; SELECT DISTINCT DEFINER FROM INFORMATION_SCHEMA.TRIGGERS; SELECT DISTINCT DEFINER FROM INFORMATION_SCHEMA.VIEWS;
如要從包含這類中繼資料的來源執行匯入或遷移作業,請採取下列任一做法:
- 請先在目標 Cloud SQL 執行個體上建立使用者,再開始匯入或遷移工作。
- 在啟動匯入或遷移工作前,請先將來源 MySQL 執行個體或傾印檔案中的
DEFINER
子句更新為INVOKER
。
驗證匯入的資料庫
匯入作業完成後,請連線至資料庫並執行適當的資料庫指令,確認內容正確無誤。舉例來說,您可以連線並列出資料庫、資料表和特定項目。
已知限制
如需已知限制的清單,請參閱「匯入及匯出資料時的問題」。
自動執行匯出作業
雖然 Cloud SQL 並未提供自動匯出資料庫的內建方式,但您可以使用多個 Google Cloud元件建構自己的自動化工具。詳情請參閱 這篇教學文章。
疑難排解
排解匯入作業問題
問題 | 疑難排解 |
---|---|
HTTP Error 409: Operation failed because another operation was already in progress 。 |
您的執行個體已有待處理的作業。系統一次只能執行一項作業。請待目前的作業完成後再提出要求。 |
匯入作業耗時過長。 | 有效連線過多可能會干擾匯入作業。
關閉未使用的作業。檢查 Cloud SQL 執行個體的 CPU 和記憶體用量,確保有充足的可用資源。如要確保匯入作業有最多資源可用,請先重新啟動執行個體,再開始執行作業。 重新啟動:
|
如果傾印檔案中有一或多位參照的使用者不存在,匯入作業就會失敗。 | 匯入傾印檔案前,擁有物件或已取得傾印資料庫中物件存取權的所有資料庫使用者,都必須存在於目標資料庫中。否則匯入作業無法以原始擁有權或權限重新建立物件。 |
匯入作業失敗,並顯示資料表不存在的錯誤。 | 資料表可能會參照其他資料表的外鍵,而且其中一或多個資料表在匯入作業期間可能仍不存在 (取決於匯入順序)。 建議做法: 在傾印檔案開頭加上以下這一行: SET FOREIGN_KEY_CHECKS=0; 此外,請在傾印檔案結尾處加上以下這一行: SET FOREIGN_KEY_CHECKS=1; 這些設定會在匯入作業進行期間停用資料完整性檢查,並在資料載入後重新啟用。這不會影響資料庫中的資料完整性,因為資料在建立傾印檔案時已通過驗證。 |
排解匯出作業問題
問題 | 疑難排解 |
---|---|
HTTP Error 409: Operation failed because another operation was
already in progress. |
您的執行個體已有待處理的作業。系統一次只能執行一項作業。請待目前的作業完成後再提出要求。 |
HTTP Error 403: The service account does not have the required
permissions for the bucket. |
請確認值區存在,且 Cloud SQL 執行個體 (執行匯出作業) 的服務帳戶具備 Storage Object Creator 角色 (roles/storage.objectCreator ),以便將匯出內容載入值區。請參閱「Cloud Storage 的 IAM 角色」。 |
CSV 匯出作業成功,但 SQL 匯出作業失敗。 | CSV 和 SQL 格式的匯出方式不同。SQL 格式會匯出整個資料庫,因此可能需要較長時間才能完成。CSV 格式可讓您定義要匯出資料庫中的哪些元素。
使用 CSV 匯出功能,只匯出所需資料。 |
匯出時間過長。 | Cloud SQL 不支援並行同步作業。
使用 匯出卸載。從高層次來看,在卸載匯出作業時,Cloud SQL 會啟動卸載執行個體來執行匯出作業,而不是在來源執行個體上發出匯出作業。卸載匯出作業有幾項優點,包括提升來源執行個體的效能,以及在匯出作業執行期間解除管理作業的封鎖。使用匯出卸載功能時,總延遲時間可能會增加,增加的時間量取決於啟動卸載執行個體所需的時間。一般來說,只要匯出檔案大小合理,延遲時間就不會太長。不過,如果匯出內容夠小,延遲時間可能會增加。 |
您希望系統自動匯出資料。 | Cloud SQL 不提供自動匯出功能。 您可以使用 Cloud Scheduler、Pub/Sub 和 Cloud Run 函式等產品,自行建構自動匯出系統,類似於這篇 自動備份文章。 Google Cloud |