写在前面:
为了保证数据库容灾性,定期对数据库数据进行备份是十分重要的。
备份数据的基本思路是将数据库中的数据导出保存到其他位置,每隔一段时间便进行一次导出,以保证数据的完整。为了让数据能够定期保存,利用Linux的Crontab自动执行Bash脚本以达到自动备份的要求。
第一步:选择位置创建数据保存的文件夹
选择指定位置创建文件夹mysqlbackup文件夹
cd ~
mkdir mysqlbackup
然后创建保存数据和保存日志的文件夹,并对当前用户进行授权。
#进入 mysqlback 文件夹
cd mysqlback
#创建备份数据文件夹
mkdir backup_data
#创建备份日志文件夹
mkdir backup_logs
#对当前用户授予对文件夹的写入权限
sudo chmod u+w backup_data
sudo chmod u+w backup_logs
第二步:编写Bash脚本
vim mysqlbackup.sh
#!/bin/bash
#数据库用户名
dbuser='root'
#数据库用密码
dbpasswd='root'
#需要备份的数据库,多个数据库用空格分隔
dbname='TestData'
#备份时间
backtime="$(date "+%Y%m%d%H%M%S")"
#日志备份路径
logpath='/root/mysqlbackup/backup_logs'
#数据备份路径
datapath='/root/mysqlbackup/backup_data'
#备份数据
mysqldump -u ${dbuser} -p${dbpasswd} ${dbname} > "${datapath}/${dbname}"-"${backtime}.sql" 2>> ${logpath}/mysqllog.log;
#若备份成功则进行进行数据压缩
if [ "$?" == 0 ];then
cd $datapath
#将数据压缩节省存储空间
tar jcf "${dbname}"-"${table}"-"${backtime}.tar.bz2" "${dbname}"-"${backtime}.sql" > /dev/null
#删除原始文件,只留压缩后文件
rm -f "${datapath}/${dbname}"-"${backtime}.sql"
#删除七天前备份,也就是只保存7天内的备份
find $datapath -name "*.tar.bz2" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
echo ${backtime}-"数据库 ${dbname} 备份成功!!" >> ${logpath}/mysqllog.log
else
#否则,备份失败则进行以下操作
echo ${backtime}-"数据库 ${dbname} 备份失败!!" >> ${logpath}/mysqllog.log
fi
脚本编辑完成后,先执行脚本测试是否能够成功运行
./mysqlbackup.sh
若正常执行,则控制台无信息输出,在 backup_data 和 backup_logs 文件夹中可查看到 tar.bz2 和 log 文件
第三步:设置Crontab进行定期执行
# 设置定制指令
crontab -e
# 设置每5分钟执行一次备份脚本
*/5 * * * * /root/mysqlbackup.sh
# 重启cron服务
service cron restart
有时候会出现 service 指令无效的情况,则需要通过指定程序的方式重启
# 停止crontab
/etc/init.d/cron stop
# 启动crontab
/etc/init.d/cron start
打开当前用户的crontab表,编辑格式可参考/etc/crontab中的格式。
下图为来自百度百科的Crontab文件格式说明:
在此给出几例子:
# 每分钟执行一次a.sh
*/1 * * * * bash a.sh
# 每两小时重启一次apache
0 */2 * * * /sbin/service httpd restart
# 每天7:50执行一次a.sh
50 7 * * 8 bash a.sh
附:
1、查看CronTab日志
sudo cat /var/log/cron
2、Chmod
语法:
chmod [-cfvR] [--help] [--version] mode file...
参数说明:
mode : 权限设定字串,格式如下 :
[ugoa...][[+-=][rwxX]...][,...]
其中:
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
- + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
其他参数说明:
- -c : 若该文件权限确实已经更改,才显示其更改动作
- -f : 若该文件权限无法被更改也不要显示错误讯息
- -v : 显示权限变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
- --help : 显示辅助说明
- --version : 显示版本
3、在MySQL中创建备份用户和调整配置
通过查看备份日志可以发现,MySQL提醒直接将帐号的密码写在指令中是不安全的,而且在此还是使用的root帐号,因此最好创建一个只有备份数据权限的帐号,并配置保存帐号和密码进行备份,以此保证数据安全。
# 创建帐号
create user 'backup'@'localhost' identified by 'backup';
# 授权
grant select,show view,lock tables,trigger on testdb.* to 'backup'@'localhost';
修改 /etc/mysql/my.cnf 文件
# 追加
[mysqldump]
user=backup
password=backup
写在最后:
在Centos和Ubuntu系统下都有测试过,这个方式都可以使用,Bash脚本参考https://blog.youkuaiyun.com/lwwl12/article/details/83214651