mysql如何实现数据库备份自动化_编写shell脚本定时执行

mysqldump 命令怎么写才不丢数据

直接用 mysqldump 默认参数备份,极大概率漏掉表结构或丢失事务一致性。比如没加 –single-transaction,备份期间有写入就会产生不一致;没加 –routines 和 –events,存储过程和事件就没了。

推荐最小安全组合:

–single-transaction:对 InnoDB 表保证一致性快照(MyISAM 仍需 –lock-all-tables)–routines –events –triggers:一并导出存储过程、事件、触发器–hex-blob:避免二进制字段(如 BLOB)在转义时损坏–default-character-set=utf8mb4:防止字符集不匹配导致乱码

示例命令:mysqldump -u root -p’xxx’ –single-transaction –routines –events –triggers –hex-blob –default-character-set=utf8mb4 mydb > /backup/mydb_$(date +\%Y\%m\%d).sql

shell 脚本里怎么安全处理密码和路径

把密码明文写进脚本或命令行,ps aux 一眼就能看到,也容易被历史命令泄露。MySQL 官方推荐用配置文件 + 权限控制,而不是 `-p` 后直接跟密码。

新建 ~/.my.cnf,内容:[client]user = backup_userpassword = your_strong_passwordhost = localhost立刻执行 chmod 600 ~/.my.cnf,否则 mysqldump 会拒绝读取备份路径必须用绝对路径,且确保运行脚本的用户(如 mysql 或 backup)有写权限 —— 常见坑是定时任务用 root 运行,但备份目录属主是 mysql,结果写失败没报错

crontab 定时执行为什么总失败

本地手动跑通的脚本,放进 crontab 就静默失败,90% 是环境变量和路径问题。cron 不加载你的 ~/.bashrc,所以 mysqldump 可能根本找不到。

脚本开头强制指定 PATH:#!/bin/bashPATH=/usr/local/bin:/usr/bin:/bin所有命令用绝对路径:/usr/bin/mysqldump 而不是 mysqldump重定向 stderr 到日志:2>> /var/log/backup.log,否则错误全丢进黑洞crontab 条目别用 ~,写成完整路径:0 2 * * * /home/backup/backup.sh

备份文件怎么避免越积越多占满磁盘

没人清理的备份,三个月后你会发现 /backup 目录只剩 2% 空间。自动删旧不能靠“大概看看”,得按时间戳精准控制。

用 find 按修改时间删(比按文件名更可靠):find /backup -name "*.sql" -mtime +7 -delete如果备份名含日期(如 mydb_20240501.sql),也可用 ls | grep -v "$(date -d ‘7 days ago’ +%Y%m%d)" | xargs rm -f,但注意这种依赖文件名格式,不如 -mtime 稳定加个空间检查再备份:if [ $(df /backup | awk ‘NR==2 {print $5}’ | sed ‘s/%//’) -gt 85 ]; then exit 1; fi,超阈值直接退出,避免写到一半磁盘满

真正麻烦的是跨服务器备份或加密传输,那些得另配 ssh key 和 gpg,当前脚本先守住本地一致性——毕竟连本地都备不全,谈什么容灾。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。