mysql 的后缀名ibd的文件是存放数据和索引的。
现模拟ibd文件的故障使用,故障恢复。
声明:我也是刚刚使用mysql,一起学习吧。
测试ibd文件使用
1、新建一个测试库,可以和正式库在同一台电脑上(不用单独再借一台电脑)
2、把要恢复的数据表的创建语句在测试库执行一次。
CREATE TABLE `historyorder_copy1` (
`Orderid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Orderid',
`belongToShop` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`belongToTime` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`ID` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`) USING BTREE,
UNIQUE INDEX `OrderidIndex`(`Orderid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1183135 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '20200908增加唯一索引,确保唯一性,本身有ID自增作为主键' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
3、执行 其中matlab为刚刚创建的表名,去掉表空间。
alter table historyorder_copy1 DISCARD TABLESPACE;
4、可以把正式库的matlab复制到测试库的文件夹下,这里mysql可以不用停止服务。
5、执行 加载表空间。
alter table historyorder_copy1 IMPORT TABLESPACE;
6、执行完后在测试库中已经可以 select count(*) from matlab ,证明成功启用另一个ibd文件。
-- 使用sql查询数据目录
**show global variables like '%datadir%';**
发现另一个问题,我停掉mysql服务,把ibd文件复制出来,放到安全的地方,开启数据库服务,删除刚刚复制文件的表的部分数据,比方说数据由100行,变成30行。然后停服务。
再把放在安全地方的ibd文件放回他原本的位置,这样数据行又变成100行,并且是可读写状态。
这是不是mysql的一个小bug?还是我开了容错模式?
测试库和正式库在不同的文件夹,我也是涨知识了,在mysql中,不同数据库的物理文件在不同的文件夹,mssql和oracle除非你指定,默认都是在同一个文件夹。