MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL(create alter drop)和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
DDL
DML
主要的命令是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
mysqlbinlog常见的选项有以下几个:
binlog日志包括两类文件
1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
2)二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。
将anquan数据库备份到/tmp/anquan_$(date +‘%Y-%m-%d’ ).sql.gz文件中:
mysqldump -uroot -proot -B -F -x --master-data=2 anquan | gzip > /tmp/anquan_$(date +'%Y-%m-%d' ).sql.gz
参数说明:.sq
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
–master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
进入tmp目录下查看备份的数据
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k2jdfmsJ-1658030995642)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716131953859.png)]](https://1000bd.com/contentImg/2022/07/28/142427326.png)
进入 /var/lib/mysql目录下查看,每备份一次就会产生一个mysql-bin文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3es1iztU-1658030995642)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716132729537.png)]](https://1000bd.com/contentImg/2022/07/28/142427845.png)
进入数据库通过show master status命令查看已覆盖最新的bin文件

以图中数据库数据表为例
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BpIxq7gi-1658036630068)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716132915274.png)]](https://1000bd.com/contentImg/2022/07/28/142429087.png)
先对member表中插入一个元素
insert into member values(4,'litaibai',18,'jinyesi');
再将id2的name修改为sudongpo
update member set name='sudongpo' where id=2;
修改结果如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbYTJRae-1658036630068)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716133404866.png)]](https://1000bd.com/contentImg/2022/07/28/142429644.png)
假设将数据库删除了

先进 /var/lib/mysql/将最新一次的备份文件复制一份,在执行一次刷新日志索引操作,重新开始新的binlog日志记录文件,这个文件不会再有后续写入了,因为便于我们分析原因及查找ops节点,以后所有数据库操作都会写入到下一个日志文件。
[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# cp -v mysql-bin.000009 /tmp/
'mysql-bin.000009' -> '/tmp/mysql-bin.000009'
[root@vm-002 mysql]# ls -al /tmp
mysql-bin.000009
在进入mysql中刷新一次数据
mysql > flush logs;
进入tmp目录下
cd /tmp
解压备份文件
gzip -d anquan_2022-07-16.sql.gz
导入备份文件
mysql -uroot -proot < anquan_2022-07-16.sql.gz
读取数据有两种方法
[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000009
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Arf2P7cs-1658036663411)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716140312068.png)]](https://1000bd.com/contentImg/2022/07/28/142430446.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MobT3WVU-1658036663411)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716141648824.png)]](https://1000bd.com/contentImg/2022/07/28/142430984.png)
发现只恢复到之前未更新数据的状态的,所以更详细的恢复数据推荐第二种方法。
mysql> show binlog events in 'mysql-bin.000003';
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYkcxkKN-1658036663411)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716142147455.png)]](https://1000bd.com/contentImg/2022/07/28/142431645.png)
通过分析,造成数据库破坏的pos点区间是介于 896–943 之间(这是按照日志区间的pos节点算的),只要恢复到896前就可。
从binlog日志恢复数据
恢复命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
--------------------------------------------------------
常用参数选项解释:
–start-position=875 起始pos点
–stop-position=954 结束pos点
–start-datetime=“2016-9-25 22:01:08” 起始时间点
–stop-datetime=“2019-9-25 22:09:46” 结束时间点
–database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)
--------------------------------------------------------
不常用选项:
-u --user=name 连接到远程主机的用户名
-p --password[=name] 连接到远程主机的密码
-h --host=name 从远程主机上获取binlog日志
–read-from-remote-server 从某个MySQL服务器上读取binlog日志
--------------------------------------------------------
小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;
[root@vm-002 backup]# cp /var/lib/mysql/mysql-bin.000009 /tmp
[root@vm-002 backup]# mysqlbinlog mysql-bin.000009 > 000009.sql
[root@vm-002 backup]# vim 000009.sql #删除里面的drop语句
[root@vm-002 backup]# mysql -uroot -p -v < 000009.sql
温馨提示:
在恢复全备数据之前必须将该binlog文件移出,否则恢复过程中,会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱!
可参考:https://www.cnblogs.com/kevingrace/p/5904800.html
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ReF2GVqs-1658036663412)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716142724055.png)]](https://1000bd.com/contentImg/2022/07/28/142432341.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rvJ351Q-1658036663412)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716142837187.png)]](https://1000bd.com/contentImg/2022/07/28/142432853.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKAtptS4-1658036663413)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716142937516.png)]](https://1000bd.com/contentImg/2022/07/28/142433316.png)
发现数据找回
–stop-position=471 pos结束节点(按照事务区间算,是471)
注意:
此pos结束节点介于“member表原始数据”与更新“name=‘李四’”之前的数据,这样就可以恢复到更改插入litaibai之前的数据了。
操作如下:
[root@vm-002 ~]# mysqlbinlog --start-position=427 --stop-position=548 --database=anquan /var/lib/mysql/mysql-bin.000009 | mysql -uroot -proot -v
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nCqcdOOY-1658036663413)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716144406599.png)]](https://1000bd.com/contentImg/2022/07/28/142433752.png)
mysqlbinlog --start-position=621 --stop-position=734 --database=anquan /var/lib/mysql/mysql-bin.000009 | mysql -uroot -proot -v
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hT5iBSJf-1658036663413)(C:\Users\17874\AppData\Roaming\Typora\typora-user-images\image-20220716145217549.png)]](https://1000bd.com/contentImg/2022/07/28/142434239.png)