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 ,你可能需要重新生成这个文件来减小磁盘空间占用。