MySQL 冷备份必须停止 mysqld 服务,否则无法保证数据文件一致性——这是最常被忽略的前提,直接导致备份无效。
冷备份的本质是复制物理文件
MySQL 的 InnoDB 表数据实际存储在
ibdata1、
ib_logfile0、表空间文件(如
db_name/tbl_name.ibd)以及
mysql系统库的
ibdata1和 frm 文件中。MyISAM 则依赖
.MYD+
.MYI+
.frm三件套。冷备份就是把这些文件原样拷走,不经过 SQL 层,也不触发任何日志刷盘逻辑。
所以它快、简单、恢复也快,但代价是服务中断。常见误操作包括:
只复制/var/lib/mysql/db_name/下的表文件,漏掉全局文件(
ibdata1、
ib_logfile*、
mysql/目录) 没停服务就 cp,结果
ibdata1处于未刷盘状态,恢复后 InnoDB 拒绝启动并报错
InnoDB: Database page corruption on disk用 rsync 不加
--archive --checksum,或复制过程中磁盘满、权限丢失
标准冷备份操作步骤(Linux + 默认 datadir)
确认 MySQL 已完全停止(
systemctl is-active mysql返回
inactive,且
ps aux | grep mysqld无残留进程)后执行: 记录当前版本与配置:
mysqld --version和
mysqld --verbose --help | grep "datadir\|socket"确认数据目录位置:
grep "datadir" /etc/my.cnf或
mysql -e "SHOW VARIABLES LIKE 'datadir';"(仅限启动时查,冷备前不能连) 打包全部内容(含隐藏文件):
tar -czf /backup/mysql_$(date +%F).tar.gz -C /var/lib/ mysql/(注意末尾斜杠,确保打包的是目录内容而非目录本身) 校验压缩包完整性:
tar -tzf /backup/mysql_*.tar.gz | head -20,再比对文件数:
find /var/lib/mysql -type f | wc -lvs
tar -tzf /backup/mysql_*.tar.gz | wc -l
恢复时最容易出问题的三个点
冷备份恢复不是简单解压就能用,InnoDB 对文件状态极其敏感:
目标机器 MySQL 必须完全停止,且datadir目录下原有文件需先清空(
rm -rf /var/lib/mysql/*),不能覆盖式解压 解压后必须严格保持原权限:
chown -R mysql:mysql /var/lib/mysql,否则启动失败报错
Can't start server: Bind on TCP/IP port或更隐蔽的
Table 'mysql.plugin' doesn't exist若源库启用了
innodb_file_per_table=OFF,所有表共享
ibdata1,则必须整份还原;哪怕只缺一个
.ibd文件,InnoDB 启动时也会拒绝加载该表,且不会提示具体缺失项
冷备份看似简单,真正可靠的实践取决于对 InnoDB 存储引擎底层文件依赖关系的理解——比如
ib_logfile*虽然可删,但删了会导致崩溃恢复失败;
mysql.sock和
pid文件不用备份,但
auto.cnf(含 server-uuid)必须保留,否则主从复制或 GTID 会紊乱。
