问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

mysql卸载后怎么找回原来建的数据库?

发布网友 发布时间:2022-04-22 00:15

我来回答

2个回答

热心网友 时间:2022-04-07 20:11

每个 DBA 是不是都有过删库的经历?删库了没有备份怎么办?备份恢复后无法启动服务什么情况?表定义损坏数据无法读取怎么办? 

我曾遇到某初创互联网企业,因维护人员不规范的备份恢复操作,导致系统表空间文件被初始化,上万张表无法读取,花了数小时才抢救回来。

当你发现数据无法读取时,也许并非数据丢失了,可能是 DBMS 找不到描述数据的信息。


背景

先来了解下几张关键的 InnoDB 数据字典表,它们保存了部分表定义信息,在我们恢复表结构时需要用到。

SYS_TABLES 描述 InnoDB 表信息CREATE TABLE `SYS_TABLES` (`NAME` varchar(255) NOT NULL DEFAULT '',  表名`ID` bigint(20) unsigned NOT NULL DEFAULT '0',  表id`N_COLS` int(10) DEFAULT NULL,`TYPE` int(10) unsigned DEFAULT NULL,`MIX_ID` bigint(20) unsigned DEFAULT NULL,`MIX_LEN` int(10) unsigned DEFAULT NULL,`CLUSTER_NAME` varchar(255) DEFAULT NULL,`SPACE` int(10) unsigned DEFAULT NULL,   表空间idPRIMARY KEY (`NAME`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_INDEXES 描述 InnoDB 索引信息CREATE TABLE `SYS_INDEXES` (  `TABLE_ID` bigint(20) unsigned NOT NULL DEFAULT '0', 与sys_tables的id对应  `ID` bigint(20) unsigned NOT NULL DEFAULT '0',  索引id  `NAME` varchar(120) DEFAULT NULL,         索引名称  `N_FIELDS` int(10) unsigned DEFAULT NULL, 索引包含字段的个数  `TYPE` int(10) unsigned DEFAULT NULL,  `SPACE` int(10) unsigned DEFAULT NULL,  存储索引的表空间id  `PAGE_NO` int(10) unsigned DEFAULT NULL,  索引的root page id  PRIMARY KEY (`TABLE_ID`,`ID`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_COLUMNS 描述 InnoDB 表的字段信息CREATE TABLE `SYS_COLUMNS` (  `TABLE_ID` bigint(20) unsigned NOT NULL, 与sys_tables的id对应  `POS` int(10) unsigned NOT NULL,     字段相对位置  `NAME` varchar(255) DEFAULT NULL,    字段名称  `MTYPE` int(10) unsigned DEFAULT NULL,  字段编码  `PRTYPE` int(10) unsigned DEFAULT NULL, 字段校验类型  `LEN` int(10) unsigned DEFAULT NULL,  字段字节长度  `PREC` int(10) unsigned DEFAULT NULL, 字段精度  PRIMARY KEY (`TABLE_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_FIELDS 描述全部索引的字段列CREATE TABLE `SYS_FIELDS` (  `INDEX_ID` bigint(20) unsigned NOT NULL,  `POS` int(10) unsigned NOT NULL,  `COL_NAME` varchar(255) DEFAULT NULL,  PRIMARY KEY (`INDEX_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;./storage/innobase/include/dict0boot.h 文件定义了每个字典表的 index id,对应 id 的 page 中存储着字典表的数据。

这里我们需要借助 undrop-for-innodb 工具恢复数据,它能读取表空间信息得到 page,将数据从 page 中提取出来。

# wget https://github.com/chhabhaiya/undrop-for-innodb/archive/master.zip# yum install -y gcc flex bison# make# make sys_parser

# ./sys_parser 读取表结构信息

sys_parser [-h] [-u] [-p] [-d] databases/table

stream_parser 读取 InnoDB page 从 ibdata1 或 ibd 或分区表

# ./stream_parserYou must specify file with -f optionUsage: ./stream_parser -f <innodb_datafile> [-T N:M] [-s size] [-t size] [-V|-g]  Where:    -h         - Print this help    -V or -g   - Print debug information    -s size    - Amount of memory used for disk cache (allowed examples 1G 10M). Default 100M    -T         - retrieves only pages with index id = NM (N - high word, M - low word of id)    -t size    - Size of InnoDB tablespace to scan. Use it only if the parser can't determine it by himself.

c_parser 从 innodb page 中读取记录保存到文件

# ./c_parserError: Usage: ./c_parser -4|-5|-6 [-dDV] -f <InnoDB page or dir> -t table.sql [-T N:M] [-b <external pages directory>]  Where    -f <InnoDB page(s)> -- InnoDB page or directory with pages(all pages should have same index_id)    -t <table.sql> -- CREATE statement of a table    -o <file> -- Save mp in this file. Otherwise print to stdout    -l <file> -- Save SQL statements in this file. Otherwise print to stderr    -h  -- Print this help    -d  -- Process only those pages which potentially could have deleted records (default = NO)    -D  -- Recover deleted rows only (default = NO)    -U  -- Recover UNdeleted rows only (default = YES)    -V  -- Verbose mode (lots of debug information)    -4  -- innodb_datafile is in REDUNDANT format    -5  -- innodb_datafile is in COMPACT format    -6  -- innodb_datafile is in MySQL 5.6 format    -T  -- retrieves only pages with index id = NM (N - high word, M - low word of id)    -b <dir> -- Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/    -i <file> -- Read external pages at their offsets from <file>.    -p prefix -- Use prefix for a directory name in LOAD DATA INFILE command



接下来,我们演示场景的几种数据恢复场景。

场景1:drop table

是否启用了 innodb_file_per_table 其恢复方法有所差异,当发生误删表时,应尽快停止MySQL服务,不要启动。若 innodb_file_per_table=ON,最好只读方式重新挂载文件系统,防止其他进程写入数据覆盖之前块设备的数据。

如果评估记录是否被覆盖,可以表中某些记录的作为关键字看是否能从 ibdata1 中筛选出。

# grep WOODYHOFFMAN ibdata1

Binary file ibdata1 matches

也可以使用 bvi(适用于较小文件)或 hexmp -C(适用于较大文件)工具

以表 sakila.actor 为例CREATE TABLE `actor` (`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`actor_id`),KEY `idx_actor_last_name` (`last_name`)) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8

首先恢复表结构信息1. 解析系统表空间获取 page 信息

./stream_parser -f /var/lib/mysql/ibdata1

2. 新建一个 schema,把系统字典表的 DDL 导入

cat dictionary/SYS_* | mysql recovered

3. 创建恢复目录

mkdir -p mps/default

4. 解析系统表空间包含的字典表信息,

./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql > mps/default/SYS_TABLES 2> mps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page -t dictionary/SYS_COLUMNS.sql > mps/default/SYS_COLUMNS 2> mps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql > mps/default/SYS_INDEXES 2> mps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.page -t dictionary/SYS_FIELDS.sql > mps/default/SYS_FIELDS 2> mps/default/SYS_FIELDS.sql

5. 导入恢复的数据字典

cat mps/default/*.sql | mysql recovered

6. 读取恢复后的表结构信息

./sys_parser -pmsandbox -d recovered sakila/actor

由于 5.x 版本 innodb 引擎并非完整记录表结构信息,会丢失 AUTO_INCREMENT 属性、二级索引和外键约束, DECIMAL 精度等信息。

若是 mysql 5.5 版本 frm 文件被从系统删除,在原目录下 touch 与原表名相同的 frm 文件,还能读取表结构信息和数据。若只有 frm 文件,想要获得表结构信息,可使用 mysqlfrm --diagnostic /path/to/xxx.frm,连接 mysql 会显示字符集信息。


    innodb_file_per_table=OFF

    因为是共享表空间模式,数据页都存储在 ibdata1,可以从 ibdata1 文件中提取数据。

    1. 获取表的 table id,sys_table 存有表的 table id,sys_table 表 index id 是1,所以从0000000000000001.page 获取表 id./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0


    2. 利用 table id 获取表的主键 id,sys_indexes 存有表索引信息,innodb 索引组织表,找到主键 id 即找到数据,sys_indexes 的 index id 是3,所以从0000000000000003.page 获取主键 id

    ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx_actor_last_name"        1       0       0       4294967295000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx_actor_last_name"        1       0       0       4294967295


    3. 知道了主键 id,就可以从对应 page 中提取表数据,并生成 sql 文件。

    ./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t sakila/actor.sql > mps/default/actor 2> mps/default/actor_load.sql


    4. 最后导入恢复的数据

    cat mps/default/*.sql | mysql sakila

    更多详细情况点击

    网页链接

    请点击输入图片描述

热心网友 时间:2022-04-07 21:29

如果是windows里面安装的,那么一般在C:\Program Files\MySQL\MySQL Server 5.0\data里面有。
如果是linux系统的源代码编译的,一般在/usr/local/mysql/var里面有mysql的数据库文件。
PS:.frm扩展名的为存储表定义文件,.MYD是MYData,存储数据,.MYI是MYIndex,存储索引。
如果安装的目录和数据库文件存放的路径是独立的,那么一般卸载了mysql数据库软件后,并没有自动删除数据库文件。到data目录里面找。
mysql卸载后怎么找回原来建的数据库?

如果安装的目录和数据库文件存放的路径是独立的,那么一般卸载了mysql数据库软件后,并没有自动删除数据库文件。到data目录里面找。卢韬旭 本回答被网友采纳 已赞过 已踩过&lt; 你对这个回答的评价是? 评论 收起 枝祺祥SF 2017-07-31 · TA获得超过231个赞 知道小有建树答主 回答量:277 采纳率:0% 帮...

重装系统后,如何调用之前mysql的数据

操作方法:1、把原来mysql安装目录下的data文件夹拷出来;2、拷出来的data文件夹里,除了mysql、test子文件夹外的子文件夹,全部都是数据库,如下图所示全部都是一个个的数据库;这是你就可以将你的表结构放到新的数据库里面了,但是,当你打开表的时候会提示“数据表不存在”,这是因为储存数据的i...

...发现我把别人的Mysql数据库给覆盖了,有没有办法找回来?

1、这个应该很难找回来了, 你应该去问问专业的数据找回人士。2、一台机器上可以装上N多个数据库,很正常啊, 我电脑现在有接近20个库,900多个表。总之兄弟,下次小心点……

服务器系统重装后,怎么恢复原来的MYSQL数据

windows下通过管理工具的‘服务’项来停止和启动mysql(最好在mysql里建一个和以前同名的数据库,然后停止服务);文件复制:data文件夹内的‘mysql’文件夹、‘数据库名’文件夹(与数据库同名是表结构)、ibdata1(是元数据)三个复制到新安装MySQL的data文件夹内;3 启动服务器:把data文件夹下面的...

mysql卸载后数据库表还在吗

存在,删除Mysql软件的时候,之前创建数据和表都还在之前安装目录的“data”文件夹下面

卸载mysql时中出现回滚怎么办 该怎么解决

使用sqlbinlog会产生bin文件,恢复就需要用到这些文件。文件中记录着数据库的所有操作。(此方法的操作是将数据库之前所执行的语句重新执行一次,以达到恢复效果)具体步骤:1,先找到bin文件,一般都是在mysql的data文件夹中,结尾以.00000X等形式结束。2,寻找需要还原的时间点 使用语句 mysqlbinlog...

MySQL卸载问题不在卸载程序列表中怎么办mysql不在卸载程序里_百度知 ...

一、手动卸载MySQL 1.找到MySQL安装目录 我们需要查找MySQL的安装目录。MySQL通常安装在C盘下面的Program Files文件夹下,因此我们可以直接进入该文件夹,并找到MySQL文件夹。2.删除MySQL文件夹 找到MySQL文件夹后,我们可以将其直接删除。但是,这只是删除了MySQL的程序文件,MySQL的服务仍然存在于系统中,需要...

mysql登不上去,怎么把里面的数据备份出来?

输入下面代码 mysqldump -uroot -p密码 数据库名字 &gt; 路径+导出备份文件名字.sql 比如mysqldump -uroot -pmima mydatabase &gt; C:/beifen.sql 这样就把你的数据库导出在C盘,并且文件名字叫beifen.sql 然后重装mysql以后,在命令行里(开始——》运行——》输入cmd)输入 mysql -uroot -p密码 &lt; 路径...

为什么我把MySQL卸载了重新安装过后启动的时候要以前的密码,怎么才能不...

不是删除注册表,也不是用360清理能解决,应该删除以前按照的文件夹,特别是那个data的数据库文件夹,密码是在data\mysql里面的,删除了这个文件夹就可以了,否则重装只更新软件,不更新数据库,仍然是使用以前的用户、密码、授权。

mysql数据库卸载和重新安装的问题

进入你的MySQL bin目录下,例如我的是 C:\Program Files\MySQL\MySQL Server 5.0\bin 然后使用如下命令mysqld-nt -remove 然后就会显示...success!好了下面进入添加删除程序,找到MySQL选择卸载,记得选择remove。最后将MySQL目录删除,还有数据库的目录也删除。原文地址:http://www.chinaz.com/Program...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
百泌达的注意事项 DMPK系列 | 多肽药物的药代特征、研究策略及案例分享 张清出身绰号 吃过西瓜可以吃阿莫西林克拉维酸钾干混剂吗 想在win7的系统下装一个linux的虚拟机,有linux系统终端... 驼色大衣搭配什么款式的围巾好看 150公斤的生意宝电子称只能称15公斤,超过15公斤就报警,怎么调回150... 定速巡航会自动刹车吗 美国在韩国部署萨德,对中国有哪些威胁? 腾讯课堂可以看在线时长吗 仔细看图小刺猬遇见了什么麻烦他是怎么想的怎么做... mysql的数据库文件是哪个呀 儿童神奇的童话故事段落 mysql中建立的 数据库 在哪里可以找到?? 帮我找一个小候子和小刺猬的故事 mysql的数据库文件存在哪里?按照网上的方法找不着... 小刺猬帮小猴子运苹果看图写话技茄子版这个作文怎... 小猴子为什么夸奖小刺猬勇敢? mysql数据库建立的数据库在哪个文件夹? 小猴和小刺猬看图说话 看图写话小猴子和小刺猬 MySQL 的数据库文件存在哪里 后缀名是什么 MYSQL数据库文件在哪个目录 怎么查看mysql数据库数据文件 mysql的数据库文件是哪个? 职业素养的十大要素 怎样查看MySql数据库物理文件存放位置 奥克斯空调制热时内外机都没反应 中职职业素养能力的总结800字 mysql的数据库文件在哪个目录下,我怎么找不到 小刺猬排在第15位,小猴排在第3位。他们之间有多少... 怎样查看MySQL生产的数据库文件 看图写话二年级帮小候拿掉到水里的帽子? 一年级看图写话图片和范文小刺猬和小猴在桃树下 小猴去摘果子小刺猬帮忙运果子看图说话 森林有小兔,猴子,刺猬要写个童话故事怎么写 它们拼成一座桥让小猴子和小刺猬过河中间有没有标... Mysql安装完成后,数据库文件在什么位置 小动物们排队去参加森林音乐会小刺猬排在第15名,... 小刺猬有3只小猴子有6只小猴子的只数是小刺猬的多少倍 如何打开Mysql数据库文件 小猴去摘桃,小刺猬来帮忙作文 小刺猬帮小猴子把果子送到家,小猴子对他说什么,做... 小刺猬排在第十五小猴子排在第三,小刺猬和小猴之... 小刺猬和小猴子之间还有几只小动物, 小刺猬排第九... 炝大头菜的做法,炝大头菜怎么做好吃,炝大头菜 炝拌大头菜的做法窍门 的做法,呛拌大头菜怎么做好吃,呛拌大头菜的家常做法 炝拌大头菜的做法步骤图,炝拌大头菜怎么做 炝炒大头菜
  • 焦点

最新推荐

猜你喜欢

热门推荐