MySQL · 捉虫动态 · 备库1206错误问题说明-阿里云开发者社区

开发者社区> db匠> 正文

MySQL · 捉虫动态 · 备库1206错误问题说明

简介: 问题背景 一个用户自建MySQL,出现备库复制中断的问题,报错为slave sql thread 错误,The total number of locks exceeds the lock table size。 报错代码 这个报错在代码中的抛错逻辑为: if UT_LIST_GET_LEN(buf_pool->free) + UT_LIST_GET_LEN(buf_pool->L
+关注继续查看

问题背景

一个用户自建MySQL,出现备库复制中断的问题,报错为slave sql thread 错误,The total number of locks exceeds the lock table size。

报错代码

这个报错在代码中的抛错逻辑为:

if UT_LIST_GET_LEN(buf_pool->free) + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->curr_size / 4

文字解释是:如果buffer pool中的空闲页面和LRU页面总和少于buffer pool 大小的1/4,则认为内存不够用,报错。

那么问题来了

  1. buffer pool 哪里去了
    buffer pool是InnoDB内部管理内存的统一结构。默认每个page 16k。初始化后,每个page都是空闲状态,放在free中。
    当读取数据等需要用到页面数据的操作时,将数据从磁盘读取到内存中,用的就是buffer pool的page。为了支持淘汰机制,InnoDB内部维护了一个淘汰链表,就是LRU list。装了数据的page被从free list移到LRU list。
    但是,除了正常的读取数据,还有其他的逻辑需要从buffer pool中“抢”资源。比如本例中是因为undo page。
    事务越大,需要的undo page越多,在整个事务未提交前,undo page是必须强占内存的。这就可能导致一种情况:事务过大,导致buffer pool全部被用光,无法提供正常服务。
    因此InnoDB有了上面的保护机制。触发这个上限后报错后,事务会回滚,释放undo page。

  2. 为什么主库执行成功备库失败了
    从上面的分析和代码中可以看到,判断内存是否占用过多,设置的上限是buffer_pool size的1/4.
    另外,5.6以后支持了设置多个 innodb_buffer_pool_instances,也就是分成多个pool, 在现在的逻辑中,认为只要“任意一个pool满足上述超过1/4的条件”,都判定为内存消耗过限。
    因此主要排查参数:
    • 备库的 innodb_buffer_pool_size 是否小于主库值
    • 若主备的innodb_buffer_pool_size值相同,备库的 innodb_buffer_pool_instances 值是否更大。
  3. 作为验证
    DBA在发现备库apply error的时候第一步往往是用 mysqlbinlog 工具去看导致错误的event是什么。这时候会发现其实是一个批量的load数据,或者update/delete大事务导致。

小结

  1. buffer pool不仅用于缓存page,会有其他数据结构争抢;
  2. 主备的参数尽量保持一致;
  3. 尽量避免超大事务,即使不考虑备库apply error。这种超大事务在主库执行,由于undo page占用buffer pool,可能会导致buffer pool命中率突然下降,影响业务。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Ubuntu解决sudo: source: command not found错误
Ubuntu解决sudo: source: command not found错误 在Ubuntu Server上执行以下命令,可以看到默认打开的文件数限制为1024个。
1003 0
Ubuntu解决sudo: source: command not found错误
Ubuntu解决sudo: source: command not found错误 在Ubuntu Server上执行以下命令,可以看到默认打开的文件数限制为1024个。
2313 0
MySQL · 捉虫动态 · left-join多表导致crash
有一天小编胡乱写SQL, left join了30张表, 结果导致了Mysql server gone away… 我们来看看crash堆栈 <signal handler called> base_list_iterator::next update_ref_and_keys make_
1410 0
MyBatis Generator(MBG)PostgreSQL使用说明 区分大小写敏感
PostgreSQL使用说明区分大小写敏感 PostgreSQL对所有数据库标识符(表名,模式名,列名等)区分大小写。此外,PostgreSQL对所有小写字母的所有标识符都有不同的偏好。如果您使用PostgreSQL的所有小写标识符,那么MyBatis Generator将找到表并写入正确的SQL,而无需额外考虑。
1475 0
MySQL动态字符串处理DYNAMIC_STRING
MySQL中,常常会看到一些关于动态字符串的处理,列如:DYNAMIC_STRING。   为了记录动态字符串的实际长度,缓冲区的最大长度,以及每次字符串需要调整时,及时分配新的内存,以及调整长度。MySQL使用了DYNAMIC_STRING来保存动态字符串相关的信息:   typedef struct st_dynamic_string { char *str; siz
1039 0
+关注
db匠
rds内核团队秘密研发的全自动卖萌机. 追加特效: 发数据库内核月报. 月报传送: http://mysql.taobao.org/monthly/
497
文章
0
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载