如果你希望迁移数据库过程完全由自己编写的Python脚本控制,可以使用 subprocess 模块调用 mysqldump。这个方法速度快,并且逻辑清晰。

#!/usr/bin/env python# -*- coding: utf-8 -*-"""MySQL 全量备份与恢复脚本(跨版本兼容)用途:从 A电脑(源) 导出整个数据库,并导入到 B电脑(目标)适用场景:每周执行一次,实现定期全量同步"""import subprocessimport osimport sysfrom datetime import datetime# ====================== 配置区(请务必修改) ======================# 1. MySQL 可执行文件所在目录(B电脑上的 MySQL bin 路径)# 请确认此目录下存在 mysqldump.exe 和 mysql.exeMYSQL_BIN_DIR =r"D:\aiwork\mysql\bin"# ← 修改为你的实际路径# 2. A电脑(源数据库)连接信息SOURCE_HOST ="A电脑的IP地址"# A电脑的IP地址SOURCE_PORT =3306SOURCE_USER ="A电脑用户名"# 建议使用有读取权限的账号SOURCE_PASSWORD ="A电脑密码"SOURCE_DATABASE ="A电脑源数据库名"# 要备份的数据库名# 3. B电脑(目标数据库)连接信息TARGET_HOST ="B电脑的IP地址"# B电脑本机(也可用 localhost)TARGET_PORT =3306TARGET_USER ="B电脑用户名"TARGET_PASSWORD ="B电脑密码"TARGET_DATABASE ="B电脑源数据库名"# 目标数据库名(建议与源同名)# 4. 备份文件存放路径(建议放在B电脑的某个目录)BACKUP_DIR =r"D:\aiwork\mysql\mysql_data"# ================================================================# 构建完整命令路径MYSQLDUMP = os.path.join(MYSQL_BIN_DIR,"mysqldump.exe")MYSQL_CMD = os.path.join(MYSQL_BIN_DIR,"mysql.exe")# 创建备份目录(如果不存在)os.makedirs(BACKUP_DIR, exist_ok=True)# 生成带时间戳的备份文件名(便于归档)timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")BACKUP_FILE = os.path.join(BACKUP_DIR,f"{SOURCE_DATABASE}_full_{timestamp}.sql")def run_command(cmd, description):"""执行命令并捕获输出,若失败则终止程序""" print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {description} ...") result = subprocess.run(cmd, capture_output=True, text=True)if result.returncode !=0: print(f"❌ 命令执行失败!错误信息:\n{result.stderr}") sys.exit(1) print(f"✅ {description} 成功")return resultdef main():# ----- 1. 从 A电脑 导出数据库 ----- dump_cmd =[ MYSQLDUMP,f"--host={SOURCE_HOST}",f"--port={SOURCE_PORT}",f"--user={SOURCE_USER}",f"--password={SOURCE_PASSWORD}","--single-transaction",# 保证数据一致性(适用于InnoDB)"--routines",# 导出存储过程/函数"--triggers",# 导出触发器"--events",# 导出事件"--skip-column-statistics",# 避免 MySQL 8.0 与 8.4 的兼容性警告"--complete-insert",# 使插入语句包含列名,提高兼容性"--result-file", BACKUP_FILE, SOURCE_DATABASE] run_command(dump_cmd,f"从 {SOURCE_HOST} 导出数据库 {SOURCE_DATABASE}")# ----- 2. 将备份文件导入到 B电脑 -----# 注意:导入前确保目标数据库已存在(如果不存在,可以先创建)# 这里使用 --force 选项让导入过程忽略小错误继续执行 import_cmd =[ MYSQL_CMD,f"--host={TARGET_HOST}",f"--port={TARGET_PORT}",f"--user={TARGET_USER}",f"--password={TARGET_PASSWORD}","--force",# 遇到错误继续执行(可选) TARGET_DATABASE] print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 开始导入到 {TARGET_HOST} ...")# 将备份文件内容通过stdin传入mysql命令with open(BACKUP_FILE,"r", encoding="utf-8")as f: result = subprocess.run(import_cmd, stdin=f, capture_output=True, text=True)if result.returncode !=0: print(f"❌ 导入失败!错误信息:\n{result.stderr}")# 可根据需要决定是否退出 sys.exit(1) print(f"✅ 导入成功")# ----- 3. 清理(可选) -----# 如果希望保留备份文件用于存档,可以注释掉下面两行# os.remove(BACKUP_FILE)# print(f"🗑️ 临时备份文件已删除:{BACKUP_FILE}") print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 🎉 全量同步完成!")if __name__ =="__main__": main()
请注意:在执行前请确保: