做开发和运维的朋友都懂,数据库数据是业务的命脉,误删、故障、数据损坏分分钟让人头大。与其出问题后焦头烂额恢复,不如做好定时自动备份,把风险掐灭在源头。
今天就教大家用Linux的Shell脚本编写MySQL数据库定时备份脚本,步骤清晰、代码可直接复用,搭配系统定时任务,实现备份自动化,解放双手的同时给数据上一道“安全锁”!
一、核心备份脚本编写
这份脚本适配Linux系统,实现了**按日期创建备份目录**、**完整备份指定数据库**、**自动清理3天前旧备份**三大核心功能,避免备份文件堆积占满磁盘,代码可直接复制修改使用。
完整备份脚本(mysql_backup.sh)
bash#!/bin/bash# 数据库备份核心脚本# 定义备份根目录(需提前确认目录存在且有读写权限)BAKUP_DIR=/mnt/mysql/backup# 获取当前日期,格式为年-月-日(如20250520),用于备份目录命名date_str=$(date +%Y%m%d)# 数据库连接信息(根据自己的实际环境修改!)MYSQL_HOST=192.168.1.1 # 数据库IP,本地可写127.0.0.1MYSQL_DB=mysqldb # 需要备份的数据库名MYSQL_USER=root # 数据库登录账号MYSQL_PW=123456 # 数据库登录密码MYSQL_PORT=3306 # 数据库端口,默认3306# 拼接当日备份目录路径my_dir="$BAKUP_DIR/$date_str"# 判断当日备份目录是否存在,不存在则创建(-p自动创建上级目录)if [ ! -d "$my_dir" ]; then echo "开始创建当日备份目录:$my_dir" mkdir -p $my_dirfi# 执行mysqldump备份数据库,生成sql文件# --add-drop-database:备份文件中包含删除数据库语句# --lock-tables=false:不锁表(适合生产环境读写频繁场景)/usr/bin/mysqldump --add-drop-database --lock-tables=false \-h$MYSQL_HOST -u$MYSQL_USER -P$MYSQL_PORT -p$MYSQL_PW $MYSQL_DB \>$my_dir/mysqldb.sql# 自动清理3天前的备份目录,-ctime +3表示创建时间超过3天的目录find /mnt/mysql/backup/* -type d -ctime +3 -exec rm -rf {} \;echo "数据库备份完成!备份文件路径:$my_dir/mysqldb.sql"
二、脚本关键配置说明
脚本中**标注需修改**的部分,一定要根据自己的实际数据库环境调整,这是脚本能正常运行的关键:
1. BAKUP_DIR:备份文件存放的根目录,建议挂载独立磁盘,避免占满系统盘;
2. MYSQL_HOST:数据库服务器IP,本地数据库可改为`127.0.0.1`;
3. MYSQL_DB:需要备份的**单个数据库名**,如果要备份多个库,可修改脚本或多次执行mysqldump;
4. MYSQL_USER/MYSQL_PW:数据库登录账号和密码,建议创建**仅拥有备份权限**的专用账号,提升安全性;
5. MYSQL_PORT:数据库端口,默认3306,若修改过端口需对应调整;
6. mysqldump路径:脚本中用了绝对路径`/usr/bin/mysqldump`,可通过`which mysqldump`命令查询自己服务器的实际路径,避免因环境变量问题执行失败。
三、脚本赋权与手动测试
编写完脚本后,不能直接用,需要先给脚本**执行权限**,再手动测试是否能正常备份,避免定时任务执行后出问题。
1. 给脚本添加执行权限
将脚本保存为`mysql_backup.sh`,放在任意目录(如`/usr/local/shell/`),执行以下命令赋权:
bash# 赋权执行权限(r=读,w=写,x=执行)chmod +x /usr/local/shell/mysql_backup.sh
2. 手动执行脚本测试
执行脚本,查看是否有报错,且备份目录下生成了对应日期的文件夹和sql文件:
bash# 进入脚本所在目录cd /usr/local/shell/# 执行脚本./mysql_backup.sh
测试成功标志:
- 控制台输出`数据库备份完成!备份文件路径:xxx`;
- 进入`/mnt/mysql/backup/`目录,能看到当日日期命名的文件夹,里面有`mysqldb.sql`文件。
如果执行报错,常见原因:
- 未安装mysqldump:执行`yum install mysql-community-client -y`(CentOS)或`apt install mysql-client -y`(Ubuntu)安装;
- 数据库连接失败:检查IP、端口、账号密码是否正确,且数据库开放了远程连接权限(本地备份可忽略);
- 目录无读写权限:执行`chmod 755 /mnt/mysql/backup -R`赋予目录权限。
四、配置定时任务(crontab),实现自动备份
手动备份只能解燃眉之急,搭配Linux的**crontab**定时任务,才能实现**无人值守自动备份**,比如每天凌晨2点业务低峰期执行备份,不影响业务运行。
1. 编辑crontab定时任务
执行以下命令编辑当前用户的定时任务(建议用root用户配置,避免权限问题):
第一次执行可能会让选择编辑器,选`vim`即可(输入数字对应序号)。
2. 添加定时任务规则
在文件末尾添加以下内容,根据自己的需求调整**执行时间**和**脚本绝对路径**:
bash# 每天凌晨2点执行MySQL备份脚本,日志输出到备份目录,方便排查问题0 2 * * * /usr/local/shell/mysql_backup.sh >> /mnt/mysql/backup/backup_log.log 2>&1
3. 定时任务规则说明
crontab的格式为:`分 时 日 月 周 执行的命令`,几个常用示例:
- `0 2 * * *`:每天凌晨2点执行(推荐);
- `30 1 * * 0`:每周日凌晨1点30分执行;
- `0 0 1 * *`:每月1号凌晨0点执行。
4. 重启crontab服务并查看任务
添加完成后,保存退出(vim中按`ESC`,输入`:wq`回车),重启crontab服务让配置生效:
bash# CentOS/RHELsystemctl restart crond# Ubuntu/Debiansystemctl restart cron
查看已配置的定时任务,确认是否添加成功:
五、脚本优化与实用建议
这份基础脚本能满足大部分场景需求,结合生产环境,给大家几个优化和实用建议,让备份更安全、更易用:
1. 备份文件压缩,节省磁盘空间
SQL文件通常体积较大,可在备份后添加压缩命令,将sql文件压缩为tar.gz格式,节省70%以上磁盘空间:
在脚本`mysqldump`备份语句后添加:
bash# 压缩sql文件,删除原文件tar -zcvf $my_dir/mysqldb.sql.tar.gz $my_dir/mysqldb.sqlrm -rf $my_dir/mysqldb.sql
2. 避免明文写数据库密码(重要!)
基础脚本中密码是明文,存在安全风险,可通过**MySQL配置文件**隐藏密码:
1. 在用户家目录创建`.my.cnf`文件:`vim ~/.my.cnf`;
2. 添加以下内容,替换为自己的数据库账号密码:
ini [mysqldump] host=192.168.1.1 user=root password=123456 port=3306
3. 设置文件权限(关键,避免其他用户读取):`chmod 600 ~/.my.cnf`;
4. 修改备份脚本中的mysqldump语句,删除密码参数:
bash /usr/bin/mysqldump --add-drop-database --lock-tables=false $MYSQL_DB >$my_dir/mysqldb.sql
3. 增加备份失败邮件提醒
如果备份失败,能及时收到提醒,避免出问题后不知情:
1. 安装邮件服务:`yum install mailx -y`;
2. 在脚本末尾添加判断逻辑,检测sql文件是否生成,未生成则发送邮件:
bash if [ -f "$my_dir/mysqldb.sql" ]; then echo "备份成功" else echo "【警告】MySQL数据库备份失败!请立即排查" | mail -s "数据库备份失败提醒" your_email@qq.com fi
4. 异地备份,双重保障
本地备份仍有风险(如服务器磁盘损坏),建议将备份文件同步到**云存储(OSS/S3)** 或**另一台服务器**,实现异地备份,比如用`rclone`同步到阿里云OSS,或用`scp`同步到远程服务器。
5. 定期验证备份文件可用性
备份不是目的,能恢复才是关键!建议每周手动验证一次备份文件,执行`mysql -uroot -p 新数据库名 < 备份.sql`,确认能正常恢复数据,避免备份文件损坏无法使用。
六、总结
这份Linux Shell数据库备份脚本,核心就是**mysqldump备份工具**+**Shell条件判断**+**crontab定时任务**的组合,三步就能实现MySQL数据库的自动化备份:
1. 编写并修改脚本配置,适配自己的数据库环境;
2. 给脚本赋权并手动测试,确保能正常备份;
3. 配置crontab定时任务,实现无人值守自动备份。
其实不仅是MySQL,Oracle、PostgreSQL等数据库,也能通过类似的思路编写Shell备份脚本,核心逻辑都是**工具备份+定时执行+自动清理**。
数据安全无小事,一份简单的备份脚本,能避免绝大多数数据丢失的风险,赶紧动手配置起来,给你的业务数据上一道“安全保险”吧!
---
文末小福利
我整理了**Linux Shell常用脚本模板**(包括多库备份、备份压缩、异地同步),关注公众号【常用技术】,回复【数据库备份】即可免费领取,直接修改就能用,省时省力!