ibd2sdi 是一款用于从 InnoDB
表空间文件中提取 序列化字典信息 (SDI) 的实用程序。SDI 数据存在于所有持久性 InnoDB
表空间文件中。
ibd2sdi 可以运行在 每个表一个文件 表空间文件 (*.ibd
文件)、通用表空间 文件 (*.ibd
文件)、系统表空间 文件 (ibdata*
文件) 和数据字典表空间 (mysql.ibd
) 上。它不支持用于临时表空间或撤销表空间。
ibd2sdi 可以在运行时或服务器处于离线状态时运行。在执行 DDL 操作、ROLLBACK
操作和与 SDI 相关的撤销日志清除操作期间,可能会有一段短暂的时间,ibd2sdi 无法读取存储在表空间中的 SDI 数据。
ibd2sdi 对指定表空间执行 SDI 的未提交读取。不会访问重做日志和撤销日志。
像这样调用 ibd2sdi 实用程序
ibd2sdi [options] file_name1 [file_name2 file_name3 ...]
ibd2sdi 支持多文件表空间,如 InnoDB
系统表空间,但它一次不能运行在多个表空间上。对于多文件表空间,指定每个文件
ibd2sdi ibdata1 ibdata2
多文件表空间的文件必须按升序页号排序指定。如果两个连续的文件具有相同的空间 ID,则后面的文件必须从前一个文件的最后一个页号 + 1 开始。
ibd2sdi 以 JSON
格式输出 SDI(包含 id、type 和 data 字段)。
ibd2sdi 选项
ibd2sdi 支持以下选项
--help
,-h
命令行格式 --help
类型 布尔值 默认值 false
显示帮助消息并退出。例如
Usage: ./ibd2sdi [-v] [-c <strict-check>] [-d <dump file name>] [-n] filename1 [filenames] See https://dev.mysqlserver.cn/doc/refman/9.0/en/ibd2sdi.html for usage hints. -h, --help Display this help and exit. -v, --version Display version information and exit. -#, --debug[=name] Output debug log. See https://dev.mysqlserver.cn/doc/refman/9.0/en/dbug-package.html -d, --dump-file=name Dump the tablespace SDI into the file passed by user. Without the filename, it will default to stdout -s, --skip-data Skip retrieving data from SDI records. Retrieve only id and type. -i, --id=# Retrieve the SDI record matching the id passed by user. -t, --type=# Retrieve the SDI records matching the type passed by user. -c, --strict-check=name Specify the strict checksum algorithm by the user. Allowed values are innodb, crc32, none. -n, --no-check Ignore the checksum verification. -p, --pretty Pretty format the SDI output.If false, SDI would be not human readable but it will be of less size (Defaults to on; use --skip-pretty to disable.) Variables (--variable-name=value) and boolean options {FALSE|TRUE} Value (after reading options) --------------------------------- ---------------------------------------- debug (No default value) dump-file (No default value) skip-data FALSE id 0 type 0 strict-check crc32 no-check FALSE pretty TRUE
--version
,-v
命令行格式 --version
类型 布尔值 默认值 false
显示版本信息并退出。例如
ibd2sdi Ver 9.0.0 for Linux on x86_64 (Source distribution)
--debug[=
,debug_options
]-# [
debug_options
]命令行格式 --debug=options
类型 字符串 默认值 [none]
打印调试日志。有关调试选项,请参阅 第 7.9.4 节 “DBUG 包”。
ibd2sdi --debug=d:t /tmp/ibd2sdi.trace
此选项仅在使用
WITH_DEBUG
构建 MySQL 时可用。Oracle 提供的 MySQL 发行版二进制文件 不 使用此选项构建。--dump-file=
,-d
命令行格式 --dump-file=file
类型 文件名 默认值 [none]
将序列化字典信息 (SDI) 转储到指定转储文件中。如果未指定转储文件,则表空间 SDI 会转储到
stdout
。ibd2sdi --dump-file=file_name ../data/test/t1.ibd
--skip-data
,-s
命令行格式 --skip-data
类型 布尔值 默认值 false
跳过从序列化字典信息 (SDI) 中检索
data
字段值,只检索id
和type
字段值,它们是 SDI 记录的主键。$> ibd2sdi --skip-data ../data/test/t1.ibd ["ibd2sdi" , { "type": 1, "id": 330 } , { "type": 2, "id": 7 } ]
--id=
,#
-i
#
命令行格式 --id=#
类型 整数 默认值 0
检索与指定表或表空间对象 ID 匹配的序列化字典信息 (SDI)。对象 ID 对对象类型是唯一的。表和表空间对象 ID 也可以在
mysql.tables
和mysql.tablespace
数据字典表中的id
列中找到。有关数据字典表的信息,请参阅 第 16.1 节 “数据字典模式”。$> ibd2sdi --id=7 ../data/test/t1.ibd ["ibd2sdi" , { "type": 2, "id": 7, "object": { "mysqld_version_id": 80003, "dd_version": 80003, "sdi_version": 1, "dd_object_type": "Tablespace", "dd_object": { "name": "test/t1", "comment": "", "options": "", "se_private_data": "flags=16417;id=2;server_version=80003;space_version=1;", "engine": "InnoDB", "files": [ { "ordinal_position": 1, "filename": "./test/t1.ibd", "se_private_data": "id=2;" } ] } } } ]
--type=
,#
-t
#
命令行格式 --type=#
类型 枚举 默认值 0
有效值 1
2
检索与指定对象类型匹配的序列化字典信息 (SDI)。为表 (type=1) 和表空间 (type=2) 对象提供 SDI。
此示例显示了
test
数据库中表空间ts1
的输出$> ibd2sdi --type=2 ../data/test/ts1.ibd ["ibd2sdi" , { "type": 2, "id": 7, "object": { "mysqld_version_id": 80003, "dd_version": 80003, "sdi_version": 1, "dd_object_type": "Tablespace", "dd_object": { "name": "test/ts1", "comment": "", "options": "", "se_private_data": "flags=16417;id=2;server_version=80003;space_version=1;", "engine": "InnoDB", "files": [ { "ordinal_position": 1, "filename": "./test/ts1.ibd", "se_private_data": "id=2;" } ] } } } ]
由于
InnoDB
处理默认值元数据的方式,即使没有使用DEFAULT
定义,在给定表列的 ibd2sdi 输出中也可能会出现非空默认值。考虑使用以下语句在名为i
的数据库中创建的两个表CREATE TABLE t1 (c VARCHAR(16) NOT NULL); CREATE TABLE t2 (c VARCHAR(16) NOT NULL DEFAULT "Sakila");
使用 ibd2sdi,我们可以看到列
c
的default_value
不为空,并且实际上在两个表中都被填充到指定的长度,如下所示$> ibd2sdi ../data/i/t1.ibd | grep -m1 '\"default_value\"' | cut -b34- | sed -e s/,// "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAA=" $> ibd2sdi ../data/i/t2.ibd | grep -m1 '\"default_value\"' | cut -b34- | sed -e s/,// "BlNha2lsYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAA="
使用像 jq 这样的 JSON 感知工具可以更容易地检查 ibd2sdi 的输出,如下所示
$> ibd2sdi ../data/i/t1.ibd | jq '.[1]["object"]["dd_object"]["columns"][0]["default_value"]' "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAA=" $> ibd2sdi ../data/i/t2.ibd | jq '.[1]["object"]["dd_object"]["columns"][0]["default_value"]' "BlNha2lsYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAA="
有关更多信息,请参阅 MySQL 内部文档。
-
命令行格式 --strict-check=algorithm
类型 枚举 默认值 crc32
有效值 crc32
innodb
none
指定用于验证读取页面校验和的严格校验和算法。选项包括
innodb
、crc32
和none
。在本例中,指定了
innodb
校验和算法的严格版本ibd2sdi --strict-check=innodb ../data/test/t1.ibd
在本例中,指定了
crc32
校验和算法的严格版本ibd2sdi -c crc32 ../data/test/t1.ibd
如果您没有指定
--strict-check
选项,则会针对非严格的innodb
、crc32
和none
校验和执行验证。 --no-check
,-n
命令行格式 --no-check
类型 布尔值 默认值 false
跳过对读取页面的校验和验证。
ibd2sdi --no-check ../data/test/t1.ibd
--pretty
,-p
命令行格式 --pretty
类型 布尔值 默认值 false
以 JSON 美化打印格式输出 SDI 数据。默认情况下启用。如果禁用,则 SDI 不可读,但大小更小。使用
--skip-pretty
禁用。ibd2sdi --skip-pretty ../data/test/t1.ibd