MySQL 逻辑备份与恢复(mysqldump、MySQL Shell)
MySQL难度: 中级耗时: 20–90 分钟(取决于数据量)使用 mysqldump 或 MySQL Shell(util.dumpInstance / dumpSchemas / dumpTables + util.loadDump)进行逻辑备份与恢复:单表、单个 schema 或整个实例;仅结构或仅数据;迁移到另一台服务器;从完整 dump 中提取单表;通过 systemd/cron 定时执行、借助 login-path 免密码、经过校验并带保留期限的备份。每条路径最后都会比对行数。迁移、单对象恢复和跨版本升迁请使用本指南;大型数据库的日常备份、快速恢复以及恢复到指定时间点(PITR)请使用 Percona XtraBackup 指南。
架构: 1 台服务器(迁移和实例恢复时另需 1 台目标服务器)
场景
- 导出 / 导入表 — 备份一个或多个表、将其复制到其他 schema/服务器,或进行恢复。源库保持运行;InnoDB 表不加锁。
- 备份 / 恢复一个 schema(数据库) — 备份整个数据库(schema),或将其加载到其他 schema/服务器。源库保持运行;目标端的同名表会被删除后重建。
- 整个实例(用户 + 所有 schema) — 在本服务器上备份,在一台空服务器上恢复:用户、权限和所有 schema。用于重建服务器或更换版本/平台。
- 仅结构(DDL) — 表、视图、触发器、存储过程和事件的定义;不含数据。用于比对 schema、搭建空环境或将结构纳入版本控制。
- 仅数据 — 目标端结构已存在,只传输行数据(例如刷新测试数据)。加载期间目标端的触发器可能被触发;本指南会对此进行检查。
- 迁移到另一台服务器 — 在目标服务器上操作,通过网络用 login-path 连接源库。切换时应用停止写入;停机时间等于 dump + 加载的时间。用于更换服务器、操作系统或版本。
- 从完整 dump 中提取单表 — 手头有一个完整 dump,只需要其中一个表(误删的行、被 DROP 的表)。在不触碰原 schema 的情况下将其提取到单独的 schema,或将被删除的表放回原处。
- 定时备份(systemd timer / cron) — 每天在固定时间自动执行逻辑备份:独立的备份用户、login-path、脚本、systemd timer 或 cron、保留期限和出错通知。源库保持运行。
开始之前
- MySQL … 正在运行;操作系统 root 用户可以用 mysql 命令免密码连接(auth_socket 或 ~/.mylogin.cnf)。如果是按 DBAtlas MySQL 单服务器安装指南安装的,路径相同。
- 已知各 schema 的大小,且备份目录 … 有足够的可用空间(压缩后的逻辑备份通常为数据量的 10–30%;索引只以定义形式进入 dump)。
- 所有表都是 InnoDB。--single-transaction(以及 MySQL Shell 的一致性 dump)只对 InnoDB 表做到无锁且一致;如果存在 MyISAM 表,dump 期间对其写入会造成不一致。
- 要安装 MySQL Shell 的服务器可以访问 MySQL 仓库(repo.mysql.com),或已配置内部镜像。
- 目标服务器 … 上已安装(按 DBAtlas 安装指南)并运行相同或更新版本的 MySQL,且不含用户 schema。不支持加载到更旧的版本,例如为回退而从 8.4 加载到 8.0。
- 目标服务器可以访问源端的 … 端口。
- 服务器可以发送电子邮件:本地 MTA(postfix)已转发到公司的 SMTP relay。
- 已为大规模恢复或迁移安排维护窗口;如果目标端将被覆盖,已对目标端做了备份。
- 此服务器是健康的 replica:IO 和 SQL 线程为 Yes,延迟很低。dump 中的 binlog 位置(--source-data=2)指向该 replica 自己的 binlog;如果要用于 PITR,必须启用 log_replica_updates(8.x 中默认启用)。
- 此服务器是 InnoDB Cluster 成员,当前为 SECONDARY / ONLINE。
指南阶段
- 准备 — 创建备份目录 · 检查表引擎和长事务 · 安装 MySQL Shell
- 恢复(导入) — 创建目标 schema · 在目标端创建表结构 · 检查目标端的触发器 · 加载(mysql) · 加载(mysql,覆盖同一个 schema) · 加载(util.loadDump) …
- 实例备份 — 导出用户和权限 · 备份所有 schema(mysqldump) · 备份实例(util.dumpInstance) · 将备份复制到恢复服务器 · 加载备份(mysql) · 加载用户 …
- 源服务器上的迁移账号 — 创建迁移用户 · 在防火墙中向目标端开放端口 · 停止应用(切换时刻)
- 在目标服务器上传输 — 将源端连接保存为 login-path · 迁移用户 · 传输 schema(mysqldump | mysql) · 在目标端加载用户 · 对源端执行 dump(util.dumpInstance / dumpSchemas) · 加载到目标端(util.loadDump) …
- 从 dump 中提取单表 — 确认表在 dump 中 · 从 dump 中提取表 · 创建目标 schema · 加载表 · 将表恢复到原 schema · 比较行数 …
- 备份用户和 login-path — 创建操作系统备份用户 · 创建 MySQL 备份账号 · 保存 login-path(mysql_config_editor)
- 备份脚本 — 安装通知工具 · 编写备份脚本 · 使脚本可执行 · 手动执行第一次备份
- 调度(systemd timer) — 编写 systemd 服务 · 编写 systemd timer · 启用 timer 并手动触发服务 · 检查定时任务是否已运行(第二天)
- 调度(cron) — 准备 cron 服务 · 编写 cron 任务 · 设置 cron 文件权限并在 cron 环境中测试 · 检查定时任务是否已运行(第二天)
- 验证与监控 — 将最新备份恢复到测试 schema · 监控最新备份的时间
- 下一步:物理备份 — 弥补逻辑备份的局限