What is stored in ibdata1?

当启用innodb_file_per_table时,表存储在它们自己的表空间中,但共享表空间仍用于存储其他InnoDB的内部数据:

数据字典也就是InnoDB表的元数据
    改变缓冲区
    双写缓冲区
    撤消日志

其中一些可以在Percona Server上配置,以避免变得太大。例如,您可以使用innodb_ibuf_max_size为更改缓冲区设置最大大小,或者使用innodb_doublewrite_file将doublewrite缓冲区存储在单独的文件中。

在MySQL 5.6中,您还可以创建外部UNDO表空间,以便它们位于自己的文件中,而不是存储在ibdata1中。文档链接:http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html#innodb-undo-tablespace

What is causing the ibdata1 to grow that fast?
当出现MySQL问题时、通畅需要运行的第一个命令是:

SHOW ENGINE INNODB STATUSG

这将展示非常有价值的信息。开始从检查TRANSACTIONS部分,发现:

---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天前创建的一个非常古老的交易。状态为ACTIVE,这意味着InnoDB已创建数据快照,因此需要在undo中维护旧页面,以便能够在启动事务后提供数据库的一致视图。如果数据库被大量写入任务,则意味着存储了大量的撤消页面。

如果找不到任何长时间运行的事务,还可以监控INNODB STATUS中的另一个变量,即“History list length(历史记录列表长度)”。它显示待处理的清除操作的数量。在这种情况下,问题通常是由于清除线程(或旧版本中的主线程)无法以与它们进入的速度相同的速度处理撤消记录。

How can I check what is being stored in the ibdata1?
不幸的是,MySQL没有提供ibdata1共享表空间上存储内容的信息,但有两个工具非常有用。首先是由Mark Callaghan制作并在此错误报告中发表的innochecksum的修改版本。http://bugs.mysql.com/bug.php?id=57611

它很容易使用:

 ./innochecksum /var/lib/mysql/ibdata1
0 bad checksum
13 FIL_PAGE_INDEX
19272 FIL_PAGE_UNDO_LOG
230 FIL_PAGE_INODE
1 FIL_PAGE_IBUF_FREE_LIST
892 FIL_PAGE_TYPE_ALLOCATED
2 FIL_PAGE_IBUF_BITMAP
195 FIL_PAGE_TYPE_SYS
1 FIL_PAGE_TYPE_TRX_SYS
1 FIL_PAGE_TYPE_FSP_HDR
1 FIL_PAGE_TYPE_XDES
0 FIL_PAGE_TYPE_BLOB
0 FIL_PAGE_TYPE_ZBLOB
0 other
3 max index_id 全部的 20608 中有 19272 个撤销日志页。这占用了表空间的 93%。

检查表空间内容的第二种方法是由Jeremy Cole制作的InnoDB Ruby工具。它是检查InnoDB内部的更高级工具。例如,我们可以使用space-summary参数来获取包含每个页面及其数据类型的列表。我们可以使用标准的Unix工具来获取UNDO_LOG页面的数量:

 innodb_space -f /var/lib/mysql/ibdata1 space-summary | grep UNDO_LOG | wc -l
19272

尽管这种特殊的情况下,innochedcksum 更快更容易使用,但是推荐使用杰里米的工具去了解更多的 InnoDB 内部的数据分布及其内部结构。
好,现在知道问题所在了。下一个问题:

How can I solve the problem?
这个问题的答案很简单。如果仍然可以提交该查询,请执行此操作。如果不是,将不得不杀死线程以启动回滚过程。这将阻止ibdata1的增长,但显然某个软件有一个错误或有人犯了错误。既然已经知道如何确定问题所在,所以需要使用自己的调试工具或常规查询日志查找导致问题的人员或原因。

如果问题是由清除线程引起的,那么解决方案通常是升级到更新的版本,可以使用专用的清除线程而不是主线程。有关以下文档链接的更多信息。http://dev.mysql.com/doc/innodb/1.1/en/innodb-improved-purge-scheduling.html

Is there any way to recover the used space?
不,至少在一个简单快捷的方式是不可能的。 InnoDB表空间从未缩小
请参阅James Day最近更新的以下10年的错误报告http://bugs.mysql.com/bug.php?id=1341

删除某些行时,页面将标记为已删除,以便稍后重复使用,但永远不会恢复该空间。唯一的方法是使用新的ibdata1启动数据库。要做到这一点,需要使用mysqldump进行完整的逻辑备份。然后停止MySQL并删除所有数据库,ib_logfile *和ibdata *文件。再次启动MySQL时,它将创建一个新的共享表空间。然后,恢复逻辑转储

Summary
当ibdata1文件在MySQL中增长太快时,通常是Mysql长时间运行被遗忘的事务引起的。尝试尽快解决问题(提交或终止事务),因为如果没有缓慢的mysqldump进程,将无法回收浪费的磁盘空间。

还建议监视数据库以避免这类问题。MySQL监控插件包含一个Nagios脚本,如果发现运行的事务太旧,可以提醒。

本文出处:https://www.percona.com/blog/2013/08/20/why-is-the-ibdata1-file-continuously-growing-in-mysql/

Mysql ibdata1简述的更多相关文章

  1. python py_innodb_page_info.py -v /usr/local/var/mysql/ibdata1

    mylib.py #encoding=utf-8 import os import include from include import * TABLESPACE_NAME='D:\\mysql_d ...

  2. mysql ibdata1

    ibdata1是什么? Mysql ibdata1即Innodb data1缩写,是innodb引擎的表空间,用于存放 数据字典Data dictionary:  只读的表,存储对象的相关信息,如占用 ...

  3. [转]MySql ibdata1文件太大如何缩小

    From : http://blog.chinaunix.net/uid-24373487-id-4223322.html 原文地址:MySql ibdata1文件太大如何缩小 作者:emailwht ...

  4. MySQL ibdata1文件迁移

    目的:主机系统/var目录快满了,经查询最大的文件是mysql的ibdata1文件,有17G大小,故需要迁移这个文件到其他目录下,以释放/var目录空间. 1.先备份下数据库是个好习惯 # mysql ...

  5. MySQL ibdata1撑爆占满磁盘空间

    MySQL主从由于ibdata1占满磁盘空间-->主从失效 因为设置了innodb_file_per_table = 1,ibdata1依旧撑爆占满磁盘空间 主从断的时候,IO线程在连接,SQL ...

  6. mysql ibdata1损坏

    机房一台服务器上的mysql运行一段时间了,突然出现了一个很奇怪的现象:重启后无法恢复了!准确情况是:启动mysql后随即就又关闭了. 查看mysql错误日志如下: 160920 22:41:41 m ...

  7. MySQL索引简述

    文章归属:http://feiyan.info/16.html,我想自己总结,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼 ...

  8. Mysql分区简述

    1. 数据量大的时候 mysql分表非常常用,但是mysql还可以分区. 2. 分区就是把同一张表放在不同的磁盘文件上, 当查询的时候首先定位是哪个分区(查询的时候一定要用到分区的key) 3. 分区 ...

  9. MySQL引擎简述

    MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另外两种类型IN ...

随机推荐

  1. artTemplate-优秀的前端模板引擎

    artTemplate-优秀的前端模板引擎 1.html中引入artTemplate的js文件: <script type="text/javascript" src=&qu ...

  2. sql 递归树

    with CTE as ( -->Begin 一个定位点成员 select ID, PersonName,ParentID,cast(PersonName as nvarchar(max)) a ...

  3. markdown编辑器(颜色、大小、字体)

    <font face="黑体">我是黑体字</font> <font face="微软雅黑">我是微软雅黑</font ...

  4. CART树

    算法概述 CART(Classification And Regression Tree)算法是一种决策树分类方法. 它采用一种二分递归分割的技术,分割方法采用基于最小距离的基尼指数估计函数,将当前的 ...

  5. lintcode-->翻转字符串

    给定一个字符串,逐个翻转字符串中的每个单词. 您在真实的面试中是否遇到过这个题? Yes 说明 单词的构成:无空格字母构成一个单词 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包 ...

  6. CFLAGS CPPFLAGS CPPFLAGS 区别

    CPPFLAGSC预处理器参数.( C 和 Fortran 编译器也会用到). CXXFLAGSC++语言编译器参数. CFLAGSC语言编译器参数.

  7. java字符串应用之表达式解析器

    一.表达式的组成    1.数字    2.运算符:+ - / * ^ % =    3.圆括号    4.变量二.运算符优先级    由高到低分别为:+-(正负号).^.*/%.+-.=    优先 ...

  8. C语言——<计算>_较大两个数相乘

    例题:9876543210*1234567890 的乘积 分析:正常的数据结构已经无法满足这么大的数相乘的结果.只能使用数组来进行操作. 1.两个数都用字符数组来接收. 2.接收后,因为每一位要乘以另 ...

  9. Extjs相关知识点梳理

      store是一个为Ext器件提供record对象的存储容器,行为和属性都很象数据表 方法:不列举继承来的方法 Store( Object config ) 构造,config定义为{ autoLo ...

  10. [转]ASP.NET MVC4中@model使用多个类型实例的方法

    本文转自:http://blog.csdn.net/hulihui/article/details/48199897 有时需要在ASP.NET MVC4的视图的@model中使用多个类型的实例,.NE ...