MySQL的物理备份是指直接复制数据库在磁盘上的数据文件、日志文件以及相关配置,而不是通过SQL语句导出数据行。文件级备份属于物理备份的一种实现方式,它把存储引擎管理的底层文件(如InnoDB的ibdata1、各表ibd文件、redo日志等)当作普通文件处理。这种方式绕开了查询优化器和SQL解析,备份速度只受磁盘IO限制,因此特别适合体量大的业务库。

一、MySQL物理文件结构简述
在做文件级备份前,必须先搞清楚MySQL在数据目录下存放了哪些关键文件。以最常用的InnoDB引擎为例,其文件主要包括:ibdata1(共享表空间,存放数据字典、undo信息等)、各库的目录及其中表的ibd文件(独立表空间)、ib_logfile0与ib_logfile1(redo日志)、以及MySQL自身的系统库mysql目录。如果只拷贝业务库的文件夹而遗漏了系统库或redo,恢复后实例往往无法启动。
另外,配置文件my.cnf虽不在数据目录内,但备份时也应一并保留,因为表空间格式、日志大小等参数必须与备份时一致,否则InnoDB会拒绝加载。对于使用MyISAM引擎的表,还需要复制对应的frm、MYD、MYI文件,并且MyISAM不支持事务,只能在停写状态下拷贝才安全。
二、冷备份:最基础的文件级方式
冷备份就是先正常关闭MySQL服务,然后整体复制数据目录。因为实例已停,不会有任何写操作,复制出来的文件天然一致。这种方法简单可靠,不需要额外工具,适合可以接受停机维护的场景,比如夜间低峰批量处理。
操作上先执行系统命令停止服务,例如使用systemctl stop mysqld,随后用rsync或cp把/var/lib/mysql整个目录打包到备份盘。恢复时只需把文件原样放回,注意修改属主为mysql用户再启动。缺点是业务必须中断,对于7x24系统不友好。下面给出一个简单的冷备脚本示例:
#!/bin/bash # 停止MySQL服务 systemctl stop mysqld # 使用rsync拷贝数据目录到备份盘 rsync -a /var/lib/mysql/ /backup/mysql_cold/ # 备份配置文件 cp /etc/my.cnf /backup/mysql_cold/my.cnf # 启动服务 systemctl start mysqld
三、热备份:不中断业务的文件级拷贝
如果无法停机,就需要热备份工具在MySQL运行时保证文件一致性。Percona XtraBackup是开源界最常用的物理热备工具,它基于InnoDB的崩溃恢复机制,先拷贝文件再重放redo,最终得到一致副本。相比逻辑备份,它不锁表(对InnoDB),备份GB级数据也只需几分钟。
使用XtraBackup做全量备份的典型命令如下,备份目录会包含完整的数据文件和后续需要的xtrabackup_binlog_info等元数据:
# 执行全量备份,目标目录为/backup/full xtrabackup --backup --target-dir=/backup/full --user=root --password=密码 # 备份完成后准备(apply log),使文件达到一致状态 xtrabackup --prepare --target-dir=/backup/full
恢复时先停库,清空原数据目录,再把备份拷贝回去并赋权。该方式优势明显:业务几乎无感知,恢复时间远短于导入SQL。但需要注意磁盘空间要能容纳备份副本,并且备份用户需有相应系统权限。
四、文件系统快照方案
当MySQL运行在LVM、ZFS或云盘上时,可利用文件系统快照实现秒级文件级备份。快照在底层冻结了某一时刻的块设备状态,之后从快照挂载点拷贝文件即可。因为快照瞬间完成,相当于给MySQL加了极短的全局读锁,对线上影响很小。
以LVM为例,先执行FLUSH TABLES WITH READ LOCK拿到读锁,接着创建逻辑卷快照,然后解锁,最后从快照目录复制数据。示例流程:
# 对MySQL加读锁并刷新 mysql -e "FLUSH TABLES WITH READ LOCK;" # 创建LVM快照,假设原卷为vg0/mysql lvcreate -L 10G -s -n mysql_snap /dev/vg0/mysql # 解锁 mysql -e "UNLOCK TABLES;" # 挂载快照并拷贝 mkdir /mnt/snap mount /dev/vg0/mysql_snap /mnt/snap rsync -a /mnt/snap/ /backup/lvm_snap/ umount /mnt/snap lvremove -f /dev/vg0/mysql_snap
快照方案依赖存储层能力,不适合所有环境,但一旦具备条件,它兼顾了速度与一致性,是大型库文件级备份的优选。
五、文件级备份的注意事项与校验
无论采用哪种文件级备份,都要避免两个常见坑:一是只备份业务库目录忘了mysql系统库,导致用户权限和存储过程丢失;二是文件属主错误,恢复后MySQL进程无法读取。每次备份完建议记录binlog位置,并抽样启动一个临时实例做恢复演练。
还可建立简单的校验表,对比备份前后文件数量和大小,防止拷贝中途失败。如下给出一个检查清单示例:
| 检查项 | 说明 |
|---|---|
| 系统库mysql | 必须包含,否则权限表丢失 |
| ib_logfile* | redo日志,缺失会无法崩溃恢复 |
| 文件属主 | 应为mysql:mysql |
| 配置my.cnf | 参数需与备份时一致 |
物理备份不是万能,它绑定了MySQL版本和硬件架构,跨大版本恢复前要测试。但作为文件级保护手段,它在速度与可靠性上远胜逻辑导出,是DBA工具箱里不可替代的一环。