腾讯云开发者社区 mysqlbinlog截取某个数据库的表

mysqlbinlog截取某个数据库的表

如何修改mysql一个数据库中所有表某个字段的数据?MySQL的Binlog记录着MySQL数据库的所有变更信息,了解Binlog的结构可以帮助我们解析Binlog,甚至对Binlog进行一些修改,或者说是“篡改”,例如实现类似于Oracle的flashback的功能,恢复误删除的记录,把update的记录再还原回去等...

yetaoseo  ·  2021-11-17 15:40:03 发布

如何修改mysql一个数据库中所有表某个字段的数据?

MySQL的Binlog记录着MySQL数据库的所有变更信息,了解Binlog的结构可以帮助我们解析Binlog,甚至对Binlog进行一些修改,或者说是“篡改”,例如实现类似于Oracle的flashback的功能,恢复误删除的记录,把update的记录再还原回去等。本文将带您探讨一下这些神奇功能的实现,您会发现比您想象地要简单得多。本文指的Binlog是ROW模式的Binlog,这也是MySQL8里的默认模式,STATEMENT模式因为使用中有很多限制,现在用得越来越少了。

Binlog由事件(event)组成,请注意是事件(event)不是事务(transaction),一个事务可以包含多个事件。事件描述对数据库的修改内容。

现在我们已经了解了Binlog的结构,我们可以试着修改Binlog里的数据。例如前面举例的Binlog删除了一条记录,我们可以试着把这条记录恢复,Binlog里面有个删除行(DELETE_ROWS_EVENT)的事件,就是这个事件删除了记录,这个事件和写行(WRITE_ROWS_EVENT)的事件的数据结构是完全一样的,只是删除行事件的类型是32,写行事件的类型是30,我们把对应的Binlog位置的32改成30即可把已经删除的记录再插入回去。从前面的“showbinlogevents”里面可看到这个DELETE_ROWS_EVENT是从位置378开始的,这里的位置就是Binlog文件的实际位置(以字节为单位)。从事件(event)的结构里面可以看到type_code是在event的第5个字节,我们写个Python小程序把把第383(378+5=383)字节改成30即可。当然您也可以用二进制编辑工具来改。

找出Binlog中的大事务

由于ROW模式的Binlog是每一个变更都记录一条日志,因此一个简单的SQL,在Binlog里可能会产生一个巨无霸的事务,例如一个不带where的update或delete语句,修改了全表里面的所有记录,每条记录都在Binlog里面记录一次,结果是一个巨大的事务记录。这样的大事务经常是产生麻烦的根源。我的一个客户有一次向我抱怨,一个Binlog前滚,滚了两天也没有动静,我把那个Binlog解析了一下,发现里面有个事务产生了1.4G的记录,修改了66万条记录!下面是一个简单的找出Binlog中大事务的Python小程序,我们知道用mysqlbinlog解析的Binlog,每个事务都是以BEGIN开头,以COMMIT结束。我们找出BENGIN前面的“#at”的位置,检查COMMIT后面的“#at”位置,这两个位置相减即可计算出这个事务的大小,下面是这个Python程序的例子。

切割Binlog中的大事务

对于大的事务,MySQL会把它分解成多个事件(注意一个是事务TRANSACTION,另一个是事件EVENT),事件的大小由参数binlog-row-event-max-size决定,这个参数默认是8K。因此我们可以把若干个事件切割成一个单独的略小的事务

ROW模式下,即使我们只更新了一条记录的其中某个字段,也会记录每个字段变更前后的值,这个行为是binlog_row_image参数控制的,这个参数有3个值,默认为FULL,也就是记录列的所有修改,即使字段没有发生变更也会记录。这样我们就可以实现类似Oracle的flashback的功能,我个人估计MySQL未来的版本从可能会基于Binlog推出这样的功能。

了解了Binlog的结构,再加上Python这把瑞士军刀,我们还可以实现很多功能,例如我们可以统计哪个表被修改地最多?我们还可以把Binlog切割成一段一段的,然后再重组,可以灵活地进行MySQL数据库的修改和迁移等工作。

如何修改mysql一个数据库中所有表某个字段的数据?

MySQL的Binlog记录着MySQL数据库的所有变更信息,了解Binlog的结构可以帮助我们解析Binlog,甚至对Binlog进行一些修改,或者说是“篡改”,例如实现类似于Oracle的flashback的功能,恢复误删除的记录,把update的记录再还原回去等。本文将带您探讨一下这些神奇功能的实现,您会发现比您想象地要简单得多。本文指的Binlog是ROW模式的Binlog,这也是MySQL8里的默认模式,STATEMENT模式因为使用中有很多限制,现在用得越来越少了。

Binlog由事件(event)组成,请注意是事件(event)不是事务(transaction),一个事务可以包含多个事件。事件描述对数据库的修改内容。

现在我们已经了解了Binlog的结构,我们可以试着修改Binlog里的数据。例如前面举例的Binlog删除了一条记录,我们可以试着把这条记录恢复,Binlog里面有个删除行(DELETE_ROWS_EVENT)的事件,就是这个事件删除了记录,这个事件和写行(WRITE_ROWS_EVENT)的事件的数据结构是完全一样的,只是删除行事件的类型是32,写行事件的类型是30,我们把对应的Binlog位置的32改成30即可把已经删除的记录再插入回去。从前面的“showbinlogevents”里面可看到这个DELETE_ROWS_EVENT是从位置378开始的,这里的位置就是Binlog文件的实际位置(以字节为单位)。从事件(event)的结构里面可以看到type_code是在event的第5个字节,我们写个Python小程序把把第383(378+5=383)字节改成30即可。当然您也可以用二进制编辑工具来改。

找出Binlog中的大事务

由于ROW模式的Binlog是每一个变更都记录一条日志,因此一个简单的SQL,在Binlog里可能会产生一个巨无霸的事务,例如一个不带where的update或delete语句,修改了全表里面的所有记录,每条记录都在Binlog里面记录一次,结果是一个巨大的事务记录。这样的大事务经常是产生麻烦的根源。我的一个客户有一次向我抱怨,一个Binlog前滚,滚了两天也没有动静,我把那个Binlog解析了一下,发现里面有个事务产生了1.4G的记录,修改了66万条记录!下面是一个简单的找出Binlog中大事务的Python小程序,我们知道用mysqlbinlog解析的Binlog,每个事务都是以BEGIN开头,以COMMIT结束。我们找出BENGIN前面的“#at”的位置,检查COMMIT后面的“#at”位置,这两个位置相减即可计算出这个事务的大小,下面是这个Python程序的例子。

切割Binlog中的大事务

对于大的事务,MySQL会把它分解成多个事件(注意一个是事务TRANSACTION,另一个是事件EVENT),事件的大小由参数binlog-row-event-max-size决定,这个参数默认是8K。因此我们可以把若干个事件切割成一个单独的略小的事务

ROW模式下,即使我们只更新了一条记录的其中某个字段,也会记录每个字段变更前后的值,这个行为是binlog_row_image参数控制的,这个参数有3个值,默认为FULL,也就是记录列的所有修改,即使字段没有发生变更也会记录。这样我们就可以实现类似Oracle的flashback的功能,我个人估计MySQL未来的版本从可能会基于Binlog推出这样的功能。

了解了Binlog的结构,再加上Python这把瑞士军刀,我们还可以实现很多功能,例如我们可以统计哪个表被修改地最多?我们还可以把Binlog切割成一段一段的,然后再重组,可以灵活地进行MySQL数据库的修改和迁移等工作。

数据库表的设计包括什么?

这些表设计包括基本表和列信息,以及外部键约束、检查约束和主键约束等等的合法性

什么是数据库关系表?

把学生关系表分为如下两个表:学生:(学号,姓名,年龄,所在学院);学院:(学院,地点,电话)

excle中怎么将log值变回原来的数据库

用SQL语句,根据booktype,book表,创建一个包含ISBN,booktitle,auth

/*帮你把语句排了下序,层次显得明显一点,也简单的注释下(主要是也不清楚你每张表以及字段各代表什么意思),不懂的追问*/

select *

from (select bookid, count(bookid) as degree

from tb_borrow

group by bookid) as borr--统计tb_borrow表中bookid各有多少条

join (select b.*,c.name as bookcasename,p.pubname,t.typename

from bookinfo b--基础表bookinfo

left join tb_bookcase c on b.bookcase = c.id --左链接tb_bookcase

join tb_publishing p on b.ISBN = p.ISBN --内链接tb_publishing

join tb_booktype t on b.typeid = t.id--内链接tb_booktype

where b.del = 0) as book

on borr.bookid = book.id--外层内链接两张中间表你说呢...

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐

  • 浏览量 255
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献1条内容