此頁面說明使用 Cloud SQL 匯入及匯出資料的最佳做法。如需將資料匯入 Cloud SQL 的逐步操作說明,請參閱匯入資料。
如要從 Cloud SQL 匯出資料,以便在您管理的 MySQL 執行個體中使用,請參閱「使用 SQL 傾印檔案匯出及匯入」或「使用 CSV 檔案匯出及匯入」。
匯入及匯出的最佳作法
以下是匯入及匯出資料時的最佳做法:
- 匯入和匯出時使用相同的 SQL 模式
- 不要使用 Cloud Storage 的「要求者付費」值區
- 盡量減少匯出作業對效能造成的影響
- 建立 SQL 傾印檔案時使用正確標記
- 壓縮資料以減少費用。
- 減少長時間執行的匯入和匯出程序
- 使用 InnoDB
- 包含中繼資料且其中有 DEFINER 子句的 MySQL 匯入和遷移工作
- 驗證匯入的資料庫
匯入和匯出時使用相同的 SQL 模式
SQL 模式設定會影響 Cloud SQL 解讀 SQL 查詢的方式。舉例來說,如果您從未啟用嚴格 SQL 的資料庫匯出資料,然後嘗試匯入至 Cloud SQL (預設會啟用嚴格 SQL),匯入作業可能會失敗。最佳做法是在匯入時使用與匯出時相同的 SQL 模式。
請檢查來源和目標資料庫的 SQL 模式是否相容。請特別留意啟用嚴格 SQL 模式的旗標。如果資料庫未設定嚴格 SQL,您可能會想要在 Cloud 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
InnoDB 是 MySQL 執行個體唯一支援的儲存引擎。
您可以透過一組 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 不提供自動匯出資料的方式。 您可以使用 Google Cloud產品 (例如 Cloud Scheduler、Pub/Sub 和 Cloud Run 函式) 建構自己的自動匯出系統,類似於本文中說明的 自動備份。 |