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

Bash运行Python脚本执行SQL文件报Text file busy错误如何解决

问题根因

Text file busy是Bash/Linux环境下的标准系统报错,核心触发逻辑是你尝试读取/执行的目标文件正被其他进程持有写入锁、或文件仍处于写入未完成状态,结合你贴出的代码,还有几处语法、路径格式的低级错误会间接触发该报错:

  • 函数定义语法错误:直接把字符串常量写在函数形参位置,Python解释器解析阶段就会抛出异常
  • 路径格式不兼容:硬编码的Windows原生路径C:\Users\gsumarlin\...无法在Bash环境(Linux/WSL/Git Bash)下被正确识别,路径解析错位可能指向一个正在被系统写入的临时文件
  • 缩进错误:函数内部代码没有正确缩进,脚本无法正常启动运行
  • 文件占用:你要执行的SQL文件正被编辑器、备份进程等其他程序打开写入,未释放文件锁
解决步骤
  1. 先修正Python代码的基础问题,替换为可正常运行的版本:
import mysql.connector
import os
import fcntl

db_config = {
    "user": "skynetadmin",
    "password": "Skynetadmin1",
    "host": "silmysskytest01.sing.micron.com",
    "database": "skynet_msa"
}

def execute_sql_file(file_path: str):
    if not os.path.isfile(file_path):
        raise FileNotFoundError(f"目标SQL文件不存在,请检查路径: {file_path}")
    # 提前加文件锁检测,直接定位占用问题
    with open(file_path, 'r', encoding='utf-8') as f:
        try:
            fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
            sql_content = f.read()
            fcntl.flock(f, fcntl.LOCK_UN)
        except BlockingIOError:
            raise RuntimeError("SQL文件正被其他进程写入占用,请关闭相关程序后重试")
    
    # 拆分SQL语句,注意如果SQL包含存储过程、触发器等带内嵌分号的对象,不要用分号拆分,改用mysql.connector的multi=True参数执行
    sql_commands = [cmd.strip() for cmd in sql_content.split(';') if cmd.strip()]
    cnx = mysql.connector.connect(**db_config)
    cursor = cnx.cursor()
    for cmd in sql_commands:
        try:
            cursor.execute(cmd)
        except mysql.connector.Error as e:
            print(f"跳过执行异常语句,错误信息: {str(e)}")
    cnx.commit()
    cursor.close()
    cnx.close()

# 路径根据你运行的Bash环境调整:
# WSL环境路径格式: /mnt/c/Users/gsumarlin/Documents/dumps/Dump20220428/Creation of Lab WIP History.sql
# Git Bash环境路径格式: /c/Users/gsumarlin/Documents/dumps/Dump20220428/Creation of Lab WIP History.sql
# 原生Linux环境就写文件的实际绝对路径
sql_file_path = "/mnt/c/Users/gsumarlin/Documents/dumps/Dump20220428/Creation of Lab WIP History.sql"
execute_sql_file(sql_file_path)
  1. 排查并释放文件锁
    • 执行lsof 你的SQL文件绝对路径命令,查看占用该文件的进程ID,执行kill -9 进程ID释放锁;常见占用方为打开了SQL文件的Navicat、VS Code等编辑器,或正在写入文件的mysqldump、日志采集进程
    • 如果是刚通过scp/ftp/导出功能生成的SQL文件,等文件大小不再变动、写入进程完全退出后再运行脚本,不要在文件写入过程中调用
    • 运行脚本时使用正确命令:python3 你的Python脚本文件名.py,不要直接给SQL文件加可执行权限后当脚本运行
    • 如果是WSL环境,先执行ls 你写的SQL文件路径确认文件真实存在、可正常读取,再运行脚本
    • 如果SQL文件存放在NFS网络共享盘上,因网络文件锁机制不稳定,把文件拷贝到本地磁盘目录(比如~/tmp/)后再执行即可

内容的提问来源于stack exchange,提问作者GQS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:24:22