Binlog 必须开启且配置正确,宝塔默认未启用;需检查 log_bin 状态,若关闭则在 my.cnf 的 [mysqld] 段添加 log-bin、binlog-format 和 server-id 参数,并重启 MySQL。

Binlog 是否开启且配置正确
宝塔面板默认不启用 MySQL 的 binlog,而增量备份完全依赖它。先确认是否已开启:登录服务器执行 mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';",返回 ON 才算有效。若为 OFF,需手动编辑 MySQL 配置文件(通常是 /www/server/mysql/etc/my.cnf),在 [mysqld] 段落下添加:
log-bin = /www/server/data/mysql-bin binlog-format = ROW server-id = 1
注意路径 /www/server/data/ 必须存在且 MySQL 进程有写权限;server-id 在单机环境下可固定为 1,但若未来扩展主从,必须全局唯一;修改后需重启 MySQL:systemctl restart mysqld。
用 mysqlbinlog 提取指定时间范围的增量日志
增量备份本质是把某段时间内产生的 binlog 文件内容导出为 SQL 文件。关键不是“每天全量 dump”,而是“截取昨天 00:00 到今天 00:00 的变更”。常用命令结构如下:
mysqlbinlog --no-defaults \ --base64-output=DECODE-ROWS -v \ --start-datetime="2024-06-10 00:00:00" \ --stop-datetime="2024-06-11 00:00:00" \ /www/server/data/mysql-bin.000001 > /backup/increment_20240610.sql
实际脚本中不能硬编码文件名或时间,需动态获取:
-
mysql -Nse "SHOW BINARY LOGS;" | awk '{print $1}' | tail -n 1获取最新 binlog 文件名 - 用
date -d "yesterday" +%Y-%m-%d和date +%Y-%m-%d构造时间范围 - 务必加
--base64-output=DECODE-ROWS -v,否则 ROW 格式日志不可读、无法回放 - 导出路径
/backup/需提前创建并确保宝塔计划任务以root或www用户有写权限
宝塔计划任务中调用脚本的权限与路径陷阱
宝塔的“Shell 脚本”任务默认以 www 用户运行,但 mysqlbinlog 需要读取 MySQL 数据目录下的 binlog 文件,而该目录通常只对 mysql 或 root 可读。直接运行会报错:Permission denied 或 Could not read binlog file。
解决方法只有两个:
- 在脚本开头加
sudo -u root(前提是www用户已配置免密 sudo 权限,不推荐) - 更稳妥的是:将脚本保存为
/www/backup/incr_backup.sh,然后在宝塔任务中执行bash /www/backup/incr_backup.sh,并在脚本第一行显式切换用户:#!/bin/bash后立即写if [ $(id -u) -ne 0 ]; then exec sudo "$0" "$@"; fi - 绝对避免在脚本里用相对路径,所有
mysql、mysqlbinlog命令都写全路径,例如/www/server/mysql/bin/mysqlbinlog(查路径用which mysqlbinlog)
如何安全清理过期 binlog 并避免磁盘爆满
binlog 不清理会持续增长,尤其高流量网站一天可能产生数 GB。MySQL 自带自动清理机制,但宝塔默认关闭。别依赖脚本手动 rm,容易误删正在使用的文件。
正确做法是在 my.cnf 中设置:
expire_logs_days = 7 max_binlog_size = 100M
然后执行 mysql -uroot -p -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);" —— 这和配置项效果一致,但建议优先用配置,让 MySQL 自己管理。若已堆积大量旧日志,首次清理前先用 SHOW BINARY LOGS; 确认最老的文件名,再用 PURGE BINARY LOGS TO 'mysql-bin.000010'; 安全截断。
增量备份脚本里不必包含清理逻辑,那是 MySQL 服务层的事;你只需确保备份脚本提取日志时,目标时间段内的文件尚未被 PURGE。

















