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. springboot设置静态资源不拦截的方法

    springboot设置静态资源不拦截的方法 springboot不拦截静态资源需配置如下的类: import org.springframework.context.annotation.Confi ...

  2. gcc 编译问题

    一般情况一句话即可: gcc -o fuck fuck.c ./fuck 直接运行了 问题 1. 报错 ld 未找到 此时,gcc编译得分布来,并且指定特定的ld gcc -c  1.c //会在目录 ...

  3. 《Mysql技术内幕,Innodb存储引擎》——事物

    事物 事物中的操作要么都成功要么都不做,这是事物的目的,也是事物模型与文件系统的重要特征之一. 扁平事物(Flat Transactions) 所有操作都处于同一层次,要么都做要么都执行要么都回滚,无 ...

  4. PHP 运行相关概念

    web server.cgi.cgi程序.fast-cgi.php-fpm.php-cgi

  5. PTA (Advanced Level) 1021 Deepest Root

    Deepest Root A graph which is connected and acyclic can be considered a tree. The hight of the tree ...

  6. select样式

    select设置了宽高: 样式是这样的: 如果在select的标签内部加入size="2"    size的值只要大于1,select的设置大小会起作用 样式是这样的: 3.点击中 ...

  7. 熟悉一下oncontextmenu事件的知识

    定义和使用 只要点击鼠标右键,就触发oncontextmenu事件并打开上下文菜单. 需要注意的是:所有主流浏览器都支持oncontextmenu事件,但其中的contextmenu元素只有FireB ...

  8. hadoop学习笔记(十):MapReduce工作原理(重点)

    一.MapReduce完整运行流程 解析: 1 在客户端启动一个作业. 2 向JobTracker请求一个Job ID. 3 将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包 ...

  9. 关于Win8快速启动失效解决

    注册表修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下BootExecute值为  autocheck空格 ...

  10. api.openWin

    打开window 若 window 已存在,则会把该 window 显示到最前面,如果 url 和之前的 url 有变化,或者 reload 为 true 时,页面会刷新,但是该 window 里面已 ...