背景
这两天在线上运行的mysql数据库同步,过个1,2天就爆了一次内存,所以dump了一下jvm内存信息分析了下,发觉就是tablemap对象的cache是一个罪魁祸首,2G的old区,平均被4个同步任务划分掉。
解释下,缓存tablemap的意义:
a. insert/update/delete语句操作数据库时,在binlog中会产生两条binary log,第一条就是table map,告诉你改了的表信息。第二条才是具体的变更操作,通过一个tableId进行关联。
b. 通过tableId缓存,可以在执行insert/update/delete解析的时候能够知道具体的表信息,然后根据schema + table name去反查一次数据库,获取字段名字,主键等信息。
一般传统意义上的理解,tableId可以说是相对不太会变化,出现ddl操作时才会发生一次变化,所以这样的cache逻辑一直运行了1年多也没出过问题。
分析
首先查询是否出现频繁的ddl变更,不过很可悲的是,查了半天发现最近几天没有发生过ddl操作,那table_id的频繁递增到底是因为什么原因?
网上找到一篇分析了table_id实现的文章: MySQL Binlog中TABLE ID源码分析
文章中提到几点:
- mysql会缓存table def,每次在写入binlog时,直接存入table def中关联的id.
- 比如有新的table变更时,在cache中没有,就会触发一次load table def的操作,此时就会在原先最后一次table_id基础上+1,做为新的table def的id
- table cache如果超过限制,就会清理最久没用的table def (有点类似LRU)
所以如果table def cache过小,就会出现频繁的换入换出,从而导致table_id增长比较快。
查询了下线上mysql的一些参数和运行数据:
1. 查询table def cache
mysql> show variables like 'table%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | table_definition_cache | 2048 | | table_open_cache | 2048 | +------------------------+-------+
2. 查询当前使用的table def
mysql> show status like 'open%'; +--------------------------+----------+ | Variable_name | Value | +--------------------------+----------+ | Open_files | 14 | | Open_streams | 0 | | Open_table_definitions | 2048 | | Open_tables | 2048 | | Opened_files | 47198363 | | Opened_table_definitions | 1183 | | Opened_tables | 1342 | +--------------------------+----------+
所以基本上table def cache一直是处于满的状态,统计了下表,因为存在分库分表,所以一个数据库实例上的表超过了6000张。
cache 2048 , table 6000张,势必会出现频繁的换入换出,这也就难怪table_id频繁增长了
解决
1. tablemap cache策略以事务为单位进行局部cache,事务结束后清空tablemap cache,所以tableId的频繁增长不再会受到影响
2. 表结构的cache独立出来,以schmea + table name做为cache key,总的cache数也就会<=数据库中的表的总数
可以做的一个优化:
1. 针对分库分表的业务,基本上字段定义都是一样的,从内存dump的分析来看,一张表50个字段,表结构的定义大小大概为6kb,大部分都几种在column name(文本),其实可以利用String.intern()进行共享内存,1024张的分表可以只用一份表结构定义,内存可以从6MB -> 6KB.
针对table_id增长的问题,这里还有一个其他风险:淘宝物流MySQL slave数据丢失详细原因
相关推荐
MysqlTable.sql
MariaDB and MySQL Common Table Expressions and Window Functions Revealed introduces and explains CTEs and window functions, newly available in MariaDB 10.2 and MySQL 8.0, and helps you understand why ...
一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 还是MYSQL的,一张表有还是有ID自增主键,用JDBC insert一条语句之内,怎么在JAVA...
解决mysql failed to open table mysql.event
MariaDB and MySQL Common Table Expressions and Window Functions Revealed 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
THREAD_CACHE MySQL里面为了提高客户端请求创建连接过程的性能,提供了一个连接池也就是 Thread_Cache池,将空闲的连接线程放在连接池中,而不是立即销毁.这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建...
自动检测新旧库表的差异以及字段差异,生成create table和alter table的语句。方便升级项目时更新旧表。
how to create a mysql table via cvi
error 日志当中的记录: [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist 从发了帖子,只有人看,没有人回复,看到这种情况只能自己解决问题了,自己动手...
1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 2 MySQL 邮件列表及如何提问或报告错误 2.1 MySQL邮件列表 2.2 提问或报告错误 2.3 怎样报告错误或问题 2.4 在...
1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 2 MySQL 邮件列表及如何提问或报告错误 2.1 MySQL邮件列表 2.2 提问或报告错误 2.3 怎样报告错误或问题 ...
Copy One Table from mySQL to MS SQL
MariaDB and MySQL Common Table Expressions and Window Functions Revealed 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn...
mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册mysql手册...
+ 4.15.2 启动 MySQL 服务器的问题 + 4.15.3 自动启动和停止 MySQL + 4.15.4 选项文件 o 4.16 升级和降级(downgrading)时有什么特别要做的事情吗? + 4.16.1 从一个 3.22 版本升级到 3.23 + 4.16.2 从一个 ...
Map和Set,mysql数据库应用与实践教程(csdn)————程序
cust_group_id varchar(20) ,`4566731054745600` int(10) ,`4566731054745601` int(10) ,`4566731054745602` int(10) )default charset=utf8; --加载外部数据 load data infile "D:/math_code/20191121/test...
table creation for my sql database
Table of Contents: Introduction to MySQL 8 Installing & Upgrading MySQL 8 MySQL 8 - Using Programs and utilities MySQL 8 Data Types MySQL 8 Database Management MySQL 8 Storage Engines Indexing in ...
ERROR 1051 (42S02): Unknown table 'tmp'这是丁奇提出的引导性的问题,几条语句看似简单,不过接下来我们提出的一连串问题与进行