logrotate 的 prerotate 阶段可在日志轮转前执行数据库备份,需配置 prerotate ... endscript 块、确保脚本可执行且成功退出(exit 0),并用 flock 或 sharedscripts 避免重复备份,同时记录日志用于调试。

要在 Logrotate 的 prerotate 阶段执行数据库备份(例如 MySQL 或 PostgreSQL),核心是确保该脚本在日志轮转前、且日志文件还“完整未切分”时运行,从而捕获到最新日志内容。关键点在于:prerotate 脚本必须成功退出(exit 0),否则 logrotate 会跳过本次轮转;同时需注意权限、环境变量和并发安全。
确保 prerotate 脚本可执行且被正确调用
Logrotate 默认不会自动执行 prerotate —— 必须在配置中显式启用,并指定脚本路径或内联逻辑:
- 在 logrotate 配置块中添加
prerotate ... endscript块,里面写 shell 命令或调用外部脚本 - 若调用外部脚本(如
/usr/local/bin/backup-before-rotate.sh),需确保:- 脚本有执行权限:
chmod +x /usr/local/bin/backup-before-rotate.sh - 脚本以
#!/bin/bash开头,避免因 sh 兼容性导致命令失败 - logrotate 运行用户(通常是 root)能访问数据库凭证和执行命令(如
mysqldump)
- 脚本有执行权限:
在 prerotate 中安全执行数据库备份
prerotate 阶段适合做“只读快照类”操作。以 MySQL 为例,典型做法是导出当前日志关联的数据库状态(如审计日志对应的应用库),而非备份 binlog 本身(那属于 DBA 日常备份范畴):
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 使用
mysqldump --single-transaction --routines --triggers导出逻辑备份,避免锁表 - 将备份文件名带上时间戳和日志名标识,便于追溯:
mysqldump app_db > /backup/app_db_$(date +\%Y\%m\%d_\%H\%M)_pre_rotate.sql - 务必检查命令返回值,失败时显式
exit 1阻止轮转(防止日志切分但备份丢失) - 避免在 prerotate 中做耗时操作(如压缩、上传),可先生成原始 SQL,再由后续 cron 异步处理
处理多实例或动态日志路径的场景
如果 logrotate 配置用了通配符(如 /var/log/myapp/*.log),prerotate 会被每个匹配文件触发一次。此时需避免重复备份:
- 用文件锁(
flock)限制同一时刻仅一个备份进程运行:flock -n /tmp/backup.lock -c "mysqldump ..." - 或改用
sharedscripts+prerotate组合:加上sharedscripts后,prerotate 只执行一次(针对整个 glob 匹配组),更合理 - 若需区分不同服务,可在 prerotate 中通过
$1(当前日志路径)判断上下文,例如:[[ "$1" == "/var/log/myapp/access.log" ]] && do_app_backup
验证与调试技巧
logrotate 默认不输出 prerotate 细节,调试需主动加日志:
- 在 prerotate 块首行加:
echo "$(date): Starting prerotate backup" >> /var/log/logrotate-debug.log - 用
logrotate -d /etc/logrotate.d/myapp查看调试输出(不实际执行) - 用
logrotate -f /etc/logrotate.d/myapp强制运行并观察行为 - 检查
/var/lib/logrotate/status确认上次轮转时间,辅助判断是否生效










