Google Cloud SQL导入操作卡在RUNNING状态,仅退出脚本才结束
Google Cloud SQL CSV导入操作一直卡在RUNNING状态的排查与解决
我看到你在用Python脚本从Google Cloud Storage导入CSV到Cloud SQL时,操作状态一直停留在RUNNING,只有退出脚本才会终止循环。咱们一步步拆解问题,找到解决办法。
首先先看你代码里的循环逻辑,这里藏着几个容易踩的坑:
while response.status_code == 200 and data["status"] != "DONE": sleep(5) response = authed_session.request( 'GET', 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/operations/' + name) data = json.loads(response.text)
可能的原因及修复方案
1. 循环逻辑未覆盖所有异常状态
Cloud SQL的操作状态不止RUNNING和DONE,还有FAILED、PENDING等情况。如果操作实际已经失败,你的脚本会因为status != "DONE"一直循环,看起来像是卡在RUNNING;如果某次状态查询请求返回非200状态码(比如临时网络波动),循环会直接退出,但此时操作可能还在后台运行。
修复后的代码:
import json from time import sleep from google.oauth2 import service_account from google.auth.transport.requests import AuthorizedSession credentials_dict = {...} # 服务账号JSON credentials = service_account.Credentials.from_service_account_info( credentials_dict, scopes=['https://www.googleapis.com/auth/cloud-platform'] ) authed_session = AuthorizedSession(credentials) payload={ "importContext": { "fileType": "CSV", "uri": "gs://<path-to-csv>", "database": "<db-name>", "csvImportOptions": { "table": "<table-name>" } } } response = authed_session.request('POST', 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/instances/<cloude-sql-instance-id>/import',json=payload) data = json.loads(response.text) # 先检查初始导入请求是否成功 if response.status_code != 200: print(f"发起导入请求失败:{data.get('error', {}).get('message', '未知错误')}") exit(1) name = data["name"] operation_status = data["status"] # 只在操作未完成且未失败时循环 while operation_status not in ["DONE", "FAILED"]: sleep(5) try: response = authed_session.request( 'GET', f'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/operations/{name}') response.raise_for_status() # 主动抛出HTTP错误 data = json.loads(response.text) operation_status = data["status"] # 打印状态方便调试 print(f"当前操作状态:{operation_status}") # 处理失败场景,输出错误信息 if operation_status == "FAILED": error_msg = data.get('error', {}).get('message', '操作失败但未返回具体信息') print(f"导入操作失败:{error_msg}") break except Exception as e: print(f"查询操作状态时出错:{str(e)}") # 可根据需求选择重试或退出,这里先退出 break if operation_status == "DONE": print("CSV导入操作已成功完成!")
2. 权限配置不完整
即使脚本能发送请求,Cloud SQL服务本身可能没有权限读取GCS里的CSV:
- 确认Cloud SQL实例的服务账号(格式为
service-<project-number>@gcp-sa-cloud-sql.iam.gserviceaccount.com)拥有GCS存储桶的storage.objectViewer角色; - 检查你的脚本使用的服务账号是否拥有
sql.instances.import权限(比如Cloud SQL Admin角色); - 确保CSV文件本身的权限允许上述Cloud SQL服务账号读取。
3. CSV格式与表结构不匹配
如果CSV的列数、数据类型和目标表不匹配,导入操作可能会在后台失败,但状态更新不及时:
- 若CSV用了非默认分隔符(比如制表符),需要在
csvImportOptions里添加fieldDelimiter参数指定; - 确认CSV列顺序和表列顺序一致,或者通过
csvImportOptions.columns明确映射列关系; - 检查CSV里是否有无效数据(比如过长字符串、类型不匹配的值),这类问题会导致导入失败但可能不会立刻更新状态。
4. Cloud SQL实例资源不足
如果实例的CPU、内存或磁盘空间不足,导入操作会运行缓慢甚至卡住:
- 去Cloud Console查看实例的监控指标(CPU使用率、磁盘剩余空间),确认资源是否充足;
- 临时升级实例规格,完成导入后再降级回来。
5. API状态更新延迟
有时候Cloud SQL的操作状态更新会有延迟,你可以直接去Cloud Console的Cloud SQL实例 → 操作页面查看真实状态,确认操作是真的在运行,还是已经失败但API没同步状态。
内容的提问来源于stack exchange,提问作者Def Soudani
相关产品推荐
相关产品推荐

