mysql frm 版本_mysql 5.7以前的版本只有只有.frm和.ibd文件时如何批量恢复InnoDB的表...

背景:

很多时候因为 MySQL 数据库不能启动而造成数据无法访问,但应用的数据通常没有丢失,只是系统表空间等其它文件损坏了,或者遇到 MySQL 的 bug。这个时候如果没有备份,很多人就以为数据丢失了,但实际上大部分时候数据还是有救的。对于 MyISAM 引擎的表空间,直接把对应的数据文件拷贝到一个新的数据库就行了,数据就可以恢复了。对于 InnoDB 引擎的数据库表空间可以采用传输表空间的方式把数据救回来。

1、安装软件,回已经丢失的表结构

rpm -Uvh https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5-1.el7.noarch.rpm

假设db1为原数据库目录且里面有多表,那么我能用命令mysqlfrm就能找回库下.frm 文件的表结构

[root@slave1 ~]# mysqlfrm --diagnostic db1 >createtb.sql

[root@slave1 ~]# grep "CREATE TABLE" createtb.sql |wc -l

10 #可以看到一共生成了 10 个建表语句

2、新建数据库导入建表语句

Query OK, 0 rows affected (0.03 sec)

...

3、恢复阶段1:先将新建的表没有包括数据的 .ibd 表空间文件抛弃

语句:alter table table_name discard tablespace;

mysql -S /data/socket/mysql16100.sock -e "show tables from db1"|grep -v Tables_in_db1 \

|while read a ;do mysql -S /data/socket/mysql16100.sock -e " alter table db1.$a discard tablespace";done

4、恢复阶段2:将db1为原数据库目录下的*.idb 拷贝到新的数据库目录下,然后添加对应mysql.mysql 权限,再把这些数据文件 import 到数据库中。

语句:alter table table_name import tablespace;

mysql -S /data/socket/mysql16100.sock -e "show tables from db1"|grep -v Tables_in_db1 \

|while read a ;do mysql -S /data/socket/mysql16100.sock -e " alter table db1.$a import tablespace";done

5、使用 mysqlcheck 对数据库db1 下的所有表进行检查

[root@localhost db1]# mysqlcheck -S /data/socket/mysql16100.sock -c db1

db1.t1 OK

...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值