ANALYZE_TOOLS
分析工具 #
通过工具进行分析,结合书中的概念学习innodb存储引擎。
.frm 解析工具如下:
dbsake(a(s)wiss-(a)rmy-(k)nif(e) for MySQL), github
mysqlfrm, download archive, mysql-utilities pdf
frm-parser
.ibd 解析工具有:
innodb-java-reader
innodb_rubyfrm-parser #
Note
开源仓库
使用frm解析工具对/tmp/mysql/demos/record_format_demo.frm
,进行分析,解析结果如下。Caution
1). 对代码稍作修改,使用cmake构建,修改文件位置为绝对路径,
show_tables()
,show_db()
函数中的文件位置也需要改变。dbsake #
Note
参考 官方文档进行安装测试。自定义安装位置,比如:
cd /usr/local/bin
curl -s get.dbsake.net > dbsake
chmod u+x dbsake
dbsake -?
mysql-utilities #
Note
开源仓库
环境搭建,项目语法采用的是python2的,所以需要先安装 python2, 下载页面
如果使用--server
参数的话,还得安装python数据库驱动。根据package.py
中的安装描述,需要安装Connector/Python 1.0.9
, 官方下载页面,但是我启动的时候会报如下错误:
ERROR: The MYSQL Connector/Python module was found but it is either not properly installed or it is an old version. MySQL Utilities requires Connector/Python version > ‘(1, 2, 1)’. Download and install Connector/Python from http://dev.mysql.com.
根据错误信息从新下载1.2.2版本: mysql-connector-python-1.2.2.zipinnodb-java-reader #
Note
开源仓库
通过开源innodb文件java解析框架,对数据文件/tmp/mysql/demos/record_format_demo.ibd
进行分析。例如如下获取所有行记录。Caution
1). 当前使用的版本为 9866b27
2). 自定义了一些代码,比如GenericRecord#toString
,修改一些错误逻辑:TableDefUtil#handleCharset
方法中判断应该是indexof > -1
,而不是indexof > 0
,另外扩展了自定义逻辑等。innodb_ruby #
Note
开源仓库
使用innodb_ruby工具进行文件/tmp/mysql/ibdata1
分析:比如命令: (需要注意: 截图中使用脚本执行的 innodb_space 命令,如果是工具的话需要转换,如下)innodb_space -s /tmp/mysql/ibdata1 -T demos/record_format_demo space-page-type-regions
innodb_space -s /tmp/mysql/ibdata1 -T demos/record_format_demo -p 3 page-records
innodb_ruby通过gem在线安装 #
Warning
参考 官方文档安装完成后发现使用不了
innodb_space
命令。可能多个环境造成的。排查过程如下:
1). 确认安装:首先,再次确认innodb_ruby是否已成功安装。可以在命令行输入以下命令来查看:gem list innodb_ruby
2). 查找可执行文件位置:找到gem安装的innodb_space可执行文件的位置。通常,gem的可执行脚本会被安装到Ruby的bin目录下:gem environment | grep "EXECUTABLE DIRECTORY"
3). 添加到系统路径即可。可以写入.bash_profile
或者临时添加命令export PATH="/usr/local/lib/ruby/gems/3.3.0/bin:$PATH
innodb_ruby官方数据还原方法 #
1). 从 innodb_ruby代码仓库克隆项目到本地,里面包含一些样例数据,比如 compact行格式数据库。
2). 因为数据是mysql内部文件的形式存放的,所以我们需要用一个mysql服务器来驱动这些数据,此处使用docker容器来处理,将这些文件挂载到容器中,达到还原的效果。
目的:与innodb_space
工具分析出的结论作适当对比。启动服务器:
在docker环境中使用如下命令启动:
docker run -d -p 3338:3338 --rm -e MYSQL_ROOT_PASSWORD='compact4321' -v /Users/stevenobelia/Documents/project_rubymine_test/innodb_ruby/spec/data/sakila/compact:/data/mysql --name mysql-5.6.49-innodb_ruby mysql:5.6.49 --datadir=/data/mysql --port=3338
Caution
1). MYSQL_ROOT_PASSWORD对应的密码可以随便给一个大于6位的就行,用于客户端链接。
2)./Users/stevenobelia/Documents/project_rubymine_test/innodb_ruby/spec/data/sakila/compact
指的是克隆下来项目中的数据路径,也就是 mysql 的 datadir客户端连接测试:
可以使用下列命令进行客户端连接测试:
docker run -it --rm --network=host --name mysql-client -e LANG="C.UTF-8" mysql:5.6.49 mysql -h 127.0.0.1 -u root -P 3338 -p
输入如上compact4321
密码登入。验证record_dump:
按照wiki中的 record_dump 命令
innodb_space -s ibdata1 -T sakila/film -p 7 -R 128 record-dump
dump 出的结果如下左,对比查询出的数据记录如下右。