前记
第一次尝试写博客记录一些有用的操作,便于后面遇到同样的问题就可以直接对着文档操作了。
事件背景
公司的一个内网测试服务器由于docker缓存太多,造成服务器空间不够用,急需清理一波缓存垃圾。由于自己对docker还处于只会用命令部署项目的阶段,平时并没有深入了解它,所以一顿操作,把docker的配置文件的删掉了,造成docker上所有的容器都启动不了了。主要我们mysql还是用docker部署的,所以就有了下面这个数据恢复的事情
先交代一下新旧数据库版本
旧的数据库版本(就是被我玩坏的数据库)是5.6,且用docker部署,系统是ubuntu14。然后新的数据库版本(用于数据恢复的数据库)是5.7,不用docker部署,系统是ubuntu18;还有重要的一点是data目录下面的表结构与数据文件还在!
开始正文
- 先找到mysql的配置,默认是在/etcl里面的my.cnf,然后在[mysqld]下面添加
innodb_file_per_table=1;
- 重启mysql;
systemctl restart mysql
- 在mysql里面或者mysql客户端执行以下命令
-- 先设置外键约束检查关闭,不然执行下一步会报错
SET FOREIGN_KEY_CHECKS = 0;
- 创建表结构并分离表空间
-- 创建表结构
CREATE TABLE <表名> {};
-- 分离表空间
ALTER TABLE <表名> DISCARD TABLESPACE;
- 关掉mysql
systemctl stop mysql
-
把.bd文件复制到新数据的data目录下
-
对mysql文件赋予此文件的权限
如果这步没执行,下面那步会报错:Tablespace is missing for table
//先用cd命令进入到ibd文件夹里面再执行以下命令
chown mysql:mysql <表名>.ibd
- 导入表空间
ALTER TABLE <表名> IMPORT TABLESPACE;
- 开启外键约束检查
-- 开启外键约束检查,以保持表结构完整性
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;