位置: 编程技术 - 正文

解说mysql之binlog日志以及利用binlog日志恢复数据的方法(mysqlbinlog -vvv)

发布时间:2024-02-26

推荐整理分享解说mysql之binlog日志以及利用binlog日志恢复数据的方法(mysqlbinlog -vvv),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql binlog详解,mysql binlog在哪,mysqlbinlog -vv,mysqlbinlog -vv,mysqlbinlog -vv,mysql binlog,mysql binlog详解,mysql binlog,内容如对您有帮助,希望把文章链接给更多的朋友!

众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷!

废话不多说,下面是梳理的binlog日志操作解说:

一、初步了解binlog

MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。----------------------------------------------------------------------------------------------------------------------------------------------DDL----Data Definition Language 数据库定义语言 主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

DML----Data Manipulation Language 数据操纵语言主要的命令是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言----------------------------------------------------------------------------------------------------------------------------------------------

mysqlbinlog常见的选项有以下几个:

--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间

--stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样

--start-position:从二进制日志中读取指定position 事件位置作为开始。

--stop-position:从二进制日志中读取指定position 事件位置作为事件截至

*********************************************************************

一般来说开启binlog日志大概会有1%的性能损耗。

binlog日志有两个最重要的使用场景:

1)MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的。

2)自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。binlog日志包括两类文件:

1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件

2)二进制日志文件(文件名后缀为.*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。

二、开启binlog日志:

1)编辑打开mysql配置文件/etc/mys.cnf

[root@vm- ~]# vim /etc/my.cnf在[mysqld] 区块添加 log-bin=mysql-bin 确认是打开状态(mysql-bin 是日志的基本名或前缀名);

2)重启mysqld服务使配置生效

[root@vm- ~]# /etc/init.d/mysqld stop[root@vm- ~]# /etc/init.d/mysqld restartStopping mysqld: [ OK ]Starting mysqld: [ OK ]

3)查看binlog日志是否开启

mysql> show variables like 'log_%'; +---------------------------------+---------------------+| Variable_name | Value |+---------------------------------+---------------------+| log_bin | ON || log_bin_trust_function_creators | OFF || log_bin_trust_routine_creators | OFF || log_error | /var/log/mysqld.log || log_output | FILE || log_queries_not_using_indexes | OFF || log_slave_updates | OFF || log_slow_queries | OFF || log_warnings | 1 |+---------------------------------+---------------------+9 rows in set (0. sec)

三、常用的binlog日志操作命令

1)查看所有binlog日志列表

mysql> show master logs;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin. | || mysql-bin. | |+------------------+-----------+2 rows in set (0. sec)

2)查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值

mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin. | | | |+------------------+----------+--------------+------------------+1 row in set (0. sec)

3)flush刷新log日志,自此刻开始产生一个新编号的binlog日志文件

mysql> flush logs; Query OK, 0 rows affected (0. sec)

mysql> show master logs; +------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin. | || mysql-bin. | || mysql-bin. | |+------------------+-----------+3 rows in set (0. sec)

注意:

每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4)重置(清空)所有binlog日志

mysql> reset master;Query OK, 0 rows affected (0. sec)

mysql> show master logs; +------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin. | |+------------------+-----------+1 row in set (0. sec)

四、查看binlog日志内容,常用有两种方式:

1)使用mysqlbinlog自带查看命令法:

注意:

-->binlog是二进制文件,普通文件查看器cat、more、vim等都无法打开,必须使用自带的mysqlbinlog命令查看

-->binlog日志与数据库文件在同目录中

-->在MySQL5.5以下版本使用mysqlbinlog命令时如果报错,就加上 “--no-defaults”选项

查看mysql的数据存放目录,从下面结果可知是/var/lib//mysql

[root@vm- ~]# ps -ef|grep mysqlroot 1 0 : pts/0 :: /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysqlmysql 0 : pts/0 :: /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sockroot 0 : pts/0 :: mysql -px xxxxroot 0 : pts/1 :: grep --color mysql

[root@vm- ~]# cd /var/lib/mysql/[root@vm- mysql]# lsibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin. mysql-bin. mysql-bin.index mysql.sock ops test

使用mysqlbinlog命令查看binlog日志内容,下面截取其中的一个片段分析:[root@vm- mysql]# mysqlbinlog mysql-bin...............# at # :: server id 1 end_log_pos Query thread_id=3 exec_time=0 error_code=0SET TIMESTAMP=/*!*/;insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',,'cls1'),('guohuihui','w',,'cls2') #执行的sql语句/*!*/;# at # :: server id 1 end_log_pos Xid = #执行的时间.............

解释:

server id 1 : 数据库主机的服务号;end_log_pos : sql结束时的pos节点thread_id=: 线程号

2)上面这种办法读取出binlog日志的全文内容比较多,不容易分辨查看到pos点信息

下面介绍一种更为方便的查询命令:

命令格式:

mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

参数解释:

IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)LIMIT [offset,] :偏移量(不指定就是0)row_count :查询总条数(不指定就是所有行)

mysql> show master logs;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin. | || mysql-bin. | |+------------------+-----------+2 rows in set (0. sec)

mysql> show binlog events in 'mysql-bin.'G;*************************** 1. row ***************************Log_name: mysql-bin.Pos: 4Event_type: Format_descServer_id: 1End_log_pos: Info: Server ver: 5.1.-log, Binlog ver: 4*************************** 2. row ***************************Log_name: mysql-bin.Pos: Event_type: QueryServer_id: 1End_log_pos: Info: use `ops`; drop table customers*************************** 3. row ***************************Log_name: mysql-bin.Pos: Event_type: QueryServer_id: 1End_log_pos: Info: use `ops`; CREATE TABLE IF NOT EXISTS `member` (`id` int() unsigned NOT NULL AUTO_INCREMENT,`name` varchar() NOT NULL,`sex` enum('m','w') NOT NULL DEFAULT 'm',`age` tinyint(3) unsigned NOT NULL,`classid` char(6) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8*************************** 4. row ***************************Log_name: mysql-bin.Pos: Event_type: QueryServer_id: 1End_log_pos: Info: BEGIN*************************** 5. row ***************************Log_name: mysql-bin.Pos: Event_type: IntvarServer_id: 1End_log_pos: Info: INSERT_ID=1*************************** 6. row ***************************Log_name: mysql-bin.Pos: Event_type: QueryServer_id: 1End_log_pos: Info: use `ops`; insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',,'cls1'),('guohuihui','w',,'cls2')*************************** 7. row ***************************Log_name: mysql-bin.Pos: Event_type: XidServer_id: 1End_log_pos: Info: COMMIT /* xid= */7 rows in set (0. sec)

ERROR: No query specified

mysql>

上面这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数!如下操作示例:

a)查询第一个(最早)的binlog日志:

mysql> show binlog eventsG;

b)指定查询 mysql-bin.这个文件:

mysql> show binlog events in 'mysql-bin.'G;

c)指定查询 mysql-bin.这个文件,从pos点:开始查起:

mysql> show binlog events in 'mysql-bin.' from G;

d)指定查询 mysql-bin.这个文件,从pos点:开始查起,查询条(即条语句)

mysql> show binlog events in 'mysql-bin.' from limit G;

e)指定查询 mysql-bin.这个文件,从pos点:开始查起,偏移2行(即中间跳过2个),查询条

mysql> show binlog events in 'mysql-bin.' from limit 2,G;

五、利用binlog日志恢复mysql数据

以下对ops库的member表进行操作

mysql> use ops;mysql> CREATE TABLE IF NOT EXISTS `member` (-> `id` int() unsigned NOT NULL AUTO_INCREMENT,-> `name` varchar() NOT NULL,-> `sex` enum('m','w') NOT NULL DEFAULT 'm',-> `age` tinyint(3) unsigned NOT NULL,-> `classid` char(6) DEFAULT NULL,-> PRIMARY KEY (`id`)-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0. sec)

mysql> show tables;+---------------+| Tables_in_ops |+---------------+| member |+---------------+1 row in set (0. sec)

mysql> desc member;+---------+---------------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+---------+---------------------+------+-----+---------+----------------+| id | int() unsigned | NO | PRI | NULL | auto_increment || name | varchar() | NO | | NULL | || sex | enum('m','w') | NO | | m | || age | tinyint(3) unsigned | NO | | NULL | || classid | char(6) | YES | | NULL | |+---------+---------------------+------+-----+---------+----------------+5 rows in set (0. sec)

事先插入两条数据

mysql> insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',,'cls1'),('guohuihui','w',,'cls2');Query OK, 2 rows affected (0. sec)Records: 2 Duplicates: 0 Warnings: 0mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 |+----+-----------+-----+-----+---------+2 rows in set (0. sec)

下面开始进行场景模拟:

1)

ops库会在每天凌晨4点进行一次完全备份的定时计划任务,如下:[root@vm- ~]# crontab -l0 4 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz

这里手动执行下,将ops数据库备份到/opt/backup/ops_$(date +%F).sql.gz文件中:[root@vm- ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gzEnter password: [root@vm- ~]# ls /opt/backup/ops_--.sql.gz-----------------

参数说明:

-B:指定数据库-F:刷新日志-R:备份存储过程等-x:锁表--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息-----------------

待到数据库备份完成,就不用担心数据丢失了,因为有完全备份数据在!!

由于上面在全备份的时候使用了-F选项,那么当数据备份操作刚开始的时候系统就会自动刷新log,这样就会自动产生一个新的binlog日志,这个新的binlog日志就会用来记录备份之后的数据库“增删改”操作

查看一下:

mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin. | | | |+------------------+----------+--------------+------------------+1 row in set (0. sec)

也就是说, mysql-bin. 是用来记录4:之后对数据库的所有“增删改”操作。

2)

早上9点上班了,由于业务的需求会对数据库进行各种“增删改”操作。

解说mysql之binlog日志以及利用binlog日志恢复数据的方法(mysqlbinlog -vvv)

比如:在ops库下member表内插入、修改了数据等等:

先是早上进行插入数据:

mysql> insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',,'cls1'),('xiaoer','m',,'cls3'),('zhangsan','w',,'cls5'),('lisi','m',,'cls4'),('wangwu','w',,'cls6');Query OK, 5 rows affected (0. sec)Records: 5 Duplicates: 0 Warnings: 0

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | xiaoer | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

3)

中午又执行了修改数据操作:

mysql> update ops.member set name='李四' where id=4;Query OK, 1 row affected (0. sec)Rows matched: 1 Changed: 1 Warnings: 0

mysql> update ops.member set name='小二' where id=2;Query OK, 1 row affected (0. sec)Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | 小二 | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | 李四 | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

4)

在下午:的时候,悲剧莫名其妙的出现了!

手贱执行了drop语句,直接删除了ops库!吓尿!mysql> drop database ops;Query OK, 1 row affected (0. sec)

5)

这种时候,一定不要慌张!!!

先仔细查看最后一个binlog日志,并记录下关键的pos点,到底是哪个pos点的操作导致了数据库的破坏(通常在最后几步);

先备份一下最后一个binlog日志文件:[root@vm- ~]# cd /var/lib/mysql/[root@vm- mysql]# cp -v mysql-bin. /opt/backup/`mysql-bin.' -> `/opt/backup/mysql-bin.'[root@vm- mysql]# ls /opt/backup/mysql-bin. ops_--.sql.gz

接着执行一次刷新日志索引操作,重新开始新的binlog日志记录文件。按理说mysql-bin.

这个文件不会再有后续写入了,因为便于我们分析原因及查找ops节点,以后所有数据库操作都会写入到下一个日志文件。

mysql> flush logs;Query OK, 0 rows affected (0. sec)

mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin. | | | |+------------------+----------+--------------+------------------+1 row in set (0. sec)

6)

读取binlog日志,分析问题。读取binlog日志的方法上面已经说到。

方法一:使用mysqlbinlog读取binlog日志:

[root@vm- ~]# cd /var/lib/mysql/[root@vm- mysql]# mysqlbinlog mysql-bin.

方法二:登录服务器,并查看(推荐此种方法)

mysql> show binlog events in 'mysql-bin.';

+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+| mysql-bin. | 4 | Format_desc | 1 | | Server ver: 5.1.-log, Binlog ver: 4 || mysql-bin. | | Query | 1 | | BEGIN || mysql-bin. | | Intvar | 1 | | INSERT_ID=3 || mysql-bin. | | Query | 1 | | use `ops`; insert into ops.member(`name`,`sex`,`age`,`gsan','w',,'cls5'),('lisi','m',,'cls4'),('wangwu','w',,'cls6') || mysql-bin. | | Xid | 1 | | COMMIT /* xid= */ || mysql-bin. | | Query | 1 | | BEGIN || mysql-bin. | | Query | 1 | | use `ops`; update ops.member set name='李四' where id= || mysql-bin. | | Xid | 1 | | COMMIT /* xid= */ || mysql-bin. | | Query | 1 | | BEGIN || mysql-bin. | | Query | 1 | | use `ops`; update ops.member set name='小二' where id= || mysql-bin. | | Xid | 1 | | COMMIT /* xid= */ || mysql-bin. | | Query | 1 | | drop database ops || mysql-bin. | | Rotate | 1 | | mysql-bin.;pos=4 |+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+ rows in set (0. sec)

或者:

mysql> show binlog events in 'mysql-bin.'G;..................*************************** . row ***************************Log_name: mysql-bin.Pos: Event_type: QueryServer_id: 1End_log_pos: Info: drop database ops*************************** . row ***************************Log_name: mysql-bin.Pos: Event_type: RotateServer_id: 1End_log_pos: Info: mysql-bin.;pos= rows in set (0. sec)

通过分析,造成数据库破坏的pos点区间是介于 -- 之间(这是按照日志区间的pos节点算的),只要恢复到前就可。

7)

先把凌晨4点全备份的数据恢复:[root@vm- ~]# cd /opt/backup/[root@vm- backup]# lsmysql-bin. ops_--.sql.gz[root@vm- backup]# gzip -d ops_--.sql.gz [root@vm- backup]# mysql -uroot -p -v < ops_--.sql Enter password: --------------/*! SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */--------------

--------------/*! SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */--------------

..........................

--------------/*! SET SQL_NOTES=@OLD_SQL_NOTES */--------------

这样就恢复了截至当日凌晨(4:)前的备份数据都恢复了。

mysql> show databases; #发现ops库已经恢复回来了mysql> use ops;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A

Database changedmysql> show tables;+---------------+| Tables_in_ops |+---------------+| member |+---------------+1 row in set (0. sec)

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 |+----+-----------+-----+-----+---------+2 rows in set (0. sec)

mysql>

但是这仅仅只是恢复了当天凌晨4点之前的数据,在4:--:之间的数据还没有恢复回来!!怎么办呢?莫慌!这可以根据前面提到的mysql-bin.的新binlog日志进行恢复。

8)

从binlog日志恢复数据恢复命令的语法格式:mysqlbinlog mysql-bin.xx | mysql -u用户名 -p密码 数据库名

--------------------------------------------------------常用参数选项解释:--start-position= 起始pos点--stop-position= 结束pos点--start-datetime="-9- ::" 起始时间点--stop-datetime="-9- ::" 结束时间点--database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)-------------------------------------------------------- 不常用选项: -u --user=name 连接到远程主机的用户名-p --password[=name] 连接到远程主机的密码-h --host=name 从远程主机上获取binlog日志--read-from-remote-server 从某个MySQL服务器上读取binlog日志--------------------------------------------------------

小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;

a)完全恢复(需要手动vim编辑mysql-bin.,将那条drop语句剔除掉)

[root@vm- backup]# /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

b)指定pos结束点恢复(部分恢复):

--stop-position= pos结束节点(按照事务区间算,是)

注意:

此pos结束节点介于“member表原始数据”与更新“name='李四'”之前的数据,这样就可以恢复到更改“name='李四'”之前的数据了。

操作如下:

[root@vm- ~]# /usr/bin/mysqlbinlog --stop-position= --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | xiaoer | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

恢复截止到更改“name='李四'”之间的数据(按照事务区间算,是)

[root@vm- ~]# /usr/bin/mysqlbinlog --stop-position= --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | 李四 | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

c)指定pso点区间恢复(部分恢复):

更新 name='李四' 这条数据,日志区间是Pos[] --> End_log_pos[],按事务区间是:Pos[] --> End_log_pos[]

更新 name='小二' 这条数据,日志区间是Pos[] --> End_log_pos[],按事务区间是:Pos[] --> End_log_pos[]

c1)

单独恢复 name='李四' 这步操作,可这样:

按照binlog日志区间单独恢复:

[root@vm- ~]# /usr/bin/mysqlbinlog --start-position= --stop-position= --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

按照事务区间单独恢复[root@vm- ~]# /usr/bin/mysqlbinlog --start-position= --stop-position= --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

c2)

单独恢复 name='小二' 这步操作,可这样:按照binlog日志区间单独恢复:[root@vm- ~]# /usr/bin/mysqlbinlog --start-position= --stop-position= --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

按照事务区间单独恢复[root@vm- ~]# /usr/bin/mysqlbinlog --start-position= --stop-position= --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

c3)

将 name='李四'、name='小二' 多步操作一起恢复,需要按事务区间,可这样:[root@vm- ~]# /usr/bin/mysqlbinlog --start-position= --stop-position= --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

查看数据库:

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | 小二 | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | 李四 | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

这样,就恢复了删除前的数据状态了!!

另外:

也可指定时间节点区间恢复(部分恢复):除了用pos节点的办法进行恢复,也可以通过指定时间节点区间进行恢复,按时间恢复需要用mysqlbinlog命令读取binlog日志内容,找时间节点。

如上,误删除ops库后:

先进行全备份恢复[root@vm- backup]# mysql -uroot -p -v < ops_--.sql

查看ops数据库

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 |+----+-----------+-----+-----+---------+2 rows in set (0. sec)

mysql>

查看mysq-bin日志,找出时间节点

[root@vm- ~]# cd /var/lib/mysql[root@vm- mysql]# mysqlbinlog mysql-bin. ..........................BEGIN/*!*/;# at # :: server id 1 end_log_pos IntvarSET INSERT_ID=3/*!*/;# at # :: server id 1 end_log_pos Query thread_id=3 exec_time=0 error_code=0use `ops`/*!*/;SET TIMESTAMP=/*!*/;insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',,'cls1'),('xiaoer','m',,'cls3'),('zhangsan','w',,'cls5'),('lisi','m',,'cls4'),('wangwu','w',,'cls6') #执行的sql语句/*!*/;# at # :: server id 1 end_log_pos Xid = #开始执行的时间COMMIT/*!*/;# at # :: server id 1 end_log_pos Query thread_id=3 exec_time=0 error_code=0 #结束时间SET TIMESTAMP=/*!*/;BEGIN/*!*/;# at # :: server id 1 end_log_pos Query thread_id=3 exec_time=0 error_code=0SET TIMESTAMP=/*!*/;update ops.member set name='李四' where id=4 #执行的sql语句/*!*/;# at # :: server id 1 end_log_pos Xid = #开始执行的时间COMMIT/*!*/;# at # :: server id 1 end_log_pos Query thread_id=3 exec_time=0 error_code=0 #结束时间SET TIMESTAMP=/*!*/;BEGIN/*!*/;# at # :: server id 1 end_log_pos Query thread_id=3 exec_time=0 error_code=0SET TIMESTAMP=/*!*/;update ops.member set name='小二' where id=2 #执行的sql语句/*!*/;# at # :: server id 1 end_log_pos Xid = #开始执行的时间COMMIT/*!*/;# at # :: server id 1 end_log_pos Query thread_id=3 exec_time=0 error_code=0 #结束时间SET TIMESTAMP=/*!*/;drop database ops/*!*/;# at # :: server id 1 end_log_pos Rotate to mysql-bin. pos: 4DELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*! SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

恢复到更改“name='李四'”之前的数据

[root@vm- ~]# /usr/bin/mysqlbinlog --start-datetime="-- ::" --stop-datetime="-- ::" --

database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v ops

mysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | xiaoer | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

[root@vm- ~]# /usr/bin/mysqlbinlog --start-datetime="-- ::" --stop-datetime="-- ::" --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v opsmysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | guohuihui | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | 李四 | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

[root@vm- ~]# /usr/bin/mysqlbinlog --start-datetime="-- ::" --stop-datetime="-- ::" --database=ops /var/lib/mysql/mysql-bin. | /usr/bin/mysql -uroot -p -v opsmysql> select * from member;+----+-----------+-----+-----+---------+| id | name | sex | age | classid |+----+-----------+-----+-----+---------+| 1 | wangshibo | m | | cls1 || 2 | 小二 | w | | cls2 || 3 | yiyi | w | | cls1 || 4 | 李四 | m | | cls3 || 5 | zhangsan | w | | cls5 || 6 | lisi | m | | cls4 || 7 | wangwu | w | | cls6 |+----+-----------+-----+-----+---------+7 rows in set (0. sec)

这样,就恢复了删除前的状态了!

总结:

所谓恢复,就是让mysql将保存在binlog日志中指定段落区间的sql语句逐个重新执行一次而已。

以上这篇解说mysql之binlog日志以及利用binlog日志恢复数据的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

浅谈mysql密码遗忘和登陆报错的问题 mysql登录密码忘记,其实解决办法很简单,只需要在mysql的主配置文件my.cnf里添加一行跳过授权表的参数选择即可!在my.cnf中添加下面一行:[root@test-huanq

详谈mysqldump数据导出的问题 1,使用mysqldump时报错(),这个是因为mysqldump版本太低与当前数据库版本不一致导致的。mysqldump:Couldn'texecute'SETOPTIONSQL_QUOTE_SHOW_CREATE=1':YouhaveanerrorinyourSQ

完美解决mysql启动后随即关闭的问题(ibdata1文件损坏导致) 机房一台服务器上的mysql运行一段时间了,突然出现了一个很奇怪的现象:重启后无法恢复了!准确情况是:启动mysql后随即就又关闭了。查看mysql错误

标签: mysqlbinlog -vvv

本文链接地址:https://www.jiuchutong.com/biancheng/349900.html 转载请保留说明!

上一篇:MySQL 5.7中的关键字与保留字详解(mysql常用关键字及其用法)

下一篇:浅谈mysql密码遗忘和登陆报错的问题(mysql密码怎么找回)

  • 房产税城镇土地使用税税率
  • 外商投资合伙企业的性质与特征
  • 在建工程人员工资计入产品成本吗
  • 研发活动计入当期损益怎么计算
  • 保险公司报销修手机
  • 软件使用权收入怎么计算
  • 年报和汇算清缴报表数字不一致
  • 服务类公司没有营业执照
  • 养老保险跨年度可以补缴吗
  • 当月销项税大于进项税怎么办
  • 公司收到一次性吸纳就业补贴款怎么分录
  • 取得抵债资产的相关税费计入
  • 业务招待费记账凭证摘要
  • 一般纳税人税种认定有几个增值税要怎么申报呀
  • 代发工资开票内容
  • 客户退货不退款会计怎么处理
  • 境外增值税代扣代缴
  • 一个公司只有一个财务人员,可以吗
  • 国债逆回购收益什么时候到账
  • 盈余公积补亏影响资产吗
  • 法人实名认证需要带什么
  • 软件开发过程中采用多种图形化工具
  • 收到单位失业保险怎么办
  • 资本资产定价模型
  • 打车进项可以抵扣吗
  • 申报缴纳印花税,取得银行缴税凭证
  • 车辆购置税如何做账
  • 培训机构收一年费用合法吗
  • 消耗性生物资产
  • appdata如何移动
  • vue+element-ui项目
  • win 8和win 7有什么区别
  • 房地产无证销售法律风险
  • puppetm
  • 缴纳房产税需要扣除折旧吗
  • 野外生存探险家
  • chrome怎么用谷歌
  • 迪纳利国家公园在哪个国家
  • 使用php免费发送短信
  • 计提支付公积金
  • js必学知识点
  • 旅游费用叫什么
  • java 导出excel
  • python卡方分布随机数
  • python合并集合
  • 个人帮公司代持股份
  • 现金结算的特点和概念
  • 小微企业所得税优惠政策最新2023
  • 管理费用属于费用类吗
  • 出口退税一般风险商品
  • 分配利润时会计分录
  • 劳务派遣公司差额征税怎么做账
  • 实收资本印花税最新政策2023年
  • 收到银行本票计入什么科目
  • 多付款项退回怎么做账
  • 税控盘减免税款会计分录一般纳税人
  • 员工出差的餐费可以抵扣吗
  • 应付账款跟应收的区别
  • 如何办icp许可证
  • 总分类账的记账
  • mysql数据库自动重启
  • ubuntu git not found
  • centos which
  • win8怎么启动资源管理器
  • 系统播放音乐
  • win10的uwp在哪
  • win7关闭445端口 注册表
  • ExtJS 2.0实用简明教程 之Border区域布局
  • bat批处理文件运行不了
  • Node.js 中exports 和 module.exports 的区别
  • 自定义dialogfragment
  • shell脚本的实现
  • 工具的图
  • Python注释详解
  • 小规模企业所得税怎么算
  • 宾馆税务
  • 固定资产转让要交企业所得税吗
  • 哪些润滑油属于危险品类
  • 内蒙古国地税联合网厅
  • 白酒生产企业向百货公司销售试制药酒
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号