记一次mysql用.ibd格式恢复数据过程

这里写自定义目录标题

前记

第一次尝试写博客记录一些有用的操作,便于后面遇到同样的问题就可以直接对着文档操作了。

事件背景

公司的一个内网测试服务器由于docker缓存太多,造成服务器空间不够用,急需清理一波缓存垃圾。由于自己对docker还处于只会用命令部署项目的阶段,平时并没有深入了解它,所以一顿操作,把docker的配置文件的删掉了,造成docker上所有的容器都启动不了了。主要我们mysql还是用docker部署的,所以就有了下面这个数据恢复的事情

先交代一下新旧数据库版本
旧的数据库版本(就是被我玩坏的数据库)是5.6,且用docker部署,系统是ubuntu14。然后新的数据库版本(用于数据恢复的数据库)是5.7,不用docker部署,系统是ubuntu18;还有重要的一点是data目录下面的表结构与数据文件还在!

开始正文

  1. 先找到mysql的配置,默认是在/etcl里面的my.cnf,然后在[mysqld]下面添加
innodb_file_per_table=1
  1. 重启mysql;
systemctl restart mysql
  1. 在mysql里面或者mysql客户端执行以下命令
-- 先设置外键约束检查关闭,不然执行下一步会报错
SET FOREIGN_KEY_CHECKS = 0;
  1. 创建表结构并分离表空间
-- 创建表结构
CREATE TABLE <表名> {};
-- 分离表空间
ALTER TABLE <表名> DISCARD TABLESPACE;
  1. 关掉mysql
systemctl stop mysql
  1. 把.bd文件复制到新数据的data目录下

  2. 对mysql文件赋予此文件的权限
    如果这步没执行,下面那步会报错:Tablespace is missing for table

//先用cd命令进入到ibd文件夹里面再执行以下命令
chown mysql:mysql <表名>.ibd
  1. 导入表空间
ALTER TABLE <表名> IMPORT TABLESPACE;
  1. 开启外键约束检查
-- 开启外键约束检查,以保持表结构完整性
SET FOREIGN_KEY_CHECKS = 1; 

到此刷新一下数据库,应该就可以看到表的新数据了


之后发现有些表会报错:
Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)
解决方案是在建表语句后面加ROW_FORMAT=COMPACT;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值