一、脚本概述
该脚本使用 mysqldump 工具,实现以下功能:
- 备份指定的一个或多个 mysql 数据库
- 自动创建日志和备份数据目录
- 备份文件压缩为
.tar.gz格式,节省磁盘空间 - 记录每次备份的开始、成功、失败日志
- 自动删除 30 天前的旧备份文件
适用场景:linux 服务器 + mysql 5.7/8.0,支持非标准端口(如 9200)。
二、快速使用
1. 准备脚本
使用 vim 创建脚本文件(不要用 ftp 工具上传,避免格式问题):
vim /opt/mysql_backup.sh
保存退出。
2. 修改配置
根据你的环境修改以下变量:
user='your_db_user' # 数据库用户名 password='your_password' # 数据库密码 host='your_db_host' # 数据库 ip port=3306 # 端口(默认3306) dbname='db1 db2 db3' # 需要备份的数据库,空格分隔
3. 执行备份
sh /opt/mysql_backup.sh
执行后会在脚本所在目录下生成 mysql/ 文件夹:
mysql/ ├── data/ # 存放 .tar.gz 压缩备份 └── log/ # 存放备份日志 mysqllog.log
4. 设置定时任务(生产推荐)
crontab -e # 每天凌晨 2 点执行备份 0 2 * * * /bin/bash /opt/mysql_backup.sh > /dev/null 2>&1
三、脚本逐段解读
1. 环境变量与配置
path=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export path
确保 mysqldump 等命令在 path 中。如果使用自定义安装路径(如 /usr/local/mysql-8.0/bin),需要在脚本中指定完整路径。
user='yxw01' password='yxw@123!' host='192.168.11.36' port=9200 dbname='mate_smart'
生产环境建议将密码存储在单独配置文件中,并设置
600权限,避免硬编码泄漏。
2. 动态路径与日志
backtime=`date +%y%m%d%h%m%s` # 备份时间戳,如 20250423140230 logpath=$(pwd)/mysql/log datapath=$(pwd)/mysql/data
3. 自动创建目录
if [ ! -d ${logpath} ];then
mkdir -pv ${logpath}
fi
-p 自动创建父目录,-v 输出创建信息。
4. 核心备份命令
/usr/local/mysql-8.0/bin/mysqldump --skip-lock-tables -u ${user} -h ${host} -p${port} -p${password} ${table} > ${datapath}/${backtime}-${table}.sql
参数解释:
--skip-lock-tables:备份时不锁表(对 innodb 表有效,myisam 仍可能锁)。避免阻塞业务写入。-p${port}:大写 p 指定端口,小写 p 是密码。- 重定向
>将 sql 输出到文件。
注意:如果 mysql 安装在非标准路径,需要指定 mysqldump 的完整路径,否则会报 command not found。
5. 压缩与清理原始文件
tar zcvf ${backtime}-${table}.tar.gz ${backtime}-${table}.sql > /dev/null
rm -f ${datapath}/${backtime}-${table}.sql
压缩后删除原始 sql 文件,只保留压缩包。> /dev/null 隐藏压缩过程输出
6. 日志记录与错误处理
if [ "$?" == 0 ];then
echo "备份成功" >> ${logpath}/mysqllog.log
else
echo "备份失败" >> ${logpath}/mysqllog.log
fi
$? 获取上一条命令的退出码,0 表示成功。
7. 过期备份清理
find $datapath -name "*.tar.gz" -type f -print -mtime +30 -exec rm -rf {} ;-mtime +30:修改时间超过 30 天的文件-exec rm -rf {} ;:执行删除操作
可根据磁盘容量调整保留天数(如 +7 保留一周)。
四、注意事项与生产优化
重要提醒
- 不要在业务高峰期备份:虽然使用了
--skip-lock-tables,但mysqldump仍可能增加数据库 i/o 负载。建议在凌晨执行。 - 脚本格式问题:务必在 linux 服务器上用
vim或nano创建脚本,不要用 windows 记事本编辑后上传,否则会遇到\r导致的command not found错误。 - 密码安全:生产环境建议使用
~/.my.cnf配置文件存放密码,脚本中只指定--defaults-extra-file。 - 备份文件验证:定期尝试恢复备份到测试环境,确保备份可用。
- 异地存储:压缩后的备份文件应同步到异地(如 oss、s3、nfs),防止服务器故障导致数据全丢。
优化建议
① 使用~/.my.cnf避免明文密码
# 创建 /root/.my.cnf [client] user=yxw01 password='yxw@123!' host=192.168.11.36 port=9200 chmod 600 /root/.my.cnf
脚本中改为:
mysqldump --defaults-extra-file=/root/.my.cnf ${table} > ...② 单数据库多线程备份(可选)
对于超大数据库,可使用 mydumper 或 并行 mysqldump,但脚本复杂度增加。
③ 备份失败告警
添加邮件或钉钉告警:
if [ "$?" != 0 ]; then
echo "备份失败" | mail -s "db backup failed" admin@example.com
fi④ 保留策略优化
除按天数删除外,可保留每周一次的全量备份(例如 find ... ! -name "*monday*" -mtime +7)。
五、脚本完整版(生产级改进)
#!/bin/bash
# 生产级 mysql 备份脚本
# 支持多库、压缩、过期清理、免密登录
set -e # 遇错停止(可选)
backup_base="/data/backup/mysql"
log_path="${backup_base}/log"
data_path="${backup_base}/data"
retention_days=30
# 使用 .my.cnf 存储凭证
mysql_opts="--defaults-extra-file=/root/.my.cnf --skip-lock-tables"
# 需要备份的数据库列表
databases="db1 db2 db3"
# 创建目录
mkdir -p ${log_path} ${data_path}
# 备份时间戳
timestamp=$(date +%y%m%d%h%m%s)
# 记录日志函数
log() {
echo "[$(date '+%y-%m-%d %h:%m:%s')] $1" | tee -a ${log_path}/backup.log
}
log "========== 开始备份 =========="
for db in ${databases}; do
backup_file="${data_path}/${timestamp}-${db}.sql"
compressed_file="${backup_file}.tar.gz"
log "正在备份数据库: ${db}"
mysqldump ${mysql_opts} ${db} > ${backup_file}
if [ $? -eq 0 ]; then
tar czf ${compressed_file} -c ${data_path} $(basename ${backup_file})
rm -f ${backup_file}
log "备份成功: ${compressed_file}"
else
log "备份失败: ${db}"
# 可选:发送告警
fi
done
# 清理过期备份
find ${data_path} -name "*.tar.gz" -type f -mtime +${retention_days} -delete
log "已清理超过 ${retention_days} 天的旧备份"
log "========== 备份完成 =========="六、总结
本文提供的备份脚本简单可靠,已在生产环境运行多年。核心要点:
- 使用
mysqldump+tar实现备份与压缩 - 通过
find自动清理过期文件 - 完整的日志记录便于追溯
- 结合 crontab 实现无人值守
最后提醒:定期测试恢复 比备份本身更重要。建议每季度从备份文件中恢复一次数据,验证备份有效性。
以上就是mysql数据库自动化备份脚本的实践指南的详细内容,更多关于mysql自动化备份脚本的资料请关注代码网其它相关文章!
发表评论