Mysql使用binlog操作恢复数据解决失误操作

本文是基于centos7环境下进行操作的,如有必要请先阅读此篇文章安装mysql8.0

 https://blog.csdn.net/qq_39038465/article/details/81663540

一 、binlog简介

binlog,binlog:binlog是一个二进制格式的文件,它记录了数据库上的所有改变,并以二进制的形式保存在磁盘中;它可以用来查看数据库的变更历史、数据库增量备份和恢复、Mysql的复制(主从数据库的复制)。

二、binlog的格式

1 Statement 
每一条会修改数据的sql都会记录在binlog中。

优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。

缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题。

ps:相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题

2 Row

5.1.5版本的MySQL才开始支持row level的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。

优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题.

缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。

ps:新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更

3 Mixed

从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。

在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

三、查看和配置binlog格式

1 、查看binlog格式,使用命令

mysql>show variables like 'binlog_format'

 

如果binlog格式不是row,需要修改。

2 、修改binlog格式,配置mysql

使用命令

vi  /etc/my.cnf

 打开配置文件,并在[mysqld]下面增加以下内容

log-bin = mysql-bin

binlog_format="ROW"

 重启数据库,会新生成一个文件/var/lib/mysql/mysql-bin.000001,如果以前把mysql-bin.000001删除了,则会在当前的index基础上增加文件,比如我的就是mysql-bin.000030。此时mysql-bin.000031开始创建。

使用命令重启数据库 service mysqld restart

使用命令 ls /var/lib/mysql  查看binlog文件

 四、创建数据库并备份

1、创建数据库

2、创建完毕,刷新binlog文件,此时mysql-bin.000031结束,进入mysql-bin.000032日志文件。

 

3、备份数据库

使用命令 mysqldump -u root -p demo user > db_demo_bak.sql

或者 mysqldump -u root -p --databases demo > db_demo_bak.sql

 

 五、使用备份恢复数据库并使用binlog完成回滚操作

1、进入数据库并插入数据库

2、查看数据

 

3、update修改数据库,模拟失误操作

 

user表的name字段被误操作修改,抓紧刷新掉binlog文件,mysql-bin.000032结束,后续操作进入mysql-bin.000033

 4、查看一下mysql的binlog文件

 5、删除表格,利用备份恢复数据库

 

此时数据库表就备份好了,但是没有数据。

刚刚的增删改被记录在mysql-bin.000032日志文件中, 查看mysql-bin.000032记录的操作,查看各操作的Pos和End_log_pos

124-441是第一次insert操作,441-727是第二次insert操作,727-1056是update操作。

使用mysqlbinlog工具恢复insert操作 120 - 520 

使用命令

[root@localhost ~]# mysqlbinlog --start-position=120 --stop-position=520 --database=demo /var/lib/mysql/mysql-bin.000032 | /usr/bin/mysql -u root -p mima666 -v demo

由于我的mysql没有设置密码,所以我这里直接采用 -p +空格 -v 数据库名 的形式替代,演示如下: 

 然后我们来检查一下user表,

这样就完成了数据回滚操作了。 

猜你喜欢

转载自blog.csdn.net/qq_39038465/article/details/82015277