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. (01)JVM-内存三大核心区域以及分析

    package org.burning.sport.jvm; /** *  从JVM调用的角度分析Java程序对内存空间的使用, * 当JVM进程启动的时候,会从类加载器路径中找到包含main方法的入 ...

  2. [转]ASP.NET MVC 4 最佳实践宝典

    原文:http://www.cnblogs.com/sonykings/archive/2013/05/30/3107531.html ASP.NET MVC最佳实践 本文档提供了一套旨在帮助创建最佳 ...

  3. springboot-11-servlet, listener, fitlter的添加

    springboot中添加servlet, filter, listener有2种方式: 代码注册servlet 和自动注解注册(在使用druid监控有使用过) 代码注册通过ServletRegist ...

  4. POJ 1062 昂贵的聘礼(枚举限制条件——Dijkstra算法)

    题目: 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:& ...

  5. Node.js其他模块

    清明假期过得挺快,3天说没就没了,天热了今天把房间打扫了一下,看着挺舒心的.周六了解了下进程管理的Process模块,由于进程管理知识也比较多,今天先把其他的一些模块了解一下,进程管理这块以后慢慢学. ...

  6. vue-webpack 做出来的项目部署到服务器上,点开是空白页(我这里把项目发布到git上)

    总结1: 从网上下的很多demo,用npm run dev 就可以启动项目,比如:vue-cli,为什么?因为vue-cli自动帮我们安装了express服务器. 总结2: npm run dev 是 ...

  7. 封装RabbitMQ.NET Library 的一点经验总结 转载

    这篇文章内容会很短,主要是想给大家分享下我最近在做一个简单的rabbitmq客户端类库的封装的经验总结,说是简单其实一点都不简单.为了节省时间我主要按照Library的执行顺序来介绍,在你看来这里仅仅 ...

  8. 解决Tomcat出现内存溢出的问题

    Tomcat服务器出现java.lang.OutOfMemoryError:Java heap space异常 1.可能是程序错误,比如:程序陷入死循环 2.堆内存太小 一般情况下,java创建的对象 ...

  9. 简单的自定义Session

    有关Session.Cookie机制建议参考文章:CookieSession机制详解,写的很详细,不再赘述 本篇文章通过一个简单的案例揭秘Session机制以及和Cookie的区别和联系: 服务器端代 ...

  10. [日常] Go语言圣经前言

    https://books.studygolang.com/gopl-zh/ go语言圣经 1.Go语言有时候被描述为“C类似语言”,或者是“21世纪的C语言”. 2.Go语言中和并发编程相关的特性是 ...