mysql ibd 文件还原数据

-- 这里要还原的表名为 test_table

-- 1建库,并选中库,库名随意

-- 2查看InnoDB 引擎独立表空间是否开启
SHOW VARIABLES LIKE '%per_table%'
;

-- 3设置InnoDB 引擎独立表空间开启,这样data目录下新建的表都会有对应的.ibd数据文件
SET GLOBAL innodb_file_per_table=1
;


-- 4建表
CREATE TABLE `test_table` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `openid` VARCHAR(28) DEFAULT NULL,
  `prize_id` INT(11) DEFAULT '0' COMMENT '奖品id,默认0未中奖',
  `prize_name` VARCHAR(100) DEFAULT NULL COMMENT '奖品名称',
  `type_id` TINYINT(4) DEFAULT '0' COMMENT '类别默认0',
  `username` VARCHAR(50) DEFAULT NULL COMMENT '用户名',
  `phone` VARCHAR(15) DEFAULT NULL COMMENT '手机号',
  `province` VARCHAR(50) DEFAULT NULL COMMENT '',
  `city` VARCHAR(100) DEFAULT NULL COMMENT '',
  `address` VARCHAR(255) DEFAULT NULL COMMENT '详细地址',
  `add_time` INT(11) DEFAULT NULL COMMENT '添加时间',
  `update_time` INT(11) DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
;
-- 5 使当前ibd 的数据文件和frm 分离
ALTER TABLE test_table DISCARD TABLESPACE
;
-- 6将备份的ibd文件覆盖当前表的ibd

-- 7 加载关联新ibd文件
ALTER TABLE test_table IMPORT TABLESPACE
-- 这一步可能报错,查看错误日志,本地设置的是.err文件
-- InnoDB: Error: tablespace id and flags in file './data/test_table.ibd' are 2170 and 0, but in the InnoDB
-- InnoDB: data dictionary they are 1 and 0.
-- 原因是,服务器上的表空间ID 为2170 本地新建的表空间ID为1,所以导致这个错误发生,解决办法是:让他们的表空间ID一致,即在本地不断的创建删除 test_table 表。
;
-- 可在程序里循环执行如下两句,直到本地和线上数据库上该表的表空间ID一致
-- CREATE TABLE test_table (id INT) ENGINE=INNODB
-- DROP TABLE `test_table`
-- 最后删除表后重新从第4步开始执行


-- 8查看表数据,如果报错则找到my.ini文件
-- 查找有无innodb_force_recovery这一属性,如果没有则在最下一行添加 innodb_force_recovery=1 还报错的话就修改值2,3,4,5等,直到可以正确查看表数据为止

-- 9 可以查看表后立即导出sql文件,再把my.ini文件中innodb_force_recovery属性值改回默认的0,或注释掉(默认值也是0)

 

posted @ 2017-10-10 17:03  风吹屁股凉冰冰  阅读(1323)  评论(0编辑  收藏  举报