使用 Python 完整迁移 MySQL 数据库数据的操作方法
云数据库到期后如何低成本保存业务数据?本文介绍使用 mysqldump 命令行备份、Python 结合 pymysql 实现源库至目标库的直接迁移,以及将各表按行导出为 CSV 文件的具体操作步骤。包含代码示例、参数说明与数据核对方法,适用于中小规模数据的快速转移与本地化存档。
数据迁移的目标与基础准备
云托管数据库虽然运维省心,但长期续费成本较高。当实例到期或计划降配时,首要目标是完整提取结构化数据并转移到自建环境或其他存储介质中。迁移前需确保拥有源库的读取权限,并提前评估数据体量:数据量较小可直接采用全量脚本或文件导出;若涉及复杂视图或触发器,建议优先备份 DDL 结构。

第1步:通过 mysqldump 生成结构化 SQL 备份
原生工具 mysqldump 兼容性最强,可直接生成包含建表语句与插入数据的完整 .sql 文件。为保证 InnoDB 引擎的数据一致性并避免 GTID 干扰,推荐配合事务锁标志运行:
# 导出命令(推荐参数组合)
mysqldump -u 用户名 -p --set-gtid-purged=OFF --single-transaction -B 数据库名 > 导出文件.sql
# 恢复至新环境执行
mysql -u 用户名 -p < 导出文件.sql
该方式适合中小规模数据库,导出期间会短暂锁定元数据。若数据量极大,执行时间可能较长,此时可考虑分库分表导出生成多个归档包。
第2步:使用 Python 结合 pymysql 实现库表直连迁移
若目标环境为另一套 MySQL 实例,可通过 pymysql 建立双端连接,动态拉取表结构并逐行同步。**风险提示**:脚本逻辑中包含 DROP TABLE IF EXISTS,迁移前请务必对目标库重要数据进行备份,防止误覆盖。此外,原库数据存在特殊字符时建议使用参数化占位符避免语法错误。
import pymysql
# 连接源数据库
source_conn = pymysql.connect(
host="源数据库地址",
user="用户名",
password="密码",
database="源数据库名"
)
source_cursor = source_conn.cursor()
# 连接目标数据库
target_conn = pymysql.connect(
host="目标数据库地址",
user="用户名",
password="密码",
database="目标数据库名"
)
target_cursor = target_conn.cursor()
# 查询源库所有表名
source_cursor.execute("SHOW TABLES")
tables = source_cursor.fetchall()
for table in tables:
table_name = table[0]
source_cursor.execute(f"SELECT * FROM {table_name}")
rows = source_cursor.fetchall()
# 获取创建语句用于重建表结构
source_cursor.execute(f"SHOW CREATE TABLE {table_name}")
create_table_sql = source_cursor.fetchone()[1]
# 清理目标库同名表并重建结构
target_cursor.execute(f"DROP TABLE IF EXISTS {table_name}")
target_cursor.execute(create_table_sql)
# 构建占位符防止 SQL 注入
placeholders = ", ".join(["%s"] * len(row))
insert_sql = f"INSERT INTO {table_name} VALUES ({placeholders})"
# 逐行执行并提交以保持内存稳定
for r in rows:
target_cursor.execute(insert_sql, r)
target_conn.commit()
source_cursor.close()
source_conn.close()
target_cursor.close()
target_conn.close()
第3步:利用 Python 按表独立导出为 CSV 文件
当需要离线归档或跨系统导入时,可将每张表拆分为独立的 .csv 文件。该方法仅提取纯数据与列头,不包含索引或外键约束,适用于轻量级表格交换。注意执行前关闭目标连接以避免文件句柄占用冲突。
import pymysql
import csv
source_conn = pymysql.connect(
host="源数据库地址",
user="用户名",
password="密码",
database="源数据库名"
)
source_cursor = source_conn.cursor()
source_cursor.execute("SHOW TABLES")
tables = source_cursor.fetchall()
for table in tables:
table_name = table[0]
source_cursor.execute(f"SELECT * FROM {table_name}")
rows = source_cursor.fetchall()
# 自动抓取字段名称作为 CSV 表头
columns = [desc[0] for desc in source_cursor.description]
with open(f"{table_name}.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(columns)
writer.writerows(rows)
source_cursor.close()
source_conn.close()
迁移完成判断与优化建议
验证数据完整性可直接在两端执行 COUNT(*) 对比行数,或抽样核对主键记录是否一致。上述脚本采用单行提交模式保障稳定性,但在处理千万级大表时性能受限,生产环境建议替换为批量插入或启用 MySQL 官方 mysqlimport/export 功能以大幅提升吞吐量。
以上就是使用 Python 完整迁移 MySQL 数据库数据的详细内容,更多关于数据库备份与本地化存档的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













