恢复单表或单库数据:
第一步:
1、在禁用表空间前后增加外键约束关闭和开启
set foreign_key_checks = 0;
alter table tab_name discard tablespace;
....
set foreign_key_checks = 1;
2、单库:
set foreign_key_checks = 0;
select concat('alter table ', table_name, ' discard tablespace;') from information_schema.tables where table_schema='db_name';
set foreign_key_checks = 1;
第二部:
将对应的tab_name.ibd文件拷贝到目标服务器数据目录下,修改文件权限
chown u:g file
第三步:
1、单个表导入表空间
alter table tab_name import tablespace;
2、单库导入表空间
select concat('alter table ', table_name, ' import tablespace;') from information_schema.tables where table_schema='db_name';
可能出现问题:
1.mysql 1808错误:这是由于mysql 5.6的文件恢复到mysql 5.7版本导致的错误,需要在建表语句后面添加ROW_FORMAT=COMPACT
2.mysql 1812错误:copy的ibd文件没有赋权,用chown u:g file
3.mysql 1451错误: Cannot delete or update a parent row: a foreign
在前后加上
SET foreign_key_checks = 0; -- 先设置外键约束检查关闭
SET foreign_key_checks = 1; -- 开启外键约束检查,以保持表结构完整性
4、因为表的ID在新旧环境上不一样导致的话,可以通过命令进行重新操作,如日志中显示旧表ID为15,新的环境上为13的话,可以修对该表进行DDL操作,增加
ID : alter table tab_name rename to tab_name1;
alter table tab_name1 rename to tab_name;
就可以保持新旧一样的ID,这个错误在新环境上有可能不会触发