mysql如何进行冷备份_mysql离线备份方法

来源:这里教程网 时间:2026-02-28 20:50:21 作者:

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 -l
vs
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 会紊乱。

相关推荐