宝塔面板默认不支持数据库增量备份,必须通过脚本实现:启用mysql binlog(row格式)、用rsync同步新增binlog文件,并配合全量备份恢复。

宝塔面板默认不支持数据库增量备份,必须用脚本绕过
宝塔的「计划任务」里只有全量备份(mysqldump 或 pg_dump),没有 binlog 解析、LSN 截断或 WAL 归档逻辑。所谓“增量”,实际得靠外部工具抓取变更日志 + 本地快照比对来模拟——最可行的是:用 mysqlbinlog 拉取 binlog + rsync 同步新增/修改的 binlog 文件到远程。
注意:这不是传统意义的“数据库级增量恢复”,而是文件级增量同步,适用于低频写入、可容忍分钟级延迟的场景。
- 必须开启 MySQL 的
log-bin,且binlog_format = ROW(否则无法精确还原) - 宝塔默认关闭 binlog;需手动编辑
/www/server/mysql/etc/my.cnf,在[mysqld]下添加:log-bin = /www/server/data/mysql-bin<br>binlog-format = ROW<br>expire_logs_days = 7
- 重启 MySQL:
systemctl restart mysqld,再执行mysql -uroot -p -e "SHOW VARIABLES LIKE 'log_bin';"确认返回ON
编写增量备份脚本:只拉取新 binlog 并 rsync 到目标机
核心思路是记录上一次同步的 binlog 文件名和位置,下次只同步该点之后的新文件。不用解析内容,避免权限与格式陷阱。
把以下脚本保存为 /www/backup/binlog_sync.sh(注意路径可读可写):
#!/bin/bash
# 配置项
MYSQL_USER="root"
MYSQL_PASS="your_baota_mysql_root_pass" # 宝塔 root 密码,非系统 root
BINLOG_DIR="/www/server/data"
REMOTE_HOST="192.168.1.100"
REMOTE_USER="backup"
REMOTE_DIR="/backup/mysql-bin"
<h1>获取当前最新 binlog 文件名(不含序号后缀)</h1><p>CURRENT_BINLOG=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -Nse "SHOW MASTER LOGS;" | tail -1 | awk '{print $1}')
if [ -z "$CURRENT_BINLOG" ]; then
echo "ERROR: can't get current binlog"
exit 1
fi</p><h1>记录文件存本地,用于比对</h1><p>LAST_FILE="/www/backup/last_binlog.txt"
if [ ! -f "$LAST_FILE" ]; then
echo "first run, init last_binlog.txt"
echo "$CURRENT_BINLOG" > "$LAST_FILE"
exit 0
fi</p><p>LAST_BINLOG=$(cat "$LAST_FILE")
if [ "$CURRENT_BINLOG" = "$LAST_BINLOG" ]; then
echo "no new binlog, skip"
exit 0
fi</p><h1>rsync 新增 binlog 文件(按字典序同步所有 > LAST_BINLOG 的文件)</h1><p>cd "$BINLOG_DIR"
ls -1 mysql-bin.* | sort -V | while read f; do
if [[ "$f" > "$LAST_BINLOG" ]]; then
rsync -avz --delete-after "$f" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
fi
done</p><h1>更新记录</h1><p>echo "$CURRENT_BINLOG" > "$LAST_FILE"</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img
src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a>
<p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p>
</div>
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 脚本依赖
sort -V(版本排序),CentOS 7+ / Ubuntu 16.04+ 原生支持;老系统请换用ls -v -
rsync必须配置免密登录:ssh-keygen -t rsa→ssh-copy-id -i ~/.ssh/id_rsa.pub backup@192.168.1.100 - 不要用
mysqlbinlog --read-from-remote-server直接拉流——宝塔 MySQL 默认禁用REPLICATION SLAVE权限,改权限易引发面板异常
在宝塔中添加计划任务运行脚本
进宝塔「计划任务」→「添加定时任务」:
- 任务类型选「Shell 脚本」
- 脚本内容填:
bash /www/backup/binlog_sync.sh - 执行周期建议设为
*/10 * * * *(每 10 分钟一次),太密会频繁触发 rsync,太疏可能丢失最近变更 - 注意:脚本开头加
#!/bin/bash,且给执行权限:chmod +x /www/backup/binlog_sync.sh - 首次运行前,手动执行一次脚本并检查
/www/backup/last_binlog.txt是否生成正确文件名
如果任务日志里出现 Permission denied (publickey),说明 rsync 的 ssh 免密没配对——宝塔计划任务以 www 用户身份运行,不是 root,所以 ssh-copy-id 必须用 sudo -u www ssh-copy-id ... 执行。
恢复时怎么用这些 binlog 文件?
这不是一键还原流程。你拿到的是一堆 mysql-bin.000001 类文件,恢复步骤是:
- 先用全量备份(宝塔自动做的每日备份)还原库到某个时间点
- 再用
mysqlbinlog把对应时间段的 binlog 转成 SQL:mysqlbinlog --start-datetime="2024-05-20 10:00:00" --stop-datetime="2024-05-20 12:00:00" /backup/mysql-bin/mysql-bin.000005 | mysql -u root -p - 注意:
mysqlbinlog版本要和源 MySQL 一致,否则可能解析失败(如 MySQL 8.0 的 binlog 用 5.7 的 mysqlbinlog 会报错Unknown binary log format)
binlog 文件本身不包含库名,恢复前务必确认目标库名、表结构与备份时一致;跨大版本升级(如 5.7 → 8.0)前,必须验证 binlog 兼容性——这点最容易被忽略。










