Linux 自动备份 Mysql 数据库 Shell 脚本

作为一个后端开发人员,备份数据库是一个良好的习惯,虽然说数据库损坏或者数据丢失的概率很低,但是你不得不防,要不然出现问题了,都不知道怎么搞。

下面的这个 Shell 脚本就是能让你通过设定 Crontab 来每天备份 MySQL 数据库的方法。

准备工作

  • 你要备份的服务器要安装 Mysql 数据库,我这里使用的是 mariadb
  • 命名为:databak.sh

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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

赋予权限

  • 脚本是需要执行权限的
1
2
chmod 600 /home/databak.sh
chmod +x /home/databak.sh

说明

  • 上面的脚本是备份 100 天的数据库,我们可以每天导出一份 SQL 备份文件,文件的名称按 db_数据库名_当日日期 生成,然后进行打包压缩,最后再删除 100 天之前的数据库备份;

具体可以在备份目录的 BAK_LOG.txt 文件看备份日志;

具体日志输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-----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 脚本进行定时执行
1
crontab -e
  • 添加一个定时任务,每天凌晨 3 点执行一次脚本,然后开始 Mysql 的备份
1
0 3 * * * /home/databak/databak.sh

记着时常抽查数据库的备份情况,有条件的可以尝试将备份文件还原恢复测试,看下是否有异常问题。