mysql无备份恢复

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: mysql,无备份,恢复,undrop-for-innodb-master

环境: centos 7.4+ mysql 5.7.19

在无备份的情况下数据库损坏时,可以从磁盘文件中恢复出数据,不一定百分百成功,使用的工具是undrop-for-innodb-master.zip

一,从frm恢复表结构(使用mysql-utilities工具)

1,安装mysql-utilities

#yum localinstall mysql-connector-python-2.1.7-1.el7.x86_64 -y
#yum localinstall autoconf mysql-utilities-1.5.6-1.el7.noarch -y

2,从frm文件恢复表结构:

#service mysql start
#mysqlfrm --server=root:root@localhost:3306 --port=3310 --user=mysql   /root/a.frm                 #3310这个端口可以随便写,但是这个端口不能被占用.   root:root@localhost:3306,这个表示登录本机mysql的用户名密码和端口信息
WARNING: Using a password on the command line interface can be insecure.
# Source on localhost: ... connected.
# Spawning server with --user=mysql.
# Starting the spawned server on port 3310 ... done.
# Reading .frm files
#
# Reading the a.frm file.
#
# CREATE statement for ./a.frm:
#

CREATE TABLE `a` (
 `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

#...done.

[root@slave1 ~]# mysqlfrm --server=root:root@localhost:3306 --diagnostic --show-stats  --port=3310 --user=mysql ./servers.frm             ########diagnostic 模式

二,从innodb文件恢复出数据

创建测试表,插入数据

[root@master ~]# yum -y install flex bison
[root@master ~]# unzip undrop-for-innodb-master.zip
[root@master ~]# make
mysql> select * from test.aa;
| id | name |
+----+------+
|  1 | guo  |
|  2 | jia  |
|  3 | tt |
mysql> drop table aa;

1,开始恢复,先停止数据库防止数据写入后覆盖了之前的文件

[root@master ~]# service mysql stop            

2,创建aa表的表结构语句:

[root@master ~]# cd undrop-for-innodb-master/
[root@master undrop-for-innodb-master]# cat aa.sql
CREATE TABLE `aa` (
 `id` int(11) NOT NULL,
 `name` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3,备份并解析ibdata1文件:

[root@master ~]#  cp /data/mysql/ibdata1   undrop-for-innodb-master/ibdata1
[root@master ~]# cd undrop-for-innodb-master/
[root@master ~]# ./stream_parser -f  ./ibdata1
可以看到当前目录下生成了pages-ibdata1文件夹:
[root@master undrop-for-innodb-master]# ll pages-ibdata1/    
drwxr-xr-x 2 root root 4096 Oct  9 11:06 FIL_PAGE_INDEX
drwxr-xr-x 2 root root 4096 Oct  9 11:06 FIL_PAGE_TYPE_BLO
FIL_PAGE_INDEX为索引好的数据页目录,我们要恢复的数据就在这个文件夹里面.
FIL_PAGE_TYPE_BLOB: 如果遇上较大的数据(例如comments里有text类型的数据并且内容较多),InnoDB会使用BLOB类PAGE存储数据。需检查此目录是否有文件。如有,说明此表使用了BLOB,之后提取命令需要用-b参数指定此目录进行提取

4,解析包含aa表信息和索引的页文件

[root@master undrop-for-innodb-master]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql |grep aa
SET FOREIGN_KEY_CHECKS=0;
LOAD DATA LOCAL INFILE '/root/undrop-for-innodb-master/dumps/default/SYS_TABLES' REPLACE INTO TABLE `SYS_TABLES` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_TABLES\t' (`NAME`, `ID`, `N_COLS`, `TYPE`, `MIX_ID`, `MIX_LEN`, `CLUSTER_NAME`, `SPACE`);
0000011FCC26    3C0000012E19FE  SYS_TABLES      "test/aa"       379     2       33      0       80      ""      527

5,根据主索引值(379)去其余表查询aa表的其他信息:

aa表结构在"dictionary/SYS_INDEXES.sql"文件中可以看到,而此表对应的数据页文件是第三个数据页0000000000000003.page,于是:
[root@master undrop-for-innodb-master]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql |grep 379
SET FOREIGN_KEY_CHECKS=0;
LOAD DATA LOCAL INFILE '/root/undrop-for-innodb-master/dumps/default/SYS_INDEXES' REPLACE INTO TABLE `SYS_INDEXES` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_INDEXES\t' (`TABLE_ID`, `ID`, `NAME`, `N_FIELDS`, `TYPE`, `SPACE`, `PAGE_NO`);
0000011FCC26    3C0000012E1957  SYS_INDEXES     379    479    "PRIMARY"       1       3       527     4294967295

6,根据索引值479去页文件中查找数据

找到了aa表的主键索引信息后,其对应在mysql存储中的索引值为479,该索引标号对应的数据页文件中即存储了该索引的全部数据,于是扫描全盘找到对应的索引文件:(如果pages-ibdata1目录下存在479号索引文件,那就不需要再进行磁盘扫描,可以跳过步骤6)
[root@master undrop-for-innodb-master]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        99G   83G   11G  89% /
devtmpfs        3.9G     0  3.9G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
[root@master undrop-for-innodb-master]# ./stream_parser -f /dev/vda1 -t 70000000k     #mysql的数据存储在这个分区里面,所以需要扫描这个分区的所有页文件

7,恢复数据:

[root@master undrop-for-innodb-master]# ./c_parser -6f pages-vda/FIL_PAGE_INDEX/0000000000000479.page -t aa.sql    #aa.sql是最开始时候创建的表结构sql语句
[root@master undrop-for-innodb-master]# ./c_parser -6f pages-vda/FIL_PAGE_INDEX/0000000000000479.page -t aa.sql > dumps/default/t_aa 2> dumps/default/t_aa.sql
[root@master undrop-for-innodb-master]#  mysql -uroot -p123456 test
> source /root/undrop-for-innodb-master/aa.sql;
> source /root/undrop-for-innodb-master/dumps/default/t_aa.sql;
> select * from aa;
| id | name |
+----+------+
|  1 | guo  |
|  2 | jia  |
|  3 | tt |

至此数据全部恢复成功!
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战
|
3月前
|
关系型数据库 MySQL 机器人
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
|
3月前
|
运维 关系型数据库 MySQL
"MySQL运维精髓:深入解析数据库及表的高效创建、管理、优化与备份恢复策略"
【8月更文挑战第9天】MySQL是最流行的开源数据库之一,其运维对数据安全与性能至关重要。本文通过最佳实践介绍数据库及表的创建、管理与优化,包括示例代码。涵盖创建/删除数据库、表结构定义/调整、索引优化和查询分析,以及数据备份与恢复等关键操作,助您高效管理MySQL,确保数据完整性和系统稳定运行。
347 0
|
11月前
|
关系型数据库 MySQL 数据库
零基础带你学习MySQL—备份恢复数据库(三)
零基础带你学习MySQL—备份恢复数据库(三)
|
关系型数据库 MySQL 测试技术
MySQL备份恢复-2
MySQL备份恢复-2
94 0
|
存储 安全 关系型数据库
MySQL备份恢复
MySQL备份恢复
89 0
|
SQL 监控 关系型数据库
MySQL 备份恢复
MySQL 备份恢复
|
关系型数据库 MySQL 数据库
RDS for MySQL8.0物理备份恢复到本地自建数据库
此文章是centos7下的恢复流程。 1、安装MySQL8.0(采用yum方式安装):wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm yum localinstall mysql80-community-release-el7-1.noarch.rpm yum -y install yum-utils 默认安装的就是8.0版本yum install mysql-community-server 安装好了不要启动数据库。
|
SQL 存储 关系型数据库
mysql 中的备份恢复、分区分表、主从复制、读写分离
数据库 mysql 的灾难恢复,高并发必备知识
361 3
mysql 中的备份恢复、分区分表、主从复制、读写分离
|
SQL 安全 关系型数据库
RDS SQL Server 备份恢复到本地报错:Cannot find server certificate with thumbprint
RDS SQL Server 备份恢复到本地报错:Cannot find server certificate with thumbprint