如何在Jupyter中用Python逐个导出MySQL数据库表
解决Jupyter中执行mysqldump导出MySQL表的问题
你的代码存在几个关键问题,导致导出失败或权限报错,以下是修正方案:
问题分析
- 路径转义错误:Windows路径中的反斜杠
\在Python字符串中是转义字符,G:\Databasebackup\dbmain会被解析为无效路径,系统找不到目标目录。 - 特殊字符解析问题:密码中的
$是Shell的特殊变量符号,直接在命令字符串中会被Shell解析,导致密码不正确,触发Access Denied。 - 未等待命令执行&错误捕获:
subprocess.Popen是非阻塞调用,会立刻返回"Done"但实际命令可能还在执行或已失败,且没有捕获错误输出,无法排查问题。
修正后的代码方案
方案1:使用Shell模式但修复路径与特殊字符
用原始字符串处理路径,同时将密码用单引号包裹避免Shell解析$,并改用subprocess.run等待命令执行、捕获错误:
import subprocess tablename = "templedger" # 用原始字符串r""避免路径转义,密码用单引号包裹防止$被解析 dump_cmd = r'mysqldump -u user1 -p\'B57$52\' db_main %s > G:\Databasebackup\dbmain\%s.sql' % (tablename, tablename) try: # 等待命令执行完成,捕获输出 result = subprocess.run(dump_cmd, shell=True, check=True, capture_output=True, text=True) print("导出成功") except subprocess.CalledProcessError as e: print(f"导出失败,错误信息:{e.stderr}")
方案2:不使用Shell模式(更安全,推荐)
将命令拆分为参数列表,避免Shell解析特殊字符,同时处理路径:
import subprocess import os tablename = "templedger" output_path = os.path.join(r"G:\Databasebackup\dbmain", f"{tablename}.sql") # 拆分命令为列表,避免Shell解析特殊字符 cmd_args = [ "mysqldump", "-u", "user1", "-pB57$52", # 这里$不会被解析,因为没有Shell介入 "db_main", tablename ] try: # 打开输出文件,将mysqldump的输出写入 with open(output_path, "w", encoding="utf-8") as f: subprocess.run(cmd_args, check=True, stdout=f, stderr=subprocess.PIPE, text=True) print(f"表 {tablename} 已成功导出到 {output_path}") except subprocess.CalledProcessError as e: print(f"导出失败,错误信息:{e.stderr}") except IOError as e: print(f"文件写入错误:{e}")
额外检查项
- 确认
user1账号拥有db_main数据库的SELECT和LOCK TABLES权限(mysqldump必需),可通过MySQL命令行执行:GRANT SELECT, LOCK TABLES ON db_main.* TO 'user1'@'%'; FLUSH PRIVILEGES; - 确认Jupyter运行的用户对
G:\Databasebackup\dbmain目录有写入权限,可以手动在该目录创建文件测试。 - 若依然报写入错误22,检查路径是否存在,是否有特殊字符(比如空格),若有需用引号包裹路径。
内容的提问来源于stack exchange,提问作者Stumbling Through Data Science
相关产品推荐
相关产品推荐

