Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  ibd2sdi — InnoDB Tablespace SDI Extraction Utility

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 字段值,只检索 idtype 字段值,这些字段是 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.tablesmysql.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,我们可以看到列cdefault_值非空且在两个表中都被填充到长度,类似这样:

    $> 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

    指定严格的校验和算法,以验证读取页面时的校验和。可选项包括innodbcrc32none

    在这个示例中,指定了严格版本的innodb校验和算法:

    ibd2sdi --strict-check=innodb ../data/test/t1.ibd

    在这个示例中,指定了严格版本的crc32校验和算法:

    ibd2sdi -c crc32 ../data/test/t1.ibd

    如果您不指定--strict-check选项,validation将对非严格的innodbcrc32none校验和进行。

  • --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