翼度科技»论坛 编程开发 mysql 查看内容

mysql8.0 .ibd文件恢复表结构的实现

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
今天早上启动了 phpstudy 软件中的 MySQL 8.0 数据库时,发现它启动后约过了 3 秒就自行关闭了。接着又自动启动然后再次关闭,似乎陷入了一个“开-闭-开”的循环。这导致我无法正常使用数据库。在尝试修改配置文件和端口号无果后,我决定卸载数据库并重新安装。根据之前的经验,我直接备份了 MySQL 安装路径下的 data 文件夹。之前使用的是 MySQL 5.7 版本,直接备份 data 文件夹下的文件可以保留数据库的库名、表名、字段、索引等信息。在重新安装后,将之前备份的数据直接导入新的数据库的 data 文件夹下也是顺利的,使用像 Navicat 这样的 MySQL 可视化工具可以看到表名和表结构。但是在 MySQL 8.0 及以上版本,情况就有所不同了,这导致后续出现了很多问题。
在 MySQL 8.0 中,数据库文件存储在 data 文件夹中,每个目录代表一个数据库。在每个数据库目录下,有多个 .ibd 文件,每个 .ibd 文件对应一张表,文件名即表名。.ibd 文件是 MySQL 的表数据文件,而在 MySQL 8 之前,表定义存储在 .frm 后缀的文件中,表数据和表索引存储在 .ibd 文件中。所有这些文件都在 MySQL 的 data 目录下,即数据库名所在的目录中。闲来无事记录一下。

查看mysql数据库data文件夹路径:
  1. show variables like ‘%datadir%'
复制代码
.ibd文件是以二进制形式存储的,这个时候想要查看存储内容需要用mysql8自带的 ibd2sdi命令 进行解析,首先查看是否能执行这个命令,找不到命令或者不存在就需要配置系统环境变量了,起初我尝试到phpstudy环境下的mysql8的安装目录找bin目录,看看能否执行ibd2sdi命令,不行于是我到官网下载一个mysql在本地安装,接着配置环境变量。


ibd2sdi 命令:
  1. G:\PhpStudy\phpstudy_pro\Extensions\MySQL8.0.12\data\ruibaiqiche>ibd2sdi --dump-file rb_position.txt rb_position.ibd
复制代码
解析内容:
  1. ["ibd2sdi"
  2. ,
  3. {
  4.         "type": 1,
  5.         "id": 1929,
  6.         "object":
  7.                 {
  8.     "mysqld_version_id": 80012,
  9.     "dd_version": 80012,
  10.     "sdi_version": 1,
  11.     "dd_object_type": "Table",
  12.     "dd_object": {
  13.         "name": "rb_position",
  14.         "mysql_version_id": 80012,
  15.         "created": 20231214074915,
  16.         "last_altered": 20231214074915,
  17.         "hidden": 1,
  18.         "options": "avg_row_length=0;key_block_size=0;keys_disabled=0;pack_record=1;stats_auto_recalc=0;stats_sample_pages=0;",
  19.         "columns": [
  20.             {
  21.                 "name": "id",
  22.                 "type": 4,
  23.                 "is_nullable": false,
  24.                 "is_zerofill": false,
  25.                 "is_unsigned": false,
  26.                 "is_auto_increment": true,
  27.                 "is_virtual": false,
  28.                 "hidden": 1,
  29.                 "ordinal_position": 1,
  30.                 "char_length": 11,
  31.                 "numeric_precision": 10,
  32.                 "numeric_scale": 0,
  33.                 "numeric_scale_null": false,
  34.                 "datetime_precision": 0,
  35.                 "datetime_precision_null": 1,
  36.                 "has_no_default": false,
  37.                 "default_value_null": false,
  38.                 "srs_id_null": true,
  39.                 "srs_id": 0,
  40.                 "default_value": "AAAAAA==",
  41.                 "default_value_utf8_null": true,
  42.                 "default_value_utf8": "",
  43.                 "default_option": "",
  44.                 "update_option": "",
  45.                 "comment": "ID",
  46.                 "generation_expression": "",
  47.                 "generation_expression_utf8": "",
  48.                 "options": "interval_count=0;",
  49.                 "se_private_data": "table_id=2219;",
  50.                 "column_key": 2,
  51.                 "column_type_utf8": "int(11)",
  52.                 "elements": [],
  53.                 "collation_id": 8,
  54.                 "is_explicit_collation": false
  55.             },
  56.             {
  57.                 "name": "position",
  58.                 "type": 16,
  59.                 "is_nullable": true,
  60.                 "is_zerofill": false,
  61.                 "is_unsigned": false,
  62.                 "is_auto_increment": false,
  63.                 "is_virtual": false,
  64.                 "hidden": 1,
  65.                 "ordinal_position": 2,
  66.                 "char_length": 400,
  67.                 "numeric_precision": 0,
  68.                 "numeric_scale": 0,
  69.                 "numeric_scale_null": true,
  70.                 "datetime_precision": 0,
  71.                 "datetime_precision_null": 1,
  72.                 "has_no_default": false,
  73.                 "default_value_null": true,
  74.                 "srs_id_null": true,
  75.                 "srs_id": 0,
  76.                 "default_value": "",
  77.                 "default_value_utf8_null": true,
  78.                 "default_value_utf8": "",
  79.                 "default_option": "",
  80.                 "update_option": "",
  81.                 "comment": "职位名称",
  82.                 "generation_expression": "",
  83.                 "generation_expression_utf8": "",
  84.                 "options": "interval_count=0;",
  85.                 "se_private_data": "table_id=2219;",
  86.                 "column_key": 1,
  87.                 "column_type_utf8": "varchar(100)",
  88.                 "elements": [],
  89.                 "collation_id": 45,
  90.                 "is_explicit_collation": false
  91.             },
  92.             {
  93.                 "name": "createtime",
  94.                 "type": 19,
  95.                 "is_nullable": true,
  96.                 "is_zerofill": false,
  97.                 "is_unsigned": false,
  98.                 "is_auto_increment": false,
  99.                 "is_virtual": false,
  100.                 "hidden": 1,
  101.                 "ordinal_position": 3,
  102.                 "char_length": 19,
  103.                 "numeric_precision": 0,
  104.                 "numeric_scale": 0,
  105.                 "numeric_scale_null": true,
  106.                 "datetime_precision": 0,
  107.                 "datetime_precision_null": 0,
  108.                 "has_no_default": false,
  109.                 "default_value_null": true,
  110.                 "srs_id_null": true,
  111.                 "srs_id": 0,
  112.                 "default_value": "",
  113.                 "default_value_utf8_null": true,
  114.                 "default_value_utf8": "",
  115.                 "default_option": "",
  116.                 "update_option": "",
  117.                 "comment": "",
  118.                 "generation_expression": "",
  119.                 "generation_expression_utf8": "",
  120.                 "options": "interval_count=0;",
  121.                 "se_private_data": "table_id=2219;",
  122.                 "column_key": 1,
  123.                 "column_type_utf8": "datetime",
  124.                 "elements": [],
  125.                 "collation_id": 8,
  126.                 "is_explicit_collation": false
  127.             },
  128.             {
  129.                 "name": "updatetime",
  130.                 "type": 19,
  131.                 "is_nullable": true,
  132.                 "is_zerofill": false,
  133.                 "is_unsigned": false,
  134.                 "is_auto_increment": false,
  135.                 "is_virtual": false,
  136.                 "hidden": 1,
  137.                 "ordinal_position": 4,
  138.                 "char_length": 19,
  139.                 "numeric_precision": 0,
  140.                 "numeric_scale": 0,
  141.                 "numeric_scale_null": true,
  142.                 "datetime_precision": 0,
  143.                 "datetime_precision_null": 0,
  144.                 "has_no_default": false,
  145.                 "default_value_null": true,
  146.                 "srs_id_null": true,
  147.                 "srs_id": 0,
  148.                 "default_value": "",
  149.                 "default_value_utf8_null": true,
  150.                 "default_value_utf8": "",
  151.                 "default_option": "",
  152.                 "update_option": "",
  153.                 "comment": "",
  154.                 "generation_expression": "",
  155.                 "generation_expression_utf8": "",
  156.                 "options": "interval_count=0;",
  157.                 "se_private_data": "table_id=2219;",
  158.                 "column_key": 1,
  159.                 "column_type_utf8": "datetime",
  160.                 "elements": [],
  161.                 "collation_id": 8,
  162.                 "is_explicit_collation": false
  163.             },
  164.             {
  165.                 "name": "deletetime",
  166.                 "type": 19,
  167.                 "is_nullable": true,
  168.                 "is_zerofill": false,
  169.                 "is_unsigned": false,
  170.                 "is_auto_increment": false,
  171.                 "is_virtual": false,
  172.                 "hidden": 1,
  173.                 "ordinal_position": 5,
  174.                 "char_length": 19,
  175.                 "numeric_precision": 0,
  176.                 "numeric_scale": 0,
  177.                 "numeric_scale_null": true,
  178.                 "datetime_precision": 0,
  179.                 "datetime_precision_null": 0,
  180.                 "has_no_default": false,
  181.                 "default_value_null": true,
  182.                 "srs_id_null": true,
  183.                 "srs_id": 0,
  184.                 "default_value": "",
  185.                 "default_value_utf8_null": true,
  186.                 "default_value_utf8": "",
  187.                 "default_option": "",
  188.                 "update_option": "",
  189.                 "comment": "",
  190.                 "generation_expression": "",
  191.                 "generation_expression_utf8": "",
  192.                 "options": "interval_count=0;",
  193.                 "se_private_data": "table_id=2219;",
  194.                 "column_key": 1,
  195.                 "column_type_utf8": "datetime",
  196.                 "elements": [],
  197.                 "collation_id": 8,
  198.                 "is_explicit_collation": false
  199.             },
  200.             {
  201.                 "name": "DB_TRX_ID",
  202.                 "type": 10,
  203.                 "is_nullable": false,
  204.                 "is_zerofill": false,
  205.                 "is_unsigned": false,
  206.                 "is_auto_increment": false,
  207.                 "is_virtual": false,
  208.                 "hidden": 2,
  209.                 "ordinal_position": 6,
  210.                 "char_length": 6,
  211.                 "numeric_precision": 0,
  212.                 "numeric_scale": 0,
  213.                 "numeric_scale_null": true,
  214.                 "datetime_precision": 0,
  215.                 "datetime_precision_null": 1,
  216.                 "has_no_default": false,
  217.                 "default_value_null": true,
  218.                 "srs_id_null": true,
  219.                 "srs_id": 0,
  220.                 "default_value": "",
  221.                 "default_value_utf8_null": true,
  222.                 "default_value_utf8": "",
  223.                 "default_option": "",
  224.                 "update_option": "",
  225.                 "comment": "",
  226.                 "generation_expression": "",
  227.                 "generation_expression_utf8": "",
  228.                 "options": "",
  229.                 "se_private_data": "table_id=2219;",
  230.                 "column_key": 1,
  231.                 "column_type_utf8": "",
  232.                 "elements": [],
  233.                 "collation_id": 63,
  234.                 "is_explicit_collation": false
  235.             },
  236.             {
  237.                 "name": "DB_ROLL_PTR",
  238.                 "type": 9,
  239.                 "is_nullable": false,
  240.                 "is_zerofill": false,
  241.                 "is_unsigned": false,
  242.                 "is_auto_increment": false,
  243.                 "is_virtual": false,
  244.                 "hidden": 2,
  245.                 "ordinal_position": 7,
  246.                 "char_length": 7,
  247.                 "numeric_precision": 0,
  248.                 "numeric_scale": 0,
  249.                 "numeric_scale_null": true,
  250.                 "datetime_precision": 0,
  251.                 "datetime_precision_null": 1,
  252.                 "has_no_default": false,
  253.                 "default_value_null": true,
  254.                 "srs_id_null": true,
  255.                 "srs_id": 0,
  256.                 "default_value": "",
  257.                 "default_value_utf8_null": true,
  258.                 "default_value_utf8": "",
  259.                 "default_option": "",
  260.                 "update_option": "",
  261.                 "comment": "",
  262.                 "generation_expression": "",
  263.                 "generation_expression_utf8": "",
  264.                 "options": "",
  265.                 "se_private_data": "table_id=2219;",
  266.                 "column_key": 1,
  267.                 "column_type_utf8": "",
  268.                 "elements": [],
  269.                 "collation_id": 63,
  270.                 "is_explicit_collation": false
  271.             }
  272.         ],
  273.         "schema_ref": "ruibaiqiche",
  274.         "se_private_id": 2219,
  275.         "engine": "InnoDB",
  276.         "comment": "职位表",
  277.         "se_private_data": "autoinc=0;version=2;",
  278.         "row_format": 2,
  279.         "partition_type": 0,
  280.         "partition_expression": "",
  281.         "partition_expression_utf8": "",
  282.         "default_partitioning": 0,
  283.         "subpartition_type": 0,
  284.         "subpartition_expression": "",
  285.         "subpartition_expression_utf8": "",
  286.         "default_subpartitioning": 0,
  287.         "indexes": [
  288.             {
  289.                 "name": "PRIMARY",
  290.                 "hidden": false,
  291.                 "is_generated": false,
  292.                 "ordinal_position": 1,
  293.                 "comment": "",
  294.                 "options": "flags=0;",
  295.                 "se_private_data": "id=1732;root=4;space_id=1162;table_id=2219;trx_id=153333;",
  296.                 "type": 1,
  297.                 "algorithm": 2,
  298.                 "is_algorithm_explicit": false,
  299.                 "is_visible": true,
  300.                 "engine": "InnoDB",
  301.                 "elements": [
  302.                     {
  303.                         "ordinal_position": 1,
  304.                         "length": 4,
  305.                         "order": 2,
  306.                         "column_opx": 0
  307.                     },
  308.                     {
  309.                         "ordinal_position": 2,
  310.                         "length": 4294967295,
  311.                         "order": 2,
  312.                         "column_opx": 5
  313.                     },
  314.                     {
  315.                         "ordinal_position": 3,
  316.                         "length": 4294967295,
  317.                         "order": 2,
  318.                         "column_opx": 6
  319.                     },
  320.                     {
  321.                         "ordinal_position": 4,
  322.                         "length": 4294967295,
  323.                         "order": 2,
  324.                         "column_opx": 1
  325.                     },
  326.                     {
  327.                         "ordinal_position": 5,
  328.                         "length": 4294967295,
  329.                         "order": 2,
  330.                         "column_opx": 2
  331.                     },
  332.                     {
  333.                         "ordinal_position": 6,
  334.                         "length": 4294967295,
  335.                         "order": 2,
  336.                         "column_opx": 3
  337.                     },
  338.                     {
  339.                         "ordinal_position": 7,
  340.                         "length": 4294967295,
  341.                         "order": 2,
  342.                         "column_opx": 4
  343.                     }
  344.                 ],
  345.                 "tablespace_ref": "ruibaiqiche/rb_position"
  346.             }
  347.         ],
  348.         "foreign_keys": [],
  349.         "partitions": [],
  350.         "collation_id": 45
  351.     }
  352. }
  353. }
  354. ,
  355. {
  356.         "type": 2,
  357.         "id": 1167,
  358.         "object":
  359.                 {
  360.     "mysqld_version_id": 80012,
  361.     "dd_version": 80012,
  362.     "sdi_version": 1,
  363.     "dd_object_type": "Tablespace",
  364.     "dd_object": {
  365.         "name": "ruibaiqiche/rb_position",
  366.         "comment": "",
  367.         "options": "",
  368.         "se_private_data": "flags=16417;id=1162;server_version=80012;space_version=1;",
  369.         "engine": "InnoDB",
  370.         "files": [
  371.             {
  372.                 "ordinal_position": 1,
  373.                 "filename": ".\\ruibaiqiche\\rb_position.ibd",
  374.                 "se_private_data": "id=1162;"
  375.             }
  376.         ]
  377.     }
  378. }
  379. }
  380. ]
复制代码
后面想要恢复数据库中的表结构的话,只能看解析后的字段名进行创建表了。解析后的.idb文件是一个json格式的数据,再此基础上key值基本不变,可以用代码实现获取表名和字段名再拼接成SQL语句,接着再拿到数据库中进行创建表。
  1. function test(){
  2.         // 获取传入的json
  3.         //$data = $this->request->param();
  4.         // 替换为你的 JSON 数据
  5.         $jsonData = 'YOUR_JSON_DATA_HERE';
  6.         // 解析 JSON 数据
  7.         $data = json_decode($jsonData, true);
  8.         // 提取表名和字段信息
  9.         $tableName = $data[1]['object']['dd_object']['name'];
  10.         $columns = $data[1]['object']['dd_object']['columns'];
  11.         // 构建创建表的 SQL 查询语句
  12.         $sql = "CREATE TABLE $tableName (";

  13.         foreach ($columns as $column) {
  14.             $columnName = $column['name'];
  15.             // 如果字段名不是 DB_TRX_ID 和 DB_ROLL_PTR,则构建该字段的 SQL
  16.             if ($columnName !== 'DB_TRX_ID' && $columnName !== 'DB_ROLL_PTR' && $columnName !== 'DB_ROW_ID') {
  17.                 $columnType = $column['column_type_utf8'];
  18.                 $isNullable = $column['is_nullable'] ? 'NULL' : 'NOT NULL';
  19.                 $default = ($column['default_value_null'] || $column['default_value_utf8_null']) ? '' : "DEFAULT '{$column['default_value']}'";

  20.                 // 构建列的注释,如果注释为空,不包含 COMMENT 部分
  21.                 $comment = isset($column['comment']) && !empty($column['comment']) ? "COMMENT '{$column['comment']}'" : '';

  22.                 // 构建列的 SQL
  23.                 $sql .= "$columnName $columnType $isNullable $default $comment, ";
  24.             }
  25.         }
  26.         // 去除最后的逗号和空格
  27.         $sql = rtrim($sql, ', ') . ");";
  28.         echo $sql;
  29.     }
复制代码
到此这篇关于mysql8.0 .ibd文件恢复表结构的实现的文章就介绍到这了,更多相关mysql .ibd文件恢复表结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/database/3289516vf.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具