mysql通过ibd恢复数据
参考文档 http://www.cnblogs.com/logo-fox/p/6210533.html
数据库只剩 数据库目录中的 .frm 和 .ibd文件 时候的修复
.frm 表结构
.ibd 表的元数据
下面从已经拥有表结构开始恢复
1 新建一个表(test库),将表结构导入表中,此时,表只有表结构,没有数据
2 分离表,ALTER TABLE tbname DISCARD TABLESPACE;
此时表tbname 的ibd文件会被删除(数据库的数据存储目录 ,默认为/var/lib/mysql)
3 将保存有数据的ibd文件复制到数据库目录的下相应的库中(/var/lib/mysql/test/)
修改新复制的ibd文件权限,chown mysql:mysql *
4 恢复表 ALTER TABLE tbname IMPORT TABLESPACE;
正常情况下不会报错,但是如果报这个
Schema mismatch (Table has ROW_TYPE_COMPACT row format, .ibd file has ROW_TYPE_DYNAMIC row format
表类型错误,在传建表时候 加上这个 ROW_FORMAT=DYNAMIC;
或者 alter table tb_name row_format=DYNAMIC;
然后再执行 ALTER TABLE tbname IMPORT TABLESPACE;
5 如果还不成功可能是数据库版本的问题。我在5.6上执行时报这样的错
换在5.7上执行 import 时 报 lost connection to mysql server during query
此时数据已经恢复。
一下示例一个批量恢复数据库的简单脚本
#!/usr/bin/bash #数据库的批量恢复 #在MySQL5.6及以下版本中恢复失败的话请在5.7版本中尝试。 #此恢复方式仅适用于innodb引擎。 #将此脚本与 #(1)含有表结构的sql文件 #(2)需要恢复的城市区县的IBD文件放在一起 # 需要恢复的区县名称 city=( hengyangxian qidong ) #数据库的存储目录,在数据库的配置文件my.cnf中[mysqld]下的datadir配置 dbpath=/usr/local/mysql/data/ #数据库用户 dbuser=root #数据库密码 dbpd=123456 #存储恢复数据的数据库名称 #最好新建一个库用来专门存储恢复的数据 # create database yy default character set utf8; dbname=yy #判断命令是否执行成功 reback(){ if [ $? = 0 ]; then echo -e "\033[32;1m 【 执行成功 】 \033[0m" else echo -e "\033[31;1m 【 执行失败 】 \033[0m" exit 1 fi } #判断恢复数据库所需文件是否缺失 for c in ${city[@]}; do if [ ! -f v9_${c}.sql ];then echo -e "\033[31;1m 【 v9_${c}.sql 文件不存在 】 \033[0m" exit 1 fi if [ ! -f v9_${c}_data.sql ];then echo -e "\033[31;1m 【 v9_${c}_data.sql 文件不存在 】 \033[0m" exit 1 fi if [ ! -f v9_${c}.ibd ];then echo -e "\033[31;1m 【 v9_${c}.ibd 文件不存在 】 \033[0m" exit 1 fi if [ ! -f v9_${c}_data.ibd ];then echo -e "\033[31;1m 【 v9_${c}_data.ibd 文件不存在 】 \033[0m" exit 1 fi done # 导入表结构,并且分离表 for c in ${city[@]}; do mysql -u$dbuser -p$dbpd $dbname < v9_${c}.sql echo -e "\033[36;1m 【 导入表 v9_${c} 结构 】 \033[0m" reback mysql -u$dbuser -p$dbpd $dbname < v9_${c}_data.sql echo -e "\033[36;1m 【 导入表 v9_${c}_data 结构 】 \033[0m" reback mysql -u$dbuser -p$dbpd -e "use $dbname ; ALTER TABLE v9_${c} DISCARD TABLESPACE;" echo -e "\033[36;1m 【 分离表 v9_${c} 】 \033[0m" reback mysql -u$dbuser -p$dbpd -e "use $dbname ; ALTER TABLE v9_${c}_data DISCARD TABLESPACE;" echo -e "\033[36;1m 【 分离表 v9_${c} 】 \033[0m" reback done # 将ibd文件复制到数据库目录下 cp -arf *.ibd ${dbpath}${dbname} chmod -R 777 $dbpath #表结构和元数据结合 for c in ${city[@]}; do mysql -u$dbuser -p$dbpd -e "use $dbname ; ALTER TABLE v9_${c} IMPORT TABLESPACE;" echo -e "\033[36;1m 【 合成表 v9_${c} 】 \033[0m" reback mysql -u$dbuser -p$dbpd -e "use $dbname ; ALTER TABLE v9_${c}_data IMPORT TABLESPACE;" echo -e "\033[36;1m 【 合成表 v9_${c}_data} 】 \033[0m" reback done
===============END====================