Mysql公共表空间文件ibdata1介绍
文本系阅读 https://blog.csdn.net/demonson/article/details/79864225 后总结
ibdata1存了什么?
当你启用了 innodb_file_per_table
,表被存储在他们自己的表空间里,但是共享表空间仍然在存储其它的 InnoDB 内部数据:
- 数据字典, 也就是 InnoDB 表的元数据
- 变更缓冲区 也就是change buffer
- 双写缓冲区 翻译成两次写缓存 更合适
- 撤销日志 也就是undolog
实际中有两个参数,可以防止空间不断扩大
innodb_ibuf_max_size 设置最大变更缓冲区,
innodb_doublewrite_file 来将双写缓冲区存储到一个分离的文件
如果有告警发现ibddata1过大怎么办?其中一个最有可能的原因是undolog太长了,非常有可能是大量未提交的活跃事务,为了保证可见性要保留大量的undolog
可以用命令 SHOW ENGINE INNODB STATUS/G 查看当前数据库概况
---TRANSACTION 36E, ACTIVE 1256288 sec
MySQL thread id 42, OS thread handle 0x7f8baaccc700, query id 7900290 localhost root
show engine innodb status
Trx read view will not see trx with id >= 36F, sees < 36F
这是一个最常见的原因,一个14天前创建的相当老的事务。这个状态是活动的,这意味着 InnoDB 已经创建了一个数据的快照,所以需要在撤销日志中维护旧页面,以保障数据库的一致性视图,直到事务开始。如果你的数据库有大量的写入任务,那就意味着存储了大量的撤销页。