使用 Python 完整迁移 MySQL 数据库数据的操作方法

山间有风
山间有风
发布时间:2026-10-11| 2人浏览过
原创

云数据库到期后如何低成本保存业务数据?本文介绍使用 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 数据库数据的详细内容,更多关于数据库备份与本地化存档的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。