zoukankan      html  css  js  c++  java
  • 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 "33[32;1m 【 执行成功 】 33[0m"
    else
        echo -e "33[31;1m 【 执行失败 】 33[0m"
        exit 1
    fi
    }
    
    
    #判断恢复数据库所需文件是否缺失
    for c in ${city[@]};
    do
    
        if [ ! -f v9_${c}.sql ];then
             echo -e "33[31;1m 【 v9_${c}.sql 文件不存在 】 33[0m"
            exit 1
        fi
    
        if [ ! -f v9_${c}_data.sql  ];then
             echo -e "33[31;1m 【 v9_${c}_data.sql 文件不存在 】 33[0m"
            exit 1
        fi
    
        if [ ! -f v9_${c}.ibd ];then
             echo -e "33[31;1m 【 v9_${c}.ibd 文件不存在 】 33[0m"
            exit 1
        fi
    
        if [ ! -f v9_${c}_data.ibd ];then
             echo -e "33[31;1m 【 v9_${c}_data.ibd 文件不存在 】 33[0m"
            exit 1
        fi
            
    done
    
    
    # 导入表结构,并且分离表
    for c in ${city[@]};
    do    
        mysql -u$dbuser -p$dbpd $dbname < v9_${c}.sql
        echo -e "33[36;1m 【 导入表 v9_${c} 结构 】 33[0m"
        reback
        mysql -u$dbuser -p$dbpd $dbname < v9_${c}_data.sql
        echo -e "33[36;1m 【 导入表 v9_${c}_data 结构 】 33[0m"
        reback
        mysql -u$dbuser -p$dbpd -e "use $dbname ; ALTER TABLE v9_${c} DISCARD TABLESPACE;"
        echo -e "33[36;1m 【 分离表 v9_${c} 】 33[0m"
        reback
        mysql -u$dbuser -p$dbpd -e "use $dbname ; ALTER TABLE v9_${c}_data DISCARD TABLESPACE;"
        echo -e "33[36;1m 【 分离表 v9_${c} 】 33[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 "33[36;1m 【 合成表 v9_${c} 】 33[0m"
        reback
        mysql -u$dbuser -p$dbpd -e "use $dbname ; ALTER TABLE v9_${c}_data IMPORT TABLESPACE;"
        echo -e "33[36;1m 【 合成表 v9_${c}_data} 】 33[0m"
        reback
    done

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

  • 相关阅读:
    Android学习笔记03:学习过程中碰到的一些问题及解决方法
    写于莫言获得诺贝尔文学奖之际
    Windows环境下QT学习笔记01:QT及QT Creator的下载及安装
    Android学习笔记02:AndroidManifest.xml源码
    Android学习笔记01:开发环境搭建
    怀念我的大学四年
    喜获TI MSP430 LaunchPad开发板
    Win7下VS2008破解方法
    手把手教你把Vim改装成一个IDE编程环境
    顺序线性表
  • 原文地址:https://www.cnblogs.com/jkklearn/p/6654199.html
Copyright © 2011-2022 走看看