mkdir /root/mysql.backup
mkdir /root/mysql.backup/data
cd /root/mysql.backup
vim mysqlBackuoShell.sh
#!/bin/bash #保存备份个数,31条
number=31
#备份保存路径
backup_dir=/root/mysql.backup/data
#日期
dd=`date +%Y-%m-%d_%H_%M_%S`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=Abc123456.
#将要备份的数据库
database_name=test#运行内容,结果用gzip压缩下
$tool -u $username -p$password --single-transaction --master-data=2 --flush-logs -B $database_name|gzip > $backup_dir/$database_name-$dd.sql.gz#写创建备份日志
echo "create $backup_dir/$database_name-$dd.sql.gz" >> $backup_dir/log.txt #找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.sql.gz | awk '{print $9 }' | head -1` #判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.sql.gz | awk '{print $9 }' | wc -l` if [ $count -gt $number ]
then rm $delfile //删除最早生成的备份,只保留number数量的备份 #写删除文件日志 echo "delete $delfile" >> $backup_dir/log.txt
fi
chmod +x mysqlBackuoShell.sh
vim mysqlRollBack.cron
内容如下
# 每天凌晨三点进行一次全量备份
0 3 * * * /data/mysqlbackup/mysqlBackuoShell.sh
crontab mysqlRollBack.cron
crontab -l
如果不想执行定时任务,直接删除就行了
crontab -r
如果想要修改执行时间,可以编辑
crontab -e
show variables like '%log_bin%';
vim /etc/my.cnf
#节点Id,注意集群中不能重复,单节点不配置也可以
server-id=123
#开启binlog日志,指定其存放位置
log-bin=/var/lib/mysql/mysql-bin
#开启binlog自动过期
expire_logs_days=10
service mysqld restart
show variables like '%log_bin%';
show master logs;
./mysqlBackuoShell.sh
这时查看多出了一条mysql-bin.000019,说明刚才全量备份后,重新建立了二进制文件,备份后的数据修改操作日志只会存入最新的这条二进制文件中
show master logs;
向user表中新增一条数据(name=王五),此时新增这条数据的操作日志会存入最新的那条二进制文件中(mysql-bin.000019)
此时删库的操作也将存入最新的二进制文件中(mysql-bin.000019)
此时MySQL服务中已经没有test这个数据库
1.首先刷新二进制日志,此时会新建一条新的二进制文件(mysql-bin.000020),之后所有操作都将存入这条最新的二进制文件中,接下来我们只需要分析mysql-bin.000019这个二进制文件删库的位置
flush logs;
2.分析二进制文件 mysql-bin.000019,查看删库的日志位置
show binlog events in 'mysql-bin.000019';
发现删库操作在621这个位置,所以我们只需要把数据恢复621之前的位置(485)就可以了
3. 先进行全量恢复
进入存放备份文件的目录
cd /root/mysql.backup/data/
解压备份文件
gzip -d 备份文件
执行恢复命令
mysql -uroot -p -v
此时上一次全量备份的数据已经恢复完成,最新增加的那条(name=王五)还没恢复
4 增量恢复,恢复上一次全量恢复后到删库之前的数据
进入二进制文件存放位置,执行增量恢复操作
mysqlbinlog 常用参数选项解释:
--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="2016-9-25 22:01:08" 起始时间点
--stop-datetime="2019-9-25 22:09:46" 结束时间点
--skip-gtids是忽略GTIDs报错
-d 指定数据库
mysqlbinlog --stop-position=485 -d test mysql-bin.000019 | mysql -uroot -pAbc123456.
此时最新的那条数据(name=王五)已经恢复过来了