Linux下MySQL定时自动完整备份(mysqldump+cr
2020-04-08 本文已影响0人
jiezzy
#如果数据量比较小,而且服务器内存比较大,不需要压缩
#!/bin/bash
mysql -uUserName -pPassword DatabaseName >需要备份到的目录/bkdatabase/DatabaseName_$(date +%Y%m%d_%H%M%S).sql
------------------------------------------------------
#需要压缩的
#!/bin/bash
mysql -uUserName -pPassword DatabaseName | gzip >需要备份到的目录/bkdatabase/DatabaseName_$(date +%Y%m%d_%H%M%S).sql.gz
crontab -e
#每天凌晨两点执行一次
0 2 * * * /脚本目录/脚本名称.sh
一、前言
1、本文目标
- 实现数据库全量备份
- 实现定时执行备份
- 实现定时清理7天之前的备份
2、环境信息
image二、备份
- 目录准备
mkdir /mysql
mkdir /mysql/backup
mkdir /mysql/backup/scripts
mkdir /mysql/backup/files
mkdir /mysql/backup/logs
- 备份脚本
新建脚本
vi /mysql/backup/scripts/backup_full.sh
脚本内容
#!/bin/bash
#备份目录
BACKUP_ROOT=/mysql/backup
BACKUP_FILEDIR=$BACKUP_ROOT/files
BACKUP_LOGDIR=$BACKUP_ROOT/logs
#当前日期
DATE=$(date +%Y%m%d)
######备份######
#查询所有数据库
#-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema")
#DATABASES=$(mysql -uroot -p123456 -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('sys','mysql','information_schema','performance_schema');" | grep -v "SCHEMA_NAME","ken.io")
echo $DATABASES
#循环数据库进行备份
for db in $DATABASES
do
echo
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
mysqldump -uroot -pRoot@1024 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
echo
done
echo "done"
备份测试&验证
#执行备份脚本
sh /mysql/backup/scripts/backup_full.sh
#查看备份文件
ll /mysql/backup/files -h
#解压指定文件({file}自己替换成备份的文件)
gunzip /mysql/backup/files/{file}
三、定时任务
- 安装crontab
yum install -y crontab
1、定时执行MySQL完整备份
- 创建定时备份任务
#添加定时任务
crontab -e
#每天凌晨3点执行
00 3 * * * sh /mysql/backup/scripts/backup_full.sh
#查看定时任务
crontab -l
2、定时清理7天以前的备份
- 创建文件清理脚本
#创建脚本文件
vi /mysql/backup/scripts/backup_full_clean.sh
#写入以下内容
#!/bin/bash
find /mysql/backup/files -mtime +7 -name "*.gz" -exec rm -rf {} \;
创建定时清理任务
#添加定时任务
crontab -e
#每天凌晨1点执行
00 1 * * * sh /mysql/backup/scripts/backup_full_clean.sh
#每两天执行一次
0 3 */2 * * sh /opt/data/sql/auto_backup.sh
#查看定时任务
crontab -l
四、备注
1、crontab命令示例
image用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
1、minute: 表示分钟,可以是从0到59之间的任何整数;
2、hour:表示小时,可以是从0到23之间的任何整数;
3、day:表示日期,可以是从1到31之间的任何整数;
4、month:表示月份,可以是从1到12之间的任何整数;
5、week:表示星期几,可以是从0到6之间的任何整数,这里的0代表星期日;
6、command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
前五个时间设定段,可以含如下特殊字符:
1、星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作;
2、逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”;
3、中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”;
4、正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
2、本文参考
- https://blog.csdn.net/zmcyu/article/details/75353245
- http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
mkdir -p /data/mysqlbal/data
mkdir -p /data/mysqlbal/scripts
mkdir -p /data/mysqlbal/logs
cd /data/mysqlbak/scripts
vi backup.sh
#!/bin/bash
#备份目录
BACKUP_ROOT=/data/mysqlbak
BACKUP_FILEDIR=$BACKUP_ROOT/data
#当前日期
DATE=$(date +%Y%m%d)
######备份######
#查询所有数据库
#-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema|performance_schema|mysql")
#循环数据库进行备份
for db in $DATABASES
do
echo
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
echo
done
echo "done"
#设置脚本的执行权限
chmod 777 backup.sh
### 将备份操作加入到定时任务(每天凌晨2点定时执行)
crontab -e
00 2 * * * /data/mysqlbak/scripts/backup.sh > data/mysqlbak/logs/backup.log 2>&1
### 创建删除脚本(定时删除7天前的备份数据)
vi backup_clean.sh
#!/bin/bash
echo ----------CLEAN BEGIN----------
find /data/mysqlbak/data -mtime +7 -name "*.gz" -exec rm -rf {} \;
echo ----------CLEAN COMPLETE----------
#设置脚本的执行权限
chmod 777 backup_clean.sh
#将删除操作加入到定时任务(每天凌晨1点定时执行)
00 1 * * * /data/mysqlbak/scripts/backup_clean.sh > /data/mysqlbak/logs/backup_full_clean.log 2>&1
#查看定时任务
crontab -l
#如果需要备份到另外一台机器,可以备份完scp到另外一台机器
首先服务器需要安装export,yum安装:
yum install expect
#!/bin/bash
#备份目录
BACKUP_ROOT=/data/mysqlbak
BACKUP_FILEDIR=$BACKUP_ROOT/data
#当前日期
DATE=$(date +%Y%m%d)
######备份######
#查询所有数据库
#-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema|performance_schema|mysql")
#循环数据库进行备份
for db in $DATABASES
do
echo
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
echo ----------scp 226 begin----------
expect -c "
spawn scp -r /data/mysqlbak/data/${db}_$DATE.sql.gz root@xxx.xxx.xxx.226:/data/mysqlbak/data225/
expect {
\"*assword\" {set timeout 300; send \"此处是scp的密码\r\"; exp_continue;}
\"yes/no\" {send \"yes\r\";}
}
expect eof"
echo ----------scp 226 end----------
echo
done
echo "done"