mysql如何进行全量备份与增量备份_mysql备份计划建议

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

全量备份用
mysqldump
还是
mysqlbackup

生产环境优先选

mysqlbackup
(MySQL Enterprise Backup),它支持热备、压缩、加密,且备份期间不影响主库读写。但它是商业版组件,社区版用户只能用
mysqldump
Percona XtraBackup

mysqldump
简单但有明显限制:
– 备份期间对大表会加
READ LOCK
(除非用
--single-transaction
且引擎为 InnoDB)
– 不支持并行、不支持压缩传输、恢复速度慢
– 导出的是 SQL 文本,不是物理文件,无法用于快速挂载恢复

若用
mysqldump
,必须加
--single-transaction --routines --triggers --events
务必排除
information_schema
performance_schema
sys
库(它们不能被 dump)
导出后建议用
gzip
压缩:
mysqldump ... | gzip > full_$(date +%F).sql.gz

增量备份依赖 binlog,但开启前必须确认三件事

MySQL 本身没有“增量备份”命令,所谓增量,本质是开启并持续归档

binlog
,再配合上一次全备做 PITR(基于时间点恢复)。启用前需检查:

log_bin
必须为
ON
(查看
SHOW VARIABLES LIKE 'log_bin';
binlog_format
推荐设为
ROW
STATEMENT
在某些函数或非确定性语句下无法精确回放)
expire_logs_days
binlog_expire_logs_seconds
要设足够大,确保覆盖最长恢复窗口(例如设为 7 天,即
604800

归档脚本示例(每日截断并拷贝新 binlog):

mysql -e "FLUSH BINARY LOGS;"

cp /var/lib/mysql/mysql-bin.* /backup/binlog/

注意:不要直接
cp
正在写的
mysql-bin.0000xx
,要用
mysqlbinlog --read-from-remote-server
拉取或依赖
FLUSH
后的归档逻辑。

恢复时最容易漏掉的两个步骤

全量 + 增量恢复不是简单执行 SQL 文件就完事。常见失败原因是跳过了这两步:

全量恢复后,必须先
SET SQL_LOG_BIN = 0;
,否则重放 binlog 时会再次写入 binlog,导致循环或日志爆炸
mysqlbinlog
解析时,要指定起始位置或时间,且注意时区:
mysqlbinlog --start-datetime="2024-05-20 03:00:00" --database=myapp mysql-bin.000012 | mysql -u root

如果不知道从哪开始重放,查全备文件末尾的

CHANGE MASTER TO
注释(
mysqldump
默认输出),或用
show binlog events in 'mysql-bin.000011' limit 1\G
找第一个事件时间。

备份计划不能只看频率,关键在验证与隔离

每周全备 + 每日 binlog 归档只是纸面策略。真正决定成败的是:

每月至少一次还原演练:把备份拉到隔离环境,完整走一遍恢复流程,记录耗时与报错 备份文件必须与生产网络隔离(如存到对象存储、离线 NAS),防止勒索软件一并加密 所有备份需校验完整性:
gunzip -t full_2024-05-20.sql.gz
,对 binlog 用
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000012 | head -20
看是否可解析

最常被忽略的是权限与 SELinux —— 备份脚本用

root
运行没问题,但恢复时若用普通账号,可能因
FILE
权限缺失无法加载本地文件,或 SELinux 阻止
mysqld
读取非默认路径下的备份文件。

相关推荐