mysql自动备份脚本必须显式创建并赋权备份目录与日志目录,设置~/.my.cnf权限为600,否则因permission denied、配置被忽略或日志写入失败导致备份静默中断。

MySQL自动备份脚本本身不负责日志归档目录权限管理,权限必须由操作系统层面显式设置;否则备份会因Permission denied或mysqldump: Got error: 1045失败,且find -mtime清理旧文件也会静默跳过。
备份脚本里必须显式创建并赋权备份目录
不能依赖手动提前建好目录——crontab 以 root 或普通用户身份运行时,工作环境和权限上下文可能不同。脚本开头必须包含创建目录 + 设置属主/权限的逻辑:
-
mkdir -p "$BACKUP_DIR"确保路径存在(-p避免父目录缺失报错) -
chown mysql:mysql "$BACKUP_DIR"(若 mysqldump 由mysql用户触发)或chown backupuser:backupuser "$BACKUP_DIR"(若用独立备份账户) -
chmod 750 "$BACKUP_DIR"限制组内可读写、其他用户无权限,避免敏感 SQL 文件被未授权访问 - 不要用
chmod 777—— 即便临时调试也不推荐,备份文件含明文结构与数据,属高危暴露面
日志归档目录权限常被忽略的三个细节
日志目录(如 /home/backup/logs)不是可有可无的附加项,它是排查 mysqldump 失败的唯一线索。常见错误包括:
- 脚本里写了
echo "xxx" >> $LOG_DIR/backup.log,但$LOG_DIR目录不存在 → 日志写入失败,错误被吞掉 -
LOG_DIR权限为755,但执行脚本的用户不在该目录所属组中 →Permission denied写日志,且不会中断脚本执行 - 日志文件本身没加
touch或chmod 644→ 后续用logrotate切割时因权限不足失败 - 建议统一在脚本中补全:
mkdir -p "$LOG_DIR" && chmod 755 "$LOG_DIR" && touch "$LOG_DIR/backup.log" && chmod 644 "$LOG_DIR/backup.log"
~/.my.cnf 权限必须是 600,否则 mysqldump 拒绝读取
把密码放进 ~/.my.cnf 是规避脚本明文密码的通用做法,但 MySQL 客户端会严格校验该文件权限:
- 若权限 >
600(比如644或755),mysqldump会直接报错:Warning: World-writable config file '/root/.my.cnf' is ignored,然后退回到交互式密码提示,导致定时任务卡住 - 正确操作:写完配置后立刻执行
chmod 600 ~/.my.cnf,且确保该文件属主是运行脚本的用户(如root或backupuser) - 配置内容示例(注意
[client]段,不是[mysqld]):[client] user = backup_user password = your_strong_password host = localhost port = 3306
真正容易出问题的地方不在 mysqldump 命令本身,而在于它运行时所处的整个文件系统上下文——目录是否存在、属主是否匹配、权限是否过宽、日志能否落盘、凭据文件是否被客户端拒绝。每一步都得在脚本里“亲手确认”,不能假设 cron 环境和你当前 shell 一样干净。











