只有.frm和.ibd文件时如何批量恢复InnoDB的表---发表到爱可生开源社区

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 很多时候因为MySQL数据库不能启动而造成数据无法访问,但应用的数据通常没有丢失,只是系统表空间等其它文件损坏了,或者遇到MySQL的bug。

背景

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


创建已经丢失的表结构

先要安装mysql-utilities。


yum -y install mysql-server mysql-utilities
apt install mysql-utilities


使用mysqlfrm从.frm文件里面找回建表语句。

分析一个.frm文件生成建表的语句:


mysqlfrm --diagnostic /var/lib/mysql/test/t1.frm


分析一个目录下的全部.frm文件生成建表语句:


root@infokist:~# mysqlfrm --diagnostic /var/lib/mysql/ds_db/bk/ >createtb.sql
root@infokist:~# grep "^CREATE TABLE" createtb.sql |wc -l
124


可以看到一共生成了124个建表语句。

有很多时候也可以从其它库里面生成建表语句,例如同一个应用的其它数据库或不同的测试环境的库,可以采用下面的mysqldump生成建表语句:

mysqldump --no-data --compact ds_db>createtb.sql


登录mysql,生成表


mysql> create database ds_db;
mysql> use ds_db
Database changed
mysql> source createtb.sql
Query OK, 0 rows affected (0.07 sec)
......

导入旧的数据文件

将新建的没有包括数据的.ibd文件抛弃


root@infokist:/var/lib/mysql/ds_db# ll *.ibd|wc
    124    1116    7941
root@infokist:/var/lib/mysql/ds_db# mysql -e "show tables from ds_db" |grep -v  Tables_in_ds_db  |while read a; do mysql -e "ALTER TABLE ds_db.$a DISCARD TABLESPACE"; done
root@infokist:/var/lib/mysql/ds_db# ll *.ibd|wc
ls: cannot access '*.ibd': No such file or directory
      0       0       0


可以看到所有的.idb文件都已经被抛弃了。然后把旧的有数据的.ibd文件拷贝到这个ds_db目录下面,别忘了把属主改过来:chown mysql. *,再把这些数据文件import到数据库中。


root@infokist:/var/lib/mysql/ds_db# mysql -e "show tables from ds_db" |grep -v  Tables_in_ds_db  |while read a; do mysql -e "ALTER TABLE ds_db.$a import TABLESPACE"; done


导入完成后检查表

使用mysqlcheck对数据库ds_db下的所有表进行检查:

root@infokist:/var/lib/mysql/ds_db# mysqlcheck -c ds_db
ds_db.cdp_backup_point                             OK
......


所有的表都导入成功。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之如何用InnoDB引擎创建Federated表
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
59 1
|
存储 关系型数据库 MySQL
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
182 0
|
存储 运维 安全
数据库运维之InnoDB存储引擎表损坏修复方法
InnoDB存储引擎表的损坏可能是多种因素导致的,比如服务器断电、系统崩溃、硬盘损坏、写数据过程中mysqld进程被kill掉。
1058 0
|
存储 关系型数据库 MySQL
MySQL InnoDB表和索引之聚簇索引与第二索引
MySQL InnoDB表和索引之聚簇索引与第二索引
95 0
|
存储 SQL 缓存
【MySQL从入门到精通】【高级篇】(六)MySQL表的存储引擎,InnoDB与MyISAM的对比
上一篇文章介绍了MySQL中SQL语句的执行流程 【MySQL从入门到精通】【高级篇】(五)MySQL的SQL语句执行流程,在介绍执行流程时提到了InnoDB和MyISAM两种存储引擎。这篇文章将来详细介绍下这两种存储引擎。
268 0
【MySQL从入门到精通】【高级篇】(六)MySQL表的存储引擎,InnoDB与MyISAM的对比
|
SQL 关系型数据库 MySQL
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
140 0
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
|
存储 Oracle 关系型数据库
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
187 0
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
|
存储 关系型数据库 MySQL
InnoDB表聚集索引层高什么时候发生变化(2)
InnoDB表聚集索引层高什么时候发生变化
|
存储 关系型数据库 MySQL
InnoDB表聚集索引层高什么时候发生变化(1)
InnoDB表聚集索引层高什么时候发生变化
104 0
|
存储 关系型数据库 MySQL
整体结构&InnoDB数据字典(1) --系统表空间结构(三十三)
整体结构&InnoDB数据字典(1) --系统表空间结构(三十三)