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

MySQL的Binlog记录了MySQL数据库中的所有更改。
一旦了解了Binlog的结构,就可以对其进行一些更改,例如解析Binlog,实现类似于Oracle的Flashback的功能,或者恢复意外删除的数据。
录制文件、恢复更新记录等在这篇文章中,我们将讲解这些神奇功能的实现,你会发现它比你想象的要容易得多。
本文引用的Binlog是ROW模式Binlog,这也是MySQL8中的默认模式。
由于其使用中的许多限制,STATEMENT模式正变得越来越过时。
二进制日志由事件组成。
请注意,事件不是事务。
事件描述对数据库的更改。
现在您已经了解了Binlog的结构,让我们尝试修改其中的数据。
例如上例中的Binlog删除了记录。
Binlog有行删除(DELETE_ROWS_EVENT)事件,与行写入(WRITE_ROWS_EVENT)不同。
)事件的数据结构完全相同,只是行删除事件的类型为32,行写入事件的类型为30。
将对应的Binlog位置32改为30,即可重新插入删除的记录。
从前面的“showbinlogevents”我们可以看到这个DELETE_ROWS_EVENT是从位置378开始的。
这里的位置是Binlog文件的实际位置(以字节为单位)。
从事件的结构中,我们可以看到type_code是事件的第五个字节。
创建一个Python小程序,将第383个(378+5=383)字节更改为30。
当然,您也可以使用二进制编辑工具对其进行修改。
检查Binlog是否有大事务。
由于ROW模式的Binlog记录了所有的变化,简单的SQL就可以在Binlog中产生巨大的事务,比如修改整张表中所有记录的update或delete语句。
,每条记录都会记录一次到Binlog,从而产生巨大的交易记录。
如此大的问题往往会带来麻烦。
我的一位客户曾经向我抱怨他的Binlog被前滚了,两天后仍然无法工作。
当我们分析Binlog时,发现有一个事务生成了1.4G记录,修改了66万条记录。
下面是一个简单的Python小程序,用于搜索Binlog中的大交易。
用mysqlbinlog解析的Binlog显示,每个事务以BEGIN开始,以COMMIT结束。
您可以通过查找BENGIN之前“#at”的位置并检查COMMIT之后“#at”的位置来计算事务的大小。
下面是这个Python程序的示例。
断开Binlog中的大事务对于大事务,MySQL将其分解为多个事件(注意一个是事务TRANSACTION,一个是事件EVENT)。
事件的大小由参数binlog-row-event-max决定。
-尺寸该参数的默认值为8K。
因此,ROW模式允许您将多个事件拆分为单独的较小事务,即使您只更新记录中的一个字段。
此行为由binlog_row_image参数控制。
是的,这个参数有三个值。
默认为完整。
这意味着即使字段没有更改,也会记录对该列的所有更改。
这样就可以实现类似Oracle的Flashback的功能。
我个人预计MySQL未来的版本可能会推出这样基于Binlog的功能。
例如,通过了解Binlog的结构并使用Python的瑞士军刀,您还可以统计哪些表变化最大。
您还可以将Binlog拆分和重新组织为多个部分,从而使您可以灵活地修改和迁移MySQL数据库。

mysql怎么改变表格中的数据

本期我们利用MySQL提供的DBUG工具来研究MySQL的SQL处理流程。

我们先创建一个实例

这里需要稍微修改一下启动实例的启动文件,将CUSTOM_MYSQLD改为mysqld-debug:

重启实例并添加调试参数:

我们来做一两个测试来说明一下DBUG包的作用:

首先我们来设置一下简单的调试规则:

>

d:启用各个调试点的输出

O、/tmp/mysqld.trace:将调试结果输出到指定文件

请点击输入图像描述

然后我们创建一个表格来查看调试输出:

请点击进入图片描述

可以看到MySQL在创建过程中的一些详细操作,比如alloc_root内存分配等

这个视图不够直观,请添加一些信息:

请点击输入图片描述

查看效果:

请点击输入图片描述

可以看到输出已经变成了调用树。
现在你可能知道alloc_root分配的内存是用于SQL解析(mysql_parse)的

我们会添加。
一些更有用的信息:

请点击输入图像描述

您可以看到名称文件和行号已添加到结果:

请点击输入图片描述

现在我们可以在顶部找到与统计表相关的信息out:

请点击输入图片描述

可以看到MySQLHere很智能,直观的Next执行了一个内置的更新统计表的存储过程。

沿着que_eval_sql您可以找到其他类似的统计表,例如:

请点击输入图像描述

请点击输入图像描述

在测试中,我们使用了包MySQLDBUG允许MySQL显示处理过程。
MySQL中类似的技术还有很多,比如performance_schema、OPTIMIZER_TRACE等。

这些技术从MySQL的不同方向展示信息,使人们更容易理解其机制。