CentOS下自动备份MySQL数据库

系统环境:CentOS 7

我们使用mysqldump备份数据库,使用mysqldump命令导出数据库格式如下:

1
mysqldump -u username -p 数据库名称 > 导出文件名.sql

还原:

1
mysql -u username -p 数据库名称 < 导出文件名.sql

1.创建备份脚本

1
vi /test/database_backups/db_auto_backup.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
# 配置mysql信息
mysql_user="USER" # mysql用户
mysql_password="PASSWORD" # mysql用户密码
mysql_host="localhost"
mysql_port="3306"
backup_db_arr=("db1" "db2") # 要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")
backup_location=/test/database_backups # 备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹
backup_time=`date +%Y%m%d%H%M` # 定义备份详细时间
backup_Ymd=`date +%Y-%m-%d` # 定义备份目录中的年月日时间
backup_dir=$backup_location/$backup_Ymd # 备份文件夹全路径
for dbName in ${backup_db_arr[@]}
do
echo "database ${dbName} backup start..."
`mkdir -p $backup_dir`
`mysqldump -h$mysql_host -P${mysql_port} -u${mysql_user} -p${mysql_password} $dbName | gzip > ${backup_dir}/$dbName-$backup_time.sql.gz`
flag=`echo $?`
if [ $flag == "0" ]; then
echo "database $dbName backup successful."
else
echo "database $dbName backup fail."
fi
done

修改shell脚本属性,赋予权限:

1
2
chmod 600 db_auto_backup.sh
chmod +x db_auto_backup.sh

运行测试是否成功:

1
./db_auto_backup.sh

若输入database db1 backup successful.则说明配置正确。

2.定时执行

我们使用crontab定时执行脚本,crontab命令用于设置周期性被执行的指令。

设置crontab定时执行:

1
2
3
4
vi /etc/crontab
# 在最后一行加入(脚本路径根据个人配置而修改):
00 5 * * * root /test/database_backups/db_auto_backup.sh
# 每日凌晨5点00分执行

crontab格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
minute hour day month week command
# For details see man 4 crontabs
# Example of job definition:
.---------------------------------- minute (0 - 59) 表示分钟
| .------------------------------- hour (0 - 23) 表示小时
| | .---------------------------- day of month (1 - 31) 表示日期
| | | .------------------------- month (1 - 12) OR jan,feb,mar,apr ... 表示月份
| | | | .---------------------- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 表示星期(0 或 7 表示星期天)
| | | | | .------------------- username 以哪个用户来执行
| | | | | | .------ command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件
| | | | | | |
* * * * * user-name command to be executed

  • minute 表示分钟,可以是从0到59之间的任何整数
  • hour 表示小时,可以是从0到23之间的任何整数
  • day 表示日期,可以是从1到31之间的任何整数
  • month 表示月份,可以是从1到12之间的任何整数
  • week 表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日
  • command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件

在以上字段中,还可用特殊字符:

  • *“ 星号代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作
  • ,“ 可以使用逗号隔开的值指定一个列表范围,例如”1,2,3,5,7”
  • -“ 可以用整数之间的中扛表示一个整数范围,例如”1-3”表示”1,2,3”
  • /“ 可以用正斜线指定时间的间隔频率,例如”0-23/2”表示每两小时执行一次;同时也可以和星号(*)一起使用,例如”*/10”,如果用在minute字段,则表示每10分钟执行一次

重启crontab

1
2
3
service crond restart
# 或
service cron restart

crontab定时执行的日志保存在/var/spool/mail/root中,可查看日志:

1
vi /var/spool/mail/root

日志详细如下:

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
From root@xxx.localdomain Thu Mar 28 17:15:01 2019
Return-Path: <root@xxx.localdomain>
X-Original-To: root
Delivered-To: root@xxx.localdomain
Received: by xxx.localdomain (Postfix, from userid 0)
id 55ECBE523B; Thu, 28 Mar 2019 17:15:01 +0800 (CST)
From: "(Cron Daemon)" <root@xxx.localdomain>
To: root@xxx.localdomain
Subject: Cron <root@xxx> /test/database_backups/db_auto_backup.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=4888>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/bash>
X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin>
X-Cron-Env: <MAILTO=root>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20190328091501.55ECBE523B@xxx.localdomain>
Date: Thu, 28 Mar 2019 17:15:01 +0800 (CST)
database db1 backup start...
database db1 backup successful.
database db2 backup start...
database db2 backup successful.

参考:

https://www.jianshu.com/p/746db5ceec02