Linux Debian CentOS Shell脚本 通过Crontab定时备份MySQL
前言:
备份很重要、备份很重要、备份很重要。(PS:对应备份我也不免入俗了,重要的事情说三遍!!!)
但是我们不用每次都自己操作备份或导出数据文件,可以Shell
脚本帮我们自动完成这项重复劳动。
备份数据库前的思考:
- 确定备份文件存放位置、备份文件名策略、是否自动删除超过指定天数的历史文件。
- 需要备份哪些数据库还是所有的数据库。
- 导出备份文件后,是否需要对备份的数据文件进行压缩减小体积。
想清楚上面的几个问题后,就可以着手操作了。
准备条件
使用[mysqldump]
配置文件方法
创建备份专用账号
CREATE USER 'backupuser'@'localhost' IDENTIFIED BY 'p455w0rd'; GRANT SELECT, SHOW VIEW, LOCK TABLES, RELOAD, REPLICATION CLIENT ON *.* TO 'backupuser'@'localhost'; FLUSH PRIVILEGES;
将1中添加的账号添加至配置文件中
[mysqldump] user=backupuser password=p455w0rd
备份脚本
#!/bin/bash
# 直接指定备份数据库使用的用户名、密码。(不建议)
# user="db_username"
# password="db_password"
# 指定备份具体的数据库,多个数据库,中间用空格进分割。如果全部备份可以使用参数 --all-databases
# dbname="db1 db2 db3"
# 指定备份存放目录、备份文件名、备份文件名日期信息
backup_path="/data/bak/db"
backupname="db"
date=$(date "+%Y%m%d")
echo "Backing up mysql databases..."
# 检测是否已存在备份文件,如有,进行删除操作
if [ -f "$backup_path/$backupname-$date.sql.bz2" ]; then
rm -fv $backup_path/$backupname-$date.sql*
fi
echo "Dumping databases..."
## 直接指定username, password(不推荐)
# mysqldump --user=$user --password=$password --databases $dbname > $backup_path/$backupname-$date.sql
## 将username, password放在配置文件中[mysqldump]下(推荐)
# mysqldump --databases $dbname > $backup_path/$backupname-$date.sql
## 备份所有数据库
mysqldump --all-databases > $backup_path/$backupname-$date.sql
echo "Compressing databases..."
bzip2 $backup_path/$backupname-$date.sql
chmod 600 $backup_path/$backupname-$date.sql.bz2
# Delete files older than 30 days(移除超过30天的历史备份文件)
echo "Checking for old files..."
find $backup_path/* -mtime +30 -exec rm {} \;
echo "Done."
使用Crontab
定时执行
进入Crontab
编辑模式:
crontab -e
添加定时任务:
# m h dom mon dow command
30 1 * * * . /etc/profile; /data/soft/script/mysql_backup.sh > /data/soft/script/mysql_backup.log 2>&1 &
说明:
- 每天凌晨1:30执行。
- 由于后台
MySQL
是使用源码形式安装的,所有MySQL
的命令不能直接运行,我在环境变量文件/etc/profile
最后添加了export PATH=$PATH:/data/soft/mysql/bin
。 . /etc/profile;
,使环境变量生效。2>&1
:如果执行过程中有异常信息,将stderr
也重定向标准输出流stdout
。
恢复数据
通过mysql
命令
mysql -u username -p new_database < data-dump.sql
通过source
命令:
# 登录数据库
mysql -u root -p
# 切换需要导入数据的数据库
use new_database;
# 通过source快速导入
source {folder_path}/data-dump.sql;