You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:52:51