再说MySQL中的 table_id

xhs私信协议分析 之前分析过xhs的shield算法,今天再聊聊xhs的私信,文章仅供学习参考研究交流,如有侵权请联系删帖。经过抓包分析发现私信接口并不是走的http协议,而是socket协议。而要获取socket包则需要使用wireshark软件1、protobuf的包体中的序号7,多次验证后发现文字信息的需要需要固定成12、protobuf的包体中的序号12,多次验证后发现文字信息的需要需要固定成1后续有时间的话,再研究一下视频和图片格式的私信协议,这次就分析到这里吧。 阅读详情
【背景】
最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况。根本原因:"由于table_list->table_id为uint,而m_table_id为ulong,主库上assign的table map id 总是一直递增的
当超过2^32后,备库出现溢出,导致row模式下备库对应table id的事件全部丢失,产生主备不一致。"
【问题分析】
一 table_id 介绍
    当MySQL 开启日志模式时,binlog会记录所有对数据库的变更操作。binlog 分两种模式 statement 模式和row 模式。
当数据库的binlog format 是statement 模式时
例子:数据库中执行 一条语句
root@rac2 [yangyi]> insert into t1 values(9);                
Query OK, 1 row affected (0.00 sec)
root@rac2 [yangyi]> show binlog events in 'mysql-bin.000003';
+------------------+-----+-------------+-----------+-------------+----------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                   |
+------------------+-----+-------------+-----------+-------------+----------------------------------------+
| mysql-bin.000003 |   4 | Format_desc |         2 |         106 | Server ver: 5.1.68-log, Binlog ver: 4  |
| mysql-bin.000003 | 106 | Query       |         2 |         176 | BEGIN                                  |
| mysql-bin.000003 | 176 | Query       |         2 |         265 | use `yangyi`; insert into t1 values(8) |
| mysql-bin.000003 | 265 | Xid         |         2 |         292 | COMMIT /* xid=12 */                    |
| mysql-bin.000003 | 292 | Query       |         2 |         369 | use `yangyi`; flush tables             |
| mysql-bin.000003 | 369 | Query       |         2 |         439 | BEGIN                                  |
| mysql-bin.000003 | 439 | Query       |         2 |         528 | use `yangyi`; insert into t1 values(9) |
| mysql-bin.000003 | 528 | Xid         |         2 |         555 | COMMIT /* xid=15 */                    |

+------------------+-----+-------------+-----------+-------------+----------------------------------------+
8 rows in set (0.00 sec)
binlog 的log event 记录如下:
#140511 14:44:12 server id 2  end_log_pos 439   Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1399790652/*!*/;
BEGIN
/*!*/;
# at 439
#140511 14:44:12 server id 2  end_log_pos 528   Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1399790652/*!*/;
insert into t1 values(9)
/*!*/;
# at 528
#140511 14:44:12 server id 2  end_log_pos 555   Xid = 15
COMMIT/*!*/;
从日志分析来看 ,DML会记录为原始的SQL,也就是记录在QUERY_EVENT中。 

当数据库的binlog format 是row模式时
执行insert 操作
root@rac2 [yangyi]> insert into t1 values(6);                
Query OK, 1 row affected (0.00 sec)
root@rac2 [yangyi]> show binlog events in 'mysql-bin.000002';          
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000002 |   4 | Format_desc |         2 |         106 | Server ver: 5.1.68-log, Binlog ver: 4 |
| mysql-bin.000002 | 106 | Query       |         2 |         176 | BEGIN                                 |
| mysql-bin.000002 | 176 | Table_map   |         2 |         219 | table_id: 18 (yangyi.t1)              |
| mysql-bin.000002 | 219 | Write_rows  |         2 |         253 | table_id: 18 flags: STMT_END_F        |
| mysql-bin.000002 | 253 | Xid         |         2 |         280 | COMMIT /* xid=61 */                   |

+------------------+-----+-------------+-----------+-------------+---------------------------------------+
5 rows in set (0.00 sec)
binlog中记录的信息:
BEGIN
/*!*/;
# at 176
# at 219
#140511 14:31:43 server id 2  end_log_pos 219   Table_map: `yangyi`.`t1` mapped to number 18
#140511 14:31:43 server id 2  end_log_pos 253   Write_rows: table id 18 flags: STMT_END_F
BINLOG '
TxlvUxMCAAAAKwAAANsAAAAAABIAAAAAAAEABnlhbmd5aQACdDEAAQMAAQ==
TxlvUxcCAAAAIgAAAP0AAAAAABIAAAAAAAEAAf/+BgAAAA==
'/*!*/;
### INSERT INTO `yangyi`.`t1`
### SET
###   @1=6 /* INT meta=0 nullable=1 is_null=0 */
# at 253
#140511 14:31:43 server id 2  end_log_pos 280   Xid = 61
COMMIT/*!*/;
   从解析的binlog中可以看出row模式下,DML操作会记录为:TABLE_MAP_EVENT+ROW_LOG_EVENT(包括WRITE_ROWS_EVENT ,UPDATE_ROWS_EVENT,DELETE_ROWS_EVENT).
   为什么一个update在ROW模式下需要分解成两个event:一个Table_map,一个Update_rows。我们想象一下,一个update如果更新了10000条数据,那么对应的表结构信息是否需要记录10000次?其实是对同一个表的操作,所以这里binlog只是记录了一个Table_map用于记录表结构相关信息,而后面的Update_rows记录了更新数据的行信息。他们之间是通过table_id来联系的。 

二 table_id 的特性
  1 table_id 并不是固定的,它是当表被载入内存(table_definition_cache)时,临时分配的,是一个不断增长的变量。  
  2 当有新的table变更时,在cache中没有,就会触发一次load table def的操作,此时就会在原先最后一次table_id基础上+1,做为新的table def的id。
  3 flush tables,之后对表的更新操作也会触发table_id 的增长。
  4 如果table def cache过小,就会出现频繁的换入换出,从而导致table_id增长比较快。
例子
root@rac2 [yangyi]> show binlog events in 'mysql-bin.000002';
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000002 |   4 | Format_desc |         2 |         106 | Server ver: 5.1.68-log, Binlog ver: 4 |
| mysql-bin.000002 | 106 | Query       |         2 |         176 | BEGIN                                 |
| mysql-bin.000002 | 176 | Table_map   |         2 |         219 | table_id:18 (yangyi.t1)              |
| mysql-bin.000002 | 219 | Write_rows  |         2 |         253 | table_id:18 flags: STMT_END_F        |
| mysql-bin.000002 | 253 | Xid         |         2 |         280 | COMMIT /* xid=61 */                   |
| mysql-bin.000002 | 280 | Query       |         2 |         357 | use `yangyi`; flush tables           |
| mysql-bin.000002 | 357 | Query       |         2 |         427 | BEGIN                                 |
| mysql-bin.000002 | 427 | Table_map   |         2 |         470 | table_id:19 (yangyi.t1)              |
| mysql-bin.000002 | 470 | Write_rows  |         2 |         504 | table_id:19 flags: STMT_END_F        |
| mysql-bin.000002 | 504 | Xid         |         2 |         531 | COMMIT /* xid=65 */                   |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
10 rows in set (0.00 sec)

三 table_id在主从复制过程中转变  
     每一个dml操作表的信息都被会记录table_mapping的hash数据结构中,hash的key就是ulong型的table_id,hash的值就是TABLE*的数据结构(包含了表的各种信息,包括数据库名,表名,字段数,字段类型等),通过set_table()方法来hash,通过get_table()方法来根据table_id获得对应的表信息。
    当主库的日志传递到备库时,每一个log_event都是通过do_apply_event()方法来将event应用到本地数据库中。在apply relay log中的event时,do_apply_event()将ulong型的m_table_id(binlog记录的table_id)赋值给RPL_TABLE_LIST结构中的uint型的table_id。 核心问题出现了: 如果binlog 中的table_id 的值大于max(uint),在变量传递是,就会发生截断。
而MySQL内部使用set_table(table_id)构造hash,使用get_table(m_table_id)从hash表中取值,在两个阶段用到的key因为发生了数据截断,所以必然也就不能取到预期的值。也就是说之前用uint型的table_id构建出来的key-value的hash对,用ulong型的m_table_id是无法查询到的。


四 风险与解决
  从第二,三点我们知道当table_id 过快增长,会导致从库应用binlog无法解析到对应的表,造成数据不一致的情况。
解决方法:
 1 加大 table cache 的大小。
 2 重启主库使table_id 归0,缺点 成本比较高,出现此问题的时候,主备已经不一致,线上环境 不能完成切换。
 3 修改MySQL源码,将 RPL_TABLE_LIST结构中的uint型的table_id修改为ulong型 ,一劳永逸。


五 参考文章
[1] 物流MySQL slave复制数据部分丢失问题 
[2] 淘宝物流MySQL slave数据丢失详细原因 
[3] mysql TableMap id递增问题 
[4] MySQL Binlog中TABLE ID源码分析
[5]  MySQL table_id原理及风险分析 
基于大模型与知识图谱的对话引导意图澄清系统技术解析 本文提出了一种基于知识图谱与大语言模型的意图澄清系统,旨在解决传统RAG模型在跨文档推理和主动澄清方面的不足。系统通过知识图谱驱动的多跳推理机制和链式思维引导的对话流程,实现了动态信息补全和意图澄清。核心创新包括:1)知识图谱构建与节点选择算法;2)标签探索策略与原子事实提取方法;3)主动澄清引擎的工作流程。实验表明,该系统能有效提升复杂查询的准确率,在医疗、金融等领域实现精准交互。关键代码展示了节点选择、标签匹配和事实提取等核心组件的实现细节。 阅读详情

相关推荐

YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线

本项目实现了一个基于YOLOv8和TensorRT的高性能火灾烟雾检测系统,具有以下核心特点: 技术架构:采用TensorRT 8.6+进行GPU加速推理,结合CUDA 12.1和OpenCV 4.8+,实现高效计算机视觉处理。系统使用XMake替代CMake构建,配置更简洁高效。

hscing的博客 1065

mysql table id_再说MySQL中的 table_id

最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况。根本原因:由于table_list-gt;table_id为uint,而m_table【背景】最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况。根本原因:"由于table_list->table_id为uint,而m_table_id为ulong,主库上assign的table map id 总是一直递增的...

weixin_36231529的博客 1235

工业音频故障检测:从CNN到Transformer的技术演进

音频信号处理是工业设备预测性维护的核心技术之一,通过分析设备运行时产生的声波特征实现故障预警。传统方法依赖梅尔频率倒谱系数(MFCC)等手工特征,而深度学习技术尤其是Transformer架构,通过自注意力机制突破了CNN在跨频段特征提取上的局限。Audio Spectrogram Transformer(AST)等先进模型在工业场景中展现出91.2%的高召回率,显著优于传统方案。这种非接触式监测技术结合边缘计算优化,已成功应用于石油化工、电力能源等领域,实现提前72小时预测轴承故障,单项目可避免数百万元的

weixin_30467861的博客 325

mysql table_id介绍

mysql table_id

一条大河 994

信创迁移实战:在银河麒麟V10-SP1上为Milvus离线部署Docker(附SP1专属避坑指南)

本文详细介绍了在银河麒麟V10-SP1 x86_64环境下离线部署Docker的全流程,特别针对该版本特有的自定义目录安装失败问题提供深度分析和解决方案。通过实战验证的步骤和避坑指南,帮助用户在信创项目中顺利完成Milvus等应用的容器化部署。

weixin_30687051的博客 531

高通camx ThreadManager

m_pCore->AcceptNewJob是将一个Job或者任务插入一个Queue,有一个工作线程循环从Queue中取Job任务执行,执行任务就是回调任务中的callback函数,AcceptNewJob实现。调用AddToPriorityQueue将任务添加到queue任务队列,那么什么时候从这个queue中取任务执行呢?有个线程循环执行DoWork,最终调用checkAndDequeue取任务执行。

GetnextWindow的专栏 435

mysql table id_mysql原理 ~ binlog系列之 table_id详谈

一简介: 今天来聊聊minlog中的table_id二 具体分析特点1 table_id 并不是固定的,它是当表被载入内存(table_definition_cache)时,临时分配的,是一个不断增长的变量2 当有新的table变更时,在cache中没有,就会触发一次load table def的操作,此时就会在原先最后一次table_id基础上+1,做为新的table def的id。3 flu...

weixin_28982301的博客 915

LVDS系列11:Xilinx Ultrascale系可编程输入延迟(一)

按照IDELAYCTRL的参考时钟频率可以准确计算获取到,如200M参考时钟抽头分辨率为78ps,Ultrascale系列相对于7系列架构大改,体现便是U/U+系列的抽头增加到512个,同时每个抽头的分辨率就无法像7系列那样能得到一个准确的值,是一个波动的范围值,抽头分辨率随着工艺温度电压的变化而变化。EN_VTC:电压温度补偿开启的使用信号,COUNT模式下不能使用,必须保持为0,TIME模式下需要使用,在延迟工作时要启用温度电压补偿,在修改抽头值时需要关闭温度电压补偿,修改完后启用;

weixin_38828382的博客 1937

计算机网络4:数据通信的基础知识(物理层)

奈氏准则和香农公式的意义是不同的。奈氏准则激励工程人员不断探索更加先进的编码技术,使每一个码元携带更多比特的信息量。香农公式则告诫工程人员,在有噪声的实际信道上,不论采用多么复杂的编码技术,都不可能突破香农公式给出的信息传输速率的绝对极限。由此可看出香农公式的重要意义。

swadian2008的博客 2704

在Allegro设计界面中如何修改封装焊盘

在高密度板的情况下,SUIPLA(支持内层没有的焊盘摘掉)打勾,在高密度板的情况下,内层没有的焊盘摘掉可以增加走线的空间。3、修改完焊盘后,选择File→Update to Design(更新到设计)。然后关闭焊盘修改对话框即可。,将会定期不定期更新技术文章,互相学习交流。或者点击Options选项卡下要修改的焊盘,然后点击Edit修改。在Allegro PCB设计界面中修改封装焊盘的方法。2、然后点击封装上要修改的焊盘,右击选择Edit。修改完成后如下图所示。

bhxc809751502的博客 7806

RK3588 MPP,RGA,DRM,QT之RGA

RK3588多路视频采用RGA来进行混合成一帧

dreamliweiming的博客 4264

【MySQL】再说MySQL中的 table_id

【背景】 最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况。根本原因:"由于table_list->table_id为uint,而m_table_id为ulong,主库上assign的table map...

cojm55771的博客 417

2、机器人控制技术:阻抗/导纳控制与强化学习的融合

本文探讨了阻抗/导纳控制与强化学习在机器人控制中的融合应用。阻抗/导纳控制广泛应用于外骨骼和跟踪控制,通过改进方案提升建模误差下的鲁棒性;强化学习则为解决维度灾难、实现最优交互提供了有效途径,尤其在大输入空间、连续时间系统、冗余机器人及鲁棒控制中表现突出。结合近似器与合理奖励设计,强化学习可在无模型情况下实现高效控制。未来,两者融合有望推动更智能、更安全的机器人系统发展。

ice55的博客 299

mysql tableid_再说MySQL中的 table_id

【背景】最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况。根本原因:"由于table_list->table_id为uint,而m_table_id为ulong,主库上assign的table map id 总是一直递增的当超过2^32后,备库出现溢出,导致row模式下备库对应table id的事件全部丢失,产生主备不一致。"【问题分析】一 table_id 介绍当MySQ...

weixin_30784365的博客 1481

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mysql table id 404_MySQL table_id原理及风险分析

1. 什么是table_idMySQLbinlog文件按格式分为文件头部和事件信息。文件头部占4字节,内容固定为:"\xfe\x62\x69\x6e",接下来就是各个event了。event有多种类型,比如ROTATE_EVENT对应的记录了binlog切换到下一个binlog文件的信息,XID_EVENT记录了一个事务提交的相关信息。binlog_format可以设置为statement和row...

weixin_34082139的博客 347

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mysql table_id 文章搜刮

唉,祸不单行,刚遇到死锁的问题,有遇到table_id的问题…… MySQL Binlog中TABLE ID源码分析 淘宝物流mysql slave数据丢失详细原因 MySQL table_id原理及风险分析 FAQ系列 | table id问题导致主从复制失败 【MySQL】再说MySQL中的 table_id 结论: 1. 增大table cache 2. 定期检查table_id,其值不能

要啥自行车,一把梭~ 820

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

mysql binlog tableid_MySQL Binlog中TABLE ID源码分析 【转】

目的MySQL的binlog日志中,基于行模式的方式,有table id的信息,而该table id并不是binlog中的操作表的固定id。为了进一步了解table id的改变,研究MySQL源码(MySQL-5.5.20),查看具体的处理逻辑,供开发和DBA参考。源码分析table id的分配在函数assign_new_table_id()(sql\sql_base.cc:3598)中分配,从处...

weixin_30588655的博客 862

mysql原理 ~ binlog系列之 table_id详谈

一简介: 今天来聊聊minlog中的table_id 二 具体分析特点 1 table_id 并不是固定的,它是当表被载入内存(table_definition_cache)时,临时分配的,是一个不断增长的变量 2 当有新的table变更时,在cache中没有,就会触发一次load table def的操作,此时就会在原先最后一次table_id基础上+1,做为新的ta...

weixin_30603633的博客 674

MySQL Replication--TABLE_ID与行格式复制

BINLOG中的TABLE_ID 在ROW格式的二进制中,事件信息中没有列的信息,需要通过Table_Map将表名对于的表信息加载到cache中,然后根据事件信息中的列下标来定位到数据列,每次表信息加载到Cache中时,会得到一个自增的ID值,即Table_ID: # at 1794 #190717 13:08:44 server id 4294967295 end_log_...

weixin_30460489的博客 166

mysql tableid_MySQL Replication--TABLE_ID与行格式复制

BINLOG中的TABLE_ID在ROW格式的二进制中,事件信息中没有列的信息,需要通过Table_Map将表名对于的表信息加载到cache中,然后根据事件信息中的列下标来定位到数据列,每次表信息加载到Cache中时,会得到一个自增的ID值,即Table_ID:# at 1794#190717 13:08:44 server id 4294967295 end_log_pos 1855 ...

weixin_33957382的博客 162

MySQL table_id原理及风险分析

1. 什么是table_id MySQL binlog文件按格式分为文件头部和事件信息。文件头部占4字节,内容固定为:"\xfe\x62\x69\x6e",接下来就是各个event了。event有多种类型,比如ROTATE_EVENT对应的记录了binlog切换到下一个binlog文件的信息,XID_EVENT记录了一个事务提交的相关信息。 binlog_format可以设置为statemen...

weixin_30794851的博客 245

mysql怎么实现行级索_MySQL Replication--TABLE_ID与行格式复制

BINLOG中的TABLE_ID在ROW格式的二进制中,事件信息中没有列的信息,需要通过Table_Map将表名对于的表信息加载到cache中,然后根据事件信息中的列下标来定位到数据列,每次表信息加载到Cache中时,会得到一个自增的ID值,即Table_ID:# at 1794#190717 13:08:44 server id 4294967295 end_log_pos 1855 ...

weixin_34515649的博客 137

【MySQL BUG】线上系统因table_id溢出导致主从复制无法进行总结

一、背景 上周,所负责一个系统遇到MySQL的bug(Bug#67352),导致所有从库卡在某一个点无法继续同步主库的更新。具体表现:主库后面挂载的10几个从库都停在同一个点,Relay_Master_Log_File和Exec_Master_Log_Pos一直不停滚动,但SQL却没有被执行,即relay log有被扫描的行为,但...

weixin_34370347的博客 378

mysql选择table_mysql – 选择distinct table4_id,table3_id和table2_...

我有4张桌子.我使用INNER和RIGHT JOIN加入了他们.我试图选择不同的table4_id,table3_id和table2_id.这是加入4个表的查询$query = mysqli_query($con,"SELECTtable1.table1_id,table1.firstname,table1.middlename,table1.lastname,table1.extension_n...

weixin_39741101的博客 193

mysql-INNODB_FT_INDEX_TABLE表中的 first_doc_id 和、last_doc_id 和doc_id

是 InnoDB 存储引擎内部的一个表,用于存储全文索引的倒排索引信息。:如果一张表有10行记录,name字段都是“male”,现在对name建立全文索引。好的,让我们详细分析一下你描述的场景,并解释在这种情况下。如果你想查看更详细的倒排索引信息(例如每个文档的具体。如果还有其他疑问,请随时告诉我!希望这个解释能够帮助你理解。

以爱护甲,爱满枫林。 1226

【MySQL从入门到精通】【高级篇】(二十三)EXPLAIN的概述与table,id字段的剖析

本文对EXPLAIN命令做了一个详细的介绍,EXPLAIN 命令是分析慢查询SQL的利器,通过它我们可以窥探SQL的执行情况,从而为我们进行SQL优化提供指导意义。接着,我们详细介绍了table列和id列的含义和各种情况的说明。

码农飞哥 1871
上一篇: MySQL启动脚本 mysql.server 详解
下一篇: 主库插入数据从库无法同步
kf_panda
博客等级 码龄15年 67粉丝 353原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值