如何通过文件解析MySQL的表结构

文章目录

    • 一、MySQL Utilities-mysqlfrm
    • 二、InnoDB表空间SDI提取程序ibd2sdi

一、MySQL Utilities-mysqlfrm

  恢复工具,读取frm文件并从中找到 表、 视图定义语句
注意:不能读取到外键约束和自增长序列

再生实例模式
  指定-server选项连接到已经安装的实例。该过程不会改变原始frm文件,指定–port选项给再生实例使用,该端口不能与现有端口冲突,读取完frm文件后,再生实例会关闭,所有临时文件将被删除

[root@zijie data]# mysqlfrm --server=master57 --user=root --port=3310  /data/mysql57/data/test/t2.frm --show-stat
# Source on 127.0.0.1: ... connected.
# Spawning server with --user=root.
# Starting the spawned server on port 3310 ... done.
# Reading .frm files
#
# Reading the t2.frm file.
#
# CREATE statement for /data/mysql57/data/test/t2.frm:
#

CREATE TABLE `test`.`t2` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

# File Statistics:
#         Last Modified : Thu Jul 30 15:27:19 2020
#         Creation Time : Thu Jul 30 15:27:19 2020
#         Last Accessed : Thu Jul 30 15:27:19 2020
#                  Mode : 33184
#                  Size : 8586

# Table Statistics:
#                Engine : HEAP
#           frm Version : 10
#         MySQL Version : 5.7.29
#      frm File_Version : 5
#               IO_SIZE : 4096
#  Def Partition Engine : None

#...done.

诊断模式:
  指定–diagnostic选项,byte-by-byte读取frm文件,尽可能多的恢复信息,该模式不能校验字符集

[root@zijie data]# mysqlfrm --diagnostic /data/mysql57/data/test/t2.frm --show-stats
# WARNING: Cannot generate character set or collation names without the --server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for /data/mysql57/data/test/t2.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:

CREATE TABLE `test`.`t2` (
  `id` int(11) NOT NULL,
  `name` varchar(80) DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB;

# File Statistics:
#         Last Modified : Thu Jul 30 14:24:12 2020
#         Creation Time : Thu Jul 30 14:24:12 2020
#         Last Accessed : Thu Jul 30 14:24:12 2020
#                  Mode : 33184
#                  Size : 8586

# Table Statistics:
#                Engine : INNODB
#           frm Version : 10
#         MySQL Version : 5.7.29
#      frm File_Version : 5
#               IO_SIZE : 4096
#  Def Partition Engine : None

#...done.

选项
–quiet 仅显示create语句和警告、错误信息
–show-stats 统计frm文件信息

利用frm和ibd恢复数据
  在某此情况下,数据库崩溃或者数据丢失,无法启动;除了常规的备份恢复,binlog闪回外,还可以利用备份的或者磁盘上的frm和ibd文件恢复数据,因为数据库存储的数据实际上还是存储在文件里的

myisam引擎:直接复制这三个文件即可使用,不需要恢复
xxx.frm 表结构文件
xxx.MYD 数据文件
xxx.MYI 索引文件
innodb引擎: innodb某些元数据是存储在 ibdata1文件中的
xxx.frm 表结构文件 -> 使用mysqlfrm获取
xxx.ibd 数据和索引文件 -> 覆盖文件

利用frm和ibd恢复数据操作流程

第一步:利用mysqlfrm工具恢复表结构
第二步:创建该表
第三步:卸载表空间
第四步:复制ibd文件
第五步:导入表空间
第六步:检查数据是否已恢复

二、InnoDB表空间SDI提取程序ibd2sdi

  MySQL8里没有了frm文件,但是官方提供了更好的支持-InnoDB表空间SDI提取程序ibd2sdi。
具体属性根据解析内容做过滤即可

[root@zijie ~]# ibd2sdi /data/mysql8/data/test/t1#p#p_1.ibd  | egrep 'name|column_type_utf8'
        "name": "t1",
                "name": "id",
                "column_type_utf8": "int unsigned",
                "name": "name",
                "column_type_utf8": "varchar(32)",
                "name": "age",
                "column_type_utf8": "int",
                "name": "create_time",
                "column_type_utf8": "datetime",
                "name": "mondify_time",
                "column_type_utf8": "timestamp",
                "name": "virjson",
                "column_type_utf8": "json",
                "name": "dounum",
                "column_type_utf8": "double",
                "name": "decnum",
                "column_type_utf8": "decimal(10,4)",
                "name": "flodum",
                "column_type_utf8": "float",
                "name": "comment",
                "column_type_utf8": "text",
                "name": "DB_TRX_ID",
                "column_type_utf8": "",
                "name": "DB_ROLL_PTR",
                "column_type_utf8": "",
                "name": "PRIMARY",
                "name": "idx_createtime",
                "name": "idx_mondify_time",
                "name": "idx_asd",
                "name": "idx_cremo",
                "name": "idx_name",
                "name": "p_1",
                "name": "p_2",
                "name": "p_3",
                "name": "p_4",
                "name": "p_5",
                "name": "p_6",
                "name": "p_max",
        "name": "test/t1#p#p_1",
                "filename": "./test/t1#p#p_1.ibd",

你可能感兴趣的:(MySQL)