[Mysql] mysql定时备份及邮件告知备份情况


本文总阅读量

1、mysql全量备份脚本,内容如下:

cat /data/soft/mysql_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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/bin/bash
#数据库用户名
dbuser=test
#数据库密码
dbpass=test
#备份脚本运行获取到的时间戳
stamp=`date +"%Y-%m-%d"`
#项目名称
programname=mw
#备份文件名称前缀
fullbackupname=${programname}-dbfullbak
#备份文件目录
backuppath=/data/backup
#备份文件绝对路径名称
backname=$backuppath/${fullbackupname}-${stamp}.dump
#需要删除的备份文件绝对路径名称
oldstamp=`date +"%Y-%m-%d" -d "-5 day"`
oldbackname=$backuppath/${fullbackupname}-${oldstamp}.dump
#数据库安装路径
dbpath=/data/mysql/bin
#备份操作log目录
backuplogname=/tmp/backup_${stamp}.log
#当前服务器主机名
localname=`hostname`
#当前服务器ip地址
localip=`ip a |grep global| head -1| awk '{print $2}'|awk -F'/' '{print $1}'`
#localip='65.52.165.104'
#目标邮箱
dest_mail='test@qq.com'


#判断指定log文件是否存在,如果存在将其删除
if [ -e ${backuplogname} ];then
sudo rm -rf ${backuplogname}
else
:
fi

#备份执行失败发送错误邮件
send_fail_mail(){
echo "${programname}备份失败,登录服务器${localname}-${localip}的日志${backuplogname}下查看报错!!!" |mail -s ${programname}数据库备份情况 ${dest_mail}
}

#备份执行成功发送成功邮件
send_success_mail(){
echo "${programname}备份成功,可登录服务器${localname}-${localip}的日志${backuplogname}下查看备份信息。" |mail -s ${programname}数据库备份情况 ${dest_mail}
}

#创建备份时间函数
date_func(){
dateresult=$((${afterstamp}-${beforstamp}))
hour=$((${dateresult}/3600))
min=$(((${dateresult}-${hour}*3600)/60))
sec=$((${dateresult}-${hour}*3600-${min}*60))
echo "5、本次备份运行时间为:"${hour}${min}${sec}秒 >> ${backuplogname}
}


#创建一个删除五天前的备份数据的函数
del_old_bakdata(){
if [ -e ${oldbackname} ];then
sudo echo "6、五天前的备份数据${oldbackname}存在,进行删除" >> ${backuplogname}
rm -rf ${oldbackname}
if [ $? == 0 ];then
sudo echo "6.1、备份数据删除成功" >> ${backuplogname}
else
sudo echo "6.1、备份数据删除失败,注意查看失败原因" >> ${backuplogname}
fi
else
sudo echo "6、五天前的备份数据${oldbackname}不存在,不需要再删除。" >> ${backuplogname}
fi
}

#备份之前判断备份目录是否存在
if [ -d ${backuppath} ];then
sudo echo "1、备份目录存在,可执行备份操作" >> ${backuplogname}
else
sudo echo "1、备份目录不存在,手动创建" >> ${backuplogname}
sudo mkdir -p ${backuppath}
if [ $? == 0 ];then
sudo echo "1.1、备份目录创建成功,可进行下面操作" >> ${backuplogname}
else
sudo echo "1.1、备份目录不存在,且创建失败,无法进行下面操作,退出备份" >> ${backuplogname}
exit
fi
fi

#备份之前判断备份文件是否已经存在
if [ -e ${backname} ];then
sudo echo "2、指定的备份文件${backname}已存在,对其进行重命名" >> ${backuplogname}
mv ${backname} ${backuppath}/bak-${fullbackupname}-${stamp}.dump
if [ $? == 0 ];then
sudo echo "2.1、文件已重新命名为${backuppath}/bak-${fullbackupname}-${stamp}.dump,可继续备份" >> ${backuplogname}
else
sudo echo "2.1、文件重命名失败,退出备份操作" >> ${backuplogname}
exit
fi
else
sudo echo "2、指定的备份文件不存在,开始进行备份" >> ${backuplogname}
fi

#备份之前时间戳
beforstamp=`date +%s`
#开始全量备份数据库
sudo echo "3、开始全量备份数据库" >> ${backuplogname}
${dbpath}/mysqldump -u${dbuser} -p${dbpass} --all-databases --single-transaction --master-data=2 --quick --set-gtid-purged=OFF > ${backname}
backupresult=$?
afterstamp=`date +%s`
if [ ${backupresult} == 0 ];then
sudo echo "4、${programname}数据库备份成功,文件名称为${backname},准备删除五天前的备份数据" >> ${backuplogname}
date_func
del_old_bakdata
send_success_mail
else
sudo echo "4、${programname}数据库备份失败,注意查看备份失败原因并重新备份" >> ${backuplogname}
send_fail_mail
exit
fi

使用该脚本需要修改自己数据库对应的用户名dbuser,密码dbpass,邮箱dest_mail,项目名称programname,mysql数据库安装路径dbpath。其他参数可使用脚本内默认的,也可自行修改
其中–single-transaction:该参数在备份前将隔离模式设为repeatable read并启动start transaction语句。该参数只对innodb事物表有作用,当启动start transaction时开始备份数据库一致性状态,并不阻塞其他的应用。对于myisam和memory数据引擎使用这个参数备份的时候状态是实时改变的。另外该参数与–lock-tables参数是相互排斥的,lock-tables会是隐式吧提交的事物产生等待。
–master-data=2:使用该参数指备份执行时binglog开始的坐标,在输出结果中属于change master to语句,如下所示:

1
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-binlog.000036', MASTER_LOG_POS=79549;

如果使用该参数不指定值,默认值为1,语句不会以注释的形式写入,当dump文件被加载时该行参数会影响加载过程:

1
CHANGE MASTER TO MASTER_LOG_FILE='mysql-binlog.000036', MASTER_LOG_POS=79549;

如果指定参数为2,会以注释的形式写入输出文件,dump文件被加载也不会受该行语句影响。

–quick:对于备份大表比较有用,该参数强制mysqldump命令一次性从数据库中获取表的行,而不是先获取行集合,在写出之前把他们缓存到内存。

2、配置邮件发送功能

2.1、安装mailx软件

1
yum install -y mailx

2.2、修改配置文件/etc/mail.rc,在行尾添加一下信息:

1
2
set from=test@qq.com smtp=smtp.qq.com
set smtp-auth-user=test@qq.com smtp-auth-password=testpassword smtp-auth=login

参数详解:

1
2
3
4
from:指定发送邮件的发件人
smtp:指定smtp服务器信息
smtp-auth-user:允许第三方登录的用户名
smtp-auth-password:允许第三方登录的密码

2.3、发送测试邮件:

1
echo 'test email' |mail -s 'title' test@qq.com

title:指定发送文件的标题,可自行定义

3、修改备份脚本权限

1
chmod +x /data/soft/mysql_backup.sh

4、将脚本添加到定时任务

如:每天凌晨一点备份

1
shell > crontab -e
1
0 1 * * * sh /data/soft/mysql_backup.sh
目录
  1. 1. 1、mysql全量备份脚本,内容如下:
  2. 2. 2、配置邮件发送功能
  3. 3. 3、修改备份脚本权限
  4. 4. 4、将脚本添加到定时任务

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog