本頁說明如何使用 Data API,對 Cloud SQL 執行個體上的資料庫執行 SQL 陳述式。使用 Data API 時,您可以使用 Cloud SQL Admin API 和 gcloud CLI,在已啟用 Data API 存取的任何執行個體上執行 SQL 陳述式。
您可以在使用公開 IP 位址、私人服務連線或 Private Service Connect 的執行個體上使用 Data API。Data API 支援所有類型的 SQL 陳述式,包括資料操縱語言 (DML)、資料定義語言 (DDL) 和資料查詢語言 (DQL)。Data API 適合執行小型且快速的管理陳述式,例如建立資料庫角色或使用者,以及進行小型結構定義更新。
事前準備
如要在執行個體上執行 SQL 陳述式,請先完成下列步驟:
- 為 IAM 資料庫驗證設定執行個體。
- 將 IAM 使用者或服務帳戶新增至執行個體,並授予帳戶執行 SQL 陳述式所需的角色或權限。
必要角色或權限
根據預設,具備下列任一角色的使用者或服務帳戶,都有權在 Cloud SQL 執行個體上執行 SQL 陳述式 (cloudsql.instances.executesql):
Cloud SQL Admin(roles/cloudsql.admin)Cloud SQL Instance User(roles/cloudsql.instanceUser)Cloud SQL Studio User(roles/cloudsql.studioUser)
您也可以為使用者或服務帳戶定義 IAM 自訂角色,其中包含 cloudsql.instances.executesql 權限。這項權限支援身分與存取權管理自訂角色。
啟用或停用 Data API
如要使用 Google Data API,必須為每個執行個體啟用這項功能。 您隨時可以停用 Data API。
gcloud
如要在執行個體上啟用 Data API 存取權,請使用 gcloud sql instances patch 指令並加上 --data-api-access=ALLOW_DATA_API 標記:
gcloud sql instances patch INSTANCE_NAME --data-api-access=ALLOW_DATA_API
如要停用 Google Data API 存取權,請使用 --data-api-access=DENY_DATA_API 標記:
gcloud sql instances patch INSTANCE_NAME --data-api-access=DENY_DATA_API
將 INSTANCE_NAME 替換為要啟用或停用 Data API 的執行個體名稱。
執行 SQL 陳述式
您可以使用 gcloud CLI 或 REST API,對 Cloud SQL 執行個體上的資料庫執行 SQL 陳述式。
gcloud
如要使用 gcloud CLI 對執行個體上的資料庫執行 SQL 陳述式,請使用 gcloud beta sql instances execute-sql 指令:
gcloud beta sql instances execute-sql INSTANCE_NAME \ --database=DATABASE_NAME \ --sql=SQL_STATEMENT \ --partial_result_mode=PARTIAL_RESULT_MODE
請將下列項目改為對應的值:
- INSTANCE_NAME:執行個體的名稱。
- DATABASE_NAME:執行個體中的資料庫名稱。
- SQL_STATEMENT:要執行的 SQL 陳述式。如果陳述式含有空格或殼層特殊字元,就必須加上引號。
- PARTIAL_RESULT_MODE:選用。控管結果不完整時的回應方式。可以是
ALLOW_PARTIAL_RESULT、FAIL_PARTIAL_RESULT或PARTIAL_RESULT_MODE_UNSPECIFIED。請參閱「修改截斷行為」。
如有需要,您也可以加上 --project=PROJECT_ID 旗標。
REST
如要使用 REST API 對執行個體上的資料庫執行 SQL 陳述式,請將 POST 要求傳送至 executeSql 端點:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME/executeSql
要求主體應包含資料庫名稱和 SQL 陳述式:
{ "database": "DATABASE_NAME", "sqlStatement": "SQL_STATEMENT", "partialResultMode": "PARTIAL_RESULT_MODE" }
請將下列項目改為對應的值:
- PROJECT_ID:您的專案 ID。
- INSTANCE_NAME:執行個體的名稱。
- DATABASE_NAME:執行個體中的資料庫名稱。
- SQL_STATEMENT:要執行的 SQL 陳述式。
- PARTIAL_RESULT_MODE:選用。控管結果超過 10 MB 時,API 的回應方式。可以是
FAIL_PARTIAL_RESULT或ALLOW_PARTIAL_RESULT。請參閱「修改截斷行為」。
修改刪減行為
執行 SQL 時,您可以控管大型結果的處理方式。
- 在要求中加入
"partialResultMode"欄位。這個欄位接受下列值:FAIL_PARTIAL_RESULT:如果結果超過 10 MB,或只能擷取部分結果,則會擲回錯誤。請勿傳回結果。ALLOW_PARTIAL_RESULT:如果結果超過 10 MB,或因發生錯誤而只能擷取部分結果,則傳回截斷的結果,並將partial_result設為 true。請勿擲回錯誤。
限制
- 回應大小上限為 10 MB。如果
partialResultMode設為ALLOW_PARTIAL_RESULT,超過這個大小的結果就會遭到截斷,否則系統會擲回錯誤。 - 要求大小上限為 0.5 MB。
- 您只能對正在執行的 MySQL 適用的 Cloud SQL 執行個體執行 SQL 陳述式。
- 如果執行個體已設定為外部伺服器複製,Cloud SQL 就不支援搭配使用 Data API。
- 如果要求超過 30 秒未完成,系統就會取消要求。系統不支援使用
SET SESSION MAX_EXECUTION_TIME設定較高的陳述式逾時時間。如果 Cloud SQL for MySQL 5.6 和 5.7 的 DDL 陳述式執行時間過長而逾時,可能會導致孤立檔案或資料表無法安全地復原。在大型資料表上使用ALTER TABLE等陳述式時,請務必謹慎。 - Cloud SQL 會限制每個執行個體每位使用者的並行
executeSql要求數量,上限為 10 個。如果達到這個上限,後續要求就會失敗,並顯示「Maximum concurrent reads 10 reached」(已達到並行讀取作業數上限 10)。 - 每個回應最多可包含 10 則資料庫訊息或警告。
- 如果陳述式語法或執行階段發生錯誤,系統就不會傳回任何結果。
- 如果是 MySQL 適用的 Cloud SQL,通知和警告只會顯示多重陳述式執行的最後一個陳述式。
- 如果陳述式耗用大量記憶體,可能會導致記憶體不足錯誤。如要進一步瞭解如何避免發生這些錯誤,請參閱「管理記憶體用量的最佳做法」。如果資料庫執行個體的記憶體用量偏高,通常會導致效能問題、停頓,甚至資料庫停機。