数据库自动化备份脚本:从入门到生产实践

数据是企业的核心资产,定期备份数据库是每个运维和开发人员的必修课。本文分享一个生产环境验证过的 MySQL 自动备份脚本,支持多数据库备份、自动压缩、过期清理,并详细解读每一处细节,帮助你快速搭建可靠的备份体系。
该脚本使用 mysqldump 工具,实现以下功能:
.tar.gz 格式,节省磁盘空间适用场景:Linux 服务器 + MySQL 5.7/8.0,支持非标准端口(如 9200)。
使用 vim 创建脚本文件(不要用 FTP 工具上传,避免格式问题):
vim /opt/mysql_backup.sh保存退出。
根据你的环境修改以下变量:
USER='your_db_user'# 数据库用户名PASSWORD='your_password'# 数据库密码HOST='your_db_host'# 数据库 IPPORT=3306# 端口(默认3306)dbName='db1 db2 db3'# 需要备份的数据库,空格分隔sh /opt/mysql_backup.sh执行后会在脚本所在目录下生成 mysql/ 文件夹:
mysql/├── data/ # 存放 .tar.gz 压缩备份└── log/ # 存放备份日志 mysqllog.logcrontab -e# 每天凌晨 2 点执行备份02 * * * /bin/bash /opt/mysql_backup.sh >/dev/null2>&1PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbinexport PATH确保
mysqldump等命令在 PATH 中。如果使用自定义安装路径(如/usr/local/mysql-8.0/bin),需要在脚本中指定完整路径。
USER='yxw01'PASSWORD='yxw@123!'HOST='192.168.11.36'PORT=9200dbName='mate_smart'生产环境建议将密码存储在单独配置文件中,并设置
600权限,避免硬编码泄漏。
backtime=`date +%Y%m%d%H%M%S` # 备份时间戳,如 20250423140230logpath=$(pwd)/mysql/logdatapath=$(pwd)/mysql/dataif [ ! -d ${logpath} ];thenmkdir -pv ${logpath}fi
-p自动创建父目录,-v输出创建信息。
/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。
tar zcvf ${backtime}-${table}.tar.gz ${backtime}-${table}.sql > /dev/nullrm -f ${datapath}/${backtime}-${table}.sql压缩后删除原始 SQL 文件,只保留压缩包。
> /dev/null隐藏压缩过程输出
if [ "$?" == 0 ];thenecho"备份成功" >>${logpath}/mysqllog.logelseecho"备份失败" >>${logpath}/mysqllog.logfi
$?获取上一条命令的退出码,0 表示成功。
find $datapath -name "*.tar.gz" -type f -print -mtime +30 -execrm -rf {} ;-mtime +30:修改时间超过 30 天的文件-exec rm -rf {} ;:执行删除操作可根据磁盘容量调整保留天数(如
+7保留一周)。
--skip-lock-tables,但 mysqldump 仍可能增加数据库 I/O 负载。建议在凌晨执行。vim 或 nano 创建脚本,不要用 Windows 记事本编辑后上传,否则会遇到 r 导致的 command not found 错误。~/.my.cnf 配置文件存放密码,脚本中只指定 --defaults-extra-file。# 创建 /root/.my.cnf[client]user=yxw01password='yxw@123!'host=192.168.11.36port=9200chmod 600 /root/.my.cnf脚本中改为:
mysqldump --defaults-extra-file=/root/.my.cnf ${table} > ...对于超大数据库,可使用 mydumper 或 并行 mysqldump,但脚本复杂度增加。
添加邮件或钉钉告警:
if [ "$?" != 0 ]; thenecho"备份失败" | mail -s "DB Backup Failed" [email protected]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}"elselog"备份失败: ${DB}"# 可选:发送告警fidone# 清理过期备份find ${DATA_PATH} -name "*.tar.gz" -type f -mtime +${RETENTION_DAYS} -deletelog"已清理超过 ${RETENTION_DAYS} 天的旧备份"log"========== 备份完成 =========="本文提供的备份脚本简单可靠,已在生产环境运行多年。核心要点:
mysqldump + tar 实现备份与压缩find 自动清理过期文件最后提醒:定期测试恢复 比备份本身更重要。建议每季度从备份文件中恢复一次数据,验证备份有效性。
希望这篇笔记能帮助你建立规范的数据库备份机制。如有疑问或改进建议,欢迎留言讨论!
小米路由器历史固件怎么删除(小米路由器历史固件删除方法)
小米路由器青春版mini潘多拉固件怎么升级的(小米路由器青春版mini潘多拉固件升级方法)
小米路由器青春版mini怎么恢复出厂(小米路由器青春版mini恢复出厂方法)
小米路由器青春版mini设置教程(小米路由器青春版mini如何设置)
小米路由器分享路由器什么意思啊(小米路由器分享路由器含义详解)
小米路由器默认ip进不去怎么办(小米路由器默认ip进不去解决方案)