6.6.1 InnoDB 文件离线校验和实用程序
ibd2sdi 是一个从 InnoDB 表空间文件中提取序列化字典信息(SDI)的实用程序。SDI 数据存在于所有持久 InnoDB 表空间文件中。
ibd2sdi 可以在文件-每-表 表空间文件(*.ibd
文件)、一般表空间 文件(*.ibd
文件)、系统表空间 文件(ibdata*
文件)和数据字典表空间(mysql.ibd
)上运行。但是,不支持在临时表空间或回滚表空间上使用该实用程序。
ibd2sdi 可以在运行时或服务器离线时使用。在 DDL 操作、ROLLBACK
操作和 SDI 相关的undo日志清理操作中,可能会出现短暂时间内 ibd2sdi 无法读取表空间中的 SDI 数据。
ibd2sdi 对指定表空间执行未提交的读取操作。redo日志和undo日志不被访问。
使用 ibd2sdi 工具时,需要遵循以下格式:
ibd2sdi [options] file_name1 [file_name2 file_name3 ...]
ibd2sdi 支持多文件表空间,如 InnoDB
系统表空间,但不能同时运行在多个表空间上。对于多文件表空间,需要指定每个文件:
ibd2sdi ibdata1 ibdata2
多文件表空间的文件必须按升序页号排序。如果两个相继文件具有相同的space ID,后一个文件必须从前一个文件最后一页号+1开始。
ibd2sdi 将 SDI(包含 id、type 和数据字段)输出到 JSON
格式。
ibd2sdi 支持以下选项:
-
--help
,-h
Command-Line Format --help
Type 布尔值 Default Value false
显示帮助信息并退出。例如:
Usage: ./ibd2sdi [-v] [-c <strict-check>] [-d <dump file name>] [-n] filename1 [filenames] See http://dev.mysql.com/doc/refman/8.4/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 http://dev.mysql.com/doc/refman/8.4/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
Command-Line Format --version
Type 布尔值 Default Value false
显示版本信息并退出。例如:
ibd2sdi Ver 8.4.0 for Linux on x86_64 (Source distribution)
-
--debug[=
,debug_options
]-# [
debug_options
]Command-Line Format --debug=options
Type 字符串 Default Value [none]
打印 debug 日志。关于 debug 选项,请参阅 第7.9.4节,“DBUG 包”。
ibd2sdi --debug=d:t /tmp/ibd2sdi.trace
只有在使用
WITH_ DEBUG
构建 MySQL 时,这个选项才可用。Oracle 提供的 MySQL 发行版 binaries 不是使用这个选项构建的。 -
--dump-file=
,-d
Command-Line Format --dump-file=file
Type 文件名 Default Value [none]
将序列化字典信息(SDI) Dump 到指定的 dump 文件中。如果不指定 dump 文件,表空间 SDI 将被 Dump 到
stdout
中。ibd2sdi --dump-file=file_name ../data/test/t1.ibd
-
--skip-data
,-s
Command-Line Format --skip-data
Type 布尔值 Default Value false
跳过从序列化字典信息(SDI)中检索
data
字段值,只检索id
和type
字段值,这些字段是 SDI 记录的主键。$> ibd2sdi --skip-data ../data/test/t1.ibd ["ibd2sdi" , { "type": 1, "id": 330 } , { "type": 2, "id": 7 } ]
-
--id=
,#
-i
#
Command-Line Format --id=#
Type 整数 Default Value 0
从指定的表或表空间对象ID中检索序列化字典信息(SDI)。一个对象ID对于对象类型是唯一的。表和表空间对象IDs也可以在数据字典表
mysql.tables
和mysql.tablespace
中的id
列中找到。关于数据字典表的信息,请见第16.1节,“数据字典schema”.$> 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
#
Command-Line Format --type=#
Type 枚举 Default Value 0
Valid Values 1
2
从指定的对象类型中检索序列化字典信息(SDI)。SDI为表(type=1)和表空间(type=2)对象提供。
以下示例显示了对
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对默认值元数据的处理方式,使用ibd2sdi输出可以看到某个表列的默认值,即使该列未使用
DEFAULT
定义。考虑以下语句创建的两个表,位于名为i
的数据库中:CREATE TABLE t1 (c VARCHAR(16) NOT NULL); CREATE TABLE t2 (c VARCHAR(16) NOT NULL DEFAULT "Sakila");
使用ibd2sdi,我们可以看到列
c
的default_值
非空且在两个表中都被填充到长度,类似这样:$> 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="
使用ibd2sdi输出可能更容易使用JSON-aware工具,如jq,如以下所示:
$> 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 Internals文档。
-
--strict-check
,-c
Command-Line Format --strict-check=algorithm
Type 枚举 Default Value crc32
Valid Values 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
选项,validation将对非严格的innodb
、crc32
和none
校验和进行。 -
--no-check
,-n
Command-Line Format --no-check
Type 布尔值 Default Value false
跳过读取页面时的校验和验证。
ibd2sdi --no-check ../data/test/t1.ibd
-
--pretty
,-p
Command-Line Format --pretty
Type 布尔值 Default Value false
将SDI数据输出到JSON格式的可读性美化中。默认启用。如果禁用,SDI将不可读,但其大小会减小。使用
--skip-pretty
来禁用。ibd2sdi --skip-pretty ../data/test/t1.ibd