作为一个后端开发人员,备份数据库是一个良好的习惯,虽然说数据库损坏或者数据丢失的概率很低,但是你不得不防,要不然出现问题了,都不知道怎么搞。
下面的这个 Shell
脚本就是能让你通过设定 Crontab
来每天备份 MySQL 数据库的方法。
准备工作
- 你要备份的服务器要安装
Mysql
数据库,我这里使用的是mariadb
- 命名为:
databak.sh
脚本
#!/bin/bash
# sql 备份脚本
# 保留最近100天备份
# 要删除的一百天前的日期
DEL_TEN_DAY=`date -d -100day +%F`
# Others vars
BIN_DIR="/usr/local/mariadb/bin" # 数据库安装 /bin 路径
BACK_DIR="/home/databak" # 要备份的目录
DATE_TODAY=`date +%F` # 备份时间
# 用户名
DB_USER="root"
DB_PASS="123456"
# ip
DB_HOST="127.0.0.1"
# 要备份的数据库数组,可以多个,用空格分开,例如 (db1 db2)
DB_NAME=(zpcloud)
# 如果文件夹不存在则创建
if [ ! -d $BACK_DIR ];
then
mkdir -p $BACK_DIR;
fi
cd /home/databak
echo "-----$DATE_TODAY-----" >> $BACK_DIR/BAK_LOG.txt
for DATA_BASE in ${DB_NAME[@]}
do
echo "开始备份 $DATA_BASE" >> $BACK_DIR/BAK_LOG.txt
$BIN_DIR/mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS --default-character-set=utf8 -R --opt $DATA_BASE | gzip > db_${DATA_BASE}_${DATE_TODAY}.sql.gz
# 写创建备份日志
echo "成功备份 db_${DATA_BASE}_${DATE_TODAY} 到 $BACK_DIR" >> $BACK_DIR/BAK_LOG.txt
if [ ! -f "$BACK_DIR/db_${DATA_BASE}_${DEL_TEN_DAY}.sql.gz" ]; then
echo "100天前($DEL_TEN_DAY)备份不存在,无需删除" >> $BACK_DIR/BAK_LOG.txt
else
rm -f $BACK_DIR/db_${DATA_BASE}_${DEL_TEN_DAY}.sql.gz
echo "删除100天前备份文件 $BACK_DIR/db_${DATA_BASE}_${DEL_TEN_DAY}.sql.gz" >> $BACK_DIR/BAK_LOG.txt
fi
done
赋予权限
- 脚本是需要执行权限的
chmod 600 /home/databak.sh
chmod +x /home/databak.sh
说明
- 上面的脚本是备份 100 天的数据库,我们可以每天导出一份 SQL 备份文件,文件的名称按
db_数据库名_当日日期
生成,然后进行打包压缩,最后再删除 100 天之前的数据库备份;
具体可以在备份目录的 BAK_LOG.txt
文件看备份日志;
具体日志输出
-----2019-03-20-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-20 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-10.sql.gz
-----2019-03-21-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-21 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-11.sql.gz
-----2019-03-22-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-22 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-12.sql.gz
-----2019-03-23-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-23 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-13.sql.gz
-----2019-03-24-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-24 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-14.sql.gz
-----2019-03-25-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-25 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-15.sql.gz
-----2019-03-26-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-26 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-16.sql.gz
-----2019-03-27-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-27 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-17.sql.gz
定时任务
- 在 Linux 中,我们利用
Crontab
来针对databak.sh
脚本进行定时执行
crontab -e
- 添加一个定时任务,每天凌晨
3
点执行一次脚本,然后开始Mysql
的备份
0 3 * * * /home/databak/databak.sh
记着时常抽查数据库的备份情况,有条件的可以尝试将备份文件还原恢复测试,看下是否有异常问题。