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====================

posted on   思此狂  阅读(1858)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示