一、概述
1、mysql5.7常用两种存储引擎结构
MyISAM
user.frm ##存储的表结构(列,列属性)
user.MYD ##存储的数据记录
user.MYI ##存储的索引
InnoDB
city.frm ##存储的表结构(列,列属性)
city.ibd ##存储的数据记录和索引
2、mysql8.0变化
MyISAM
*.sdi 描述表结构
*.MYD 数据
*.MYI 索引
InnoDB
*.ibd 表结构、索引和数据都存储在一起
二、SDI
1、SDI是什么
Serialized Dictionary Information是指表结构元数据。MySQL 8.0通过在元数据发生变化时序列化元数据,提供了崩溃安全性。
它的输出是JSON (JavaScript对象表示法)格式,称为序列化字典信息(SDI)。
对于InnoDB表,SDI与InnoDB用户表空间中的数据一起存储。
对于MyISAM和其他存储引擎,它被写入数据目录中的.sdi文件。
除了临时表空间和撤销表空间文件外,所有InnoDB表空间文件中都存在SDI。
InnoDB表空间文件中的SDI记录仅描述表空间中包含的表和表空间对象。
SDI数据通过对表或检查表的DDL操作进行更新的。
MySQL服务器使用DDL操作期间访问的内部API来创建和维护SDI记录。
当MySQL服务器升级到一个新的版本或版本时,SDI数据不会更新。
记录数据方式:对于InnoDB,一条SDI记录需要一个索引页,默认大小为16KB。但实际SDI数据被压缩以减少存储空间。
分区表:
对于由多个表空间组成的分区InnoDB表,SDI数据存储在第一个分区的表空间文件中。
注意,这个SDI只是元数据的备份。它不是元数据本身。数据字典完全存在于InnoDB数据字典表空间中。
2、SDI文件内容
SDI数据的存在提供了元数据冗余。
那么,如果数据字典不可用,可以使用ibd2sdi工具直接从InnoDB表空间文件中提取对象元数据。
mysql安装包bin目录下自带ibd2sdi二进制可执行文件
ibd2sdi是一个用于从InnoDB表空间文件中提取序列化字典信息(SDI)的实用程序,导服务器托管网出格式为JSON。所有的InnoDB表空间文件都存在SDI数据。
ibd2sdi可以
file-per-table 表空间文件上运行(*.ibd files)文件,
一般表空间文件 (*.ibd files)。
系统表空间文件 (ibdata* files)
数据字典表空间(mysql.ibd)。
它不支持temporary表空间或undo表空间。
ibd2sdi可以在运行时使用,也可以在服务器离线时使用。
在进行与SDI相关的DDL操作、回滚操作和undo log purge操作时,可能会出现ibd2sdi读取存储在表空间中的SDI数据失败的短时间间隔。
ibd2sqi目前功能,只是单纯的提取字典信息。核心还是抽取数据部分。
常用简单操作:
ibd2sdi --dump-file=a.txt test2.ibd
三、数据恢复操作
1、5.7版本配合mysql-utilities
1、安装mysql-utilities
yum install python3
cd /opt
wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
tar xvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5
python setup.py build
python setup.py install
2、获取建表语句
mysqlfrm --diagnostic /data/mysql/test/test1.frm |grep -Ev '^#|^$'
2、8.0MyISAM存储引擎表恢复
1、建表并插入数据
create table test1(id int primary key,name varchar(10)) engine=myisam;
insert into test1 values(1,'zhangsan'),(2,'lisi');
2、将test1表存储结构备份
cp /data/mysql/test/test1* /data/myisam_bk
3、删除test1表
mysql> DROP TABLE test1;
4、恢复操作,文件拷贝
cp /data/myisam_bk/test1* /data/mysql/test/
chown -R mysql.mysql /data/mysql/test/test1*
5、导入文件
mysql> IMPORT TABLE FROM '/data/mysql/test/test1_363.sdi';
6、注意
import导入的目录和配置参数secure_file_priv有关,如果没有配置会报权限不足
3、8.0InnoDB存储引擎表恢复
1、建表并插入数据
create table test2(id int primary key,name varchar(10)) engine=innodb;
insert into test2 values(1,'zhangsan'),(2,'lisi');
2、将test2表存储结构备份
cp /data/mysql/test/test2.ibd /data/innodb_bk
3、删除test2表
mysql> DROP TABLE test2;
4、通过ibd分析建表语句
ibd2sdi /data/innodb_bk/test2.ibd --dump-file=/data/innodb_bk/test2.txt
cat /data/innodb_bk/test2.txt | grep -P 'name|column_type_utf8[" :]+K[^"]+'
或者使用jq解析也行
cat /data/innodb_bk/t服务器托管网est2.txt |jq '.[]?|.[]?|.dd_object?|({table:.name?},(.columns?|.[]?|{name:.name,type:.column_type_utf8}))'
解析出来的表结构简直就是坑人,需要目测,然后手动将列名、约束、主键之类的归档成表结构
5、重新创建表
根据第四步整理的建表语句,重新创建表
6、删除表空间,保留表结构
ALTER TABLE test2 DISCARD TABLESPACE;
7、ibd文件拷贝
cp /data/innodb_bk/test2.ibd /data/mysql/test
chown -R mysql.mysql /data/mysql/test/test2.ibd
8、导入表空间:
ALTER TABLE test2 IMPORT TABLESPACE;
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: RedisTemplate.opsForZet()的使用
RedisTemplate.opsForZet()是RedisTemplate类提供的用于操作Zset类型(有序集合)的方法。它可以用于对Redis中的Zset数据结构进行各种操作。添加、删除、排序、获取。 一、常用方法介绍 方法 说明 add(K key, …