mysql 分析 ibdata1 数据

因为这个文件占用了 133G 而测试环境总空间也就197G不到 频繁的磁盘爆满导致服务不可用。
我不高兴!

环境

  • centos 7.5
  • ruby 2
  • innodb_ruby 0.9.16
  • mysql 5.5

安装 innodb_ruby 所需要的环境

安装ruby (有镜像)

yum install ruby

安装ruby之后 会有 gem 软件包管理程序 我们还需要用它来安装一些依赖

安装 innodb_ruby (有网络)

gem install innodb_ruby

会自动下载软件包和软件依赖包并安装

安装 innodb_ruby (无网络)

下载 innodb_ruby 所需要的依赖

因为我这里测试环境是没有网络的 所以 一些软件包依赖需要手动去下载

到这里 -> https://rubygems.org/gems/ 查找依赖包

然后下载所需要的依赖 文件是.gem结尾

安装

gem install bindata-2.4.4.gem

这只是个例子 缺什么下什么

下载 innodb_ruby 源码 并传输到服务器上

地址 : https://github.com/jeremycole/innodb_ruby

因为没有release 所以你需要git clone

打包传到服务器上 解压

执行分析

因为这里是无网络安装的 所以 我就直接在源码目录下执行了。
如果你是有网安装的 那么你应该可以直接执行innodb_space 的命令

首先 进入解压好的源码目录 cd /tmp/innodb_ruby

执行

ruby -r rubygems -I lib bin/innodb_space -f /app/mysql/data/ibdata1 space-page-type-summary

-f 后面跟的是你数据库的ibdata1文件

如果运行有报错

/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- bindata (LoadError)

像这样的 就是少了依赖 它不能load什么 就找它的gem文件 然后通过gem安装就可以了

TIPS

这个 133G的文件 执行了3个多小时 非常慢,建议执行前先看一下大小 预估一下时间。

执行结果像是这样

BLOB                3797246     43.56       Uncompressed BLOB   
UNDO_LOG            2984983     34.25       Undo log            
INDEX               1630804     18.71       B+Tree index        
ALLOCATED           266825      3.06        Freshly allocated   
INODE               34321       0.39        File segment inode  
IBUF_FREE_LIST      992         0.01        Insert buffer free list
XDES                527         0.01        Extent descriptor   
IBUF_BITMAP         527         0.01        Insert buffer bitmap
SYS                 189         0.00        System internal     
TRX_SYS             1           0.00        Transaction system header
FSP_HDR             1           0.00        File space header

可以看到 其实是blob占比是比较大的,仔细再找找就知道是什么占用了这些空间。

BTW : mysql的ibdata1是不会减小的 如果这个文件过大 比如大量的UNDO_LOG page ,你可能需要重新生成这个文件来减小磁盘空间占用。