mysql ibd恢复数据_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"exit1

fi}

#判断恢复数据库所需文件是否缺失for c in${city[@]};do

if [ ! -f v9_${c}.sql ];then

echo -e "\033[31;1m 【 v9_${c}.sql 文件不存在 】 \033[0m"exit1

fi

if [ ! -f v9_${c}_data.sql ];then

echo -e "\033[31;1m 【 v9_${c}_data.sql 文件不存在 】 \033[0m"exit1

fi

if [ ! -f v9_${c}.ibd ];then

echo -e "\033[31;1m 【 v9_${c}.ibd 文件不存在 】 \033[0m"exit1

fi

if [ ! -f v9_${c}_data.ibd ];then

echo -e "\033[31;1m 【 v9_${c}_data.ibd 文件不存在 】 \033[0m"exit1

fi

done# 导入表结构,并且分离表for c in${city[@]};domysql-u$dbuser -p$dbpd $dbname

mysql-u$dbuser -p$dbpd $dbname

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"rebackdone# 将ibd文件复制到数据库目录下cp -arf *.ibd ${dbpath}${dbname}chmod -R 777$dbpath

#表结构和元数据结合for c in${city[@]};domysql-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"rebackdone

===============END====================

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值