首页数据库navicat恢复数据库 怎么恢复navicat删除的表

navicat恢复数据库 怎么恢复navicat删除的表

编程之家2023-10-21118次浏览

大家好,今天小编来为大家解答navicat恢复数据库这个问题,怎么恢复navicat删除的表很多人还不知道,现在让我们一起来看看吧!

navicat恢复数据库 怎么恢复navicat删除的表

navicat for mysql 里删除的数据表及数据有办法恢复吗

每个 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中存储着字典表的数据。

navicat恢复数据库 怎么恢复navicat删除的表

这里我们需要借助 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.

navicat恢复数据库 怎么恢复navicat删除的表

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 dump 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(适用于较小文件)或 hexdump-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 dumps/default

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

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

5.导入恢复的数据字典

cat dumps/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> dumps/default/actor 2> dumps/default/actor_load.sql

4.最后导入恢复的数据

cat dumps/default/*.sql| mysql sakila

更多详细情况点击

请点击输入图片描述

更多内容点击链接了解网页链接

navicat怎么恢复备份数据

有时候我们在使用navicat自动备份数据库数据之后,想恢复查看备份数据,怎么操作呢,下面来分享一下方法

第一步我们先将原有的数据库删除,新建一个和备份数据同名的数据库。

第二步点击打开新建的数据库,选择下面的“备份”。

第三步右键“备份”,选择“还原备份”

第四步选择需要恢复的“备份数据文件psc”,点击打开

第五步点击“开始”,进行数据恢复。

第六步恢复完,点击“关闭”,刷新表可以看到数据已经恢复了

怎么恢复navicat删除的表

1、打开navicat工具,连接上mysql数据库,选择一个数据库(我们这里为了演示,选择一个测试数据库)。在上方菜单栏,选择备份,然后在备份列表中,选择一个备份文件,点击"还原备份"

navicat41.png

2、在还原备份的对话框中,默认显示常规选项,里面显示的是备份文件的详细信息。这里注意核对信息和时间点,放在恢复到错误的版本

navicat42.png

3、切换到"选择对象"选项,勾选需要恢复的数据对象,默认全部勾选,全量恢复即可

navicat43.png

4、切换到"高级"选项,可以针对服务器选项和对象选项,勾选对应的选项,如果你不想覆盖现有的函数,则把对应的勾选去掉即可

navicat44.png

5、配置勾选完成之后,信息确认完成。则可以点击"开始"按钮,进行还原备份。这里会有一个确认对话框,点击确认开发恢复。恢复完成之后,会在日志信息里提示"[Msg] Finished- Successfully",表示恢复完成。

navicat45.png

navicat46.png

6、针对备份文件,除了可以选择还原备份之外,还可以选择"提取SQL",这个功能可以从之前的备份文件中,抽取出sql语句,然后从sql语句中,选择对应的数据进行增量恢复或用作数据比对。

文章分享结束,navicat恢复数据库和怎么恢复navicat删除的表的答案你都知道了吗?欢迎再次光临本站哦!

上传服务器?服务器上传速度慢怎么解决数据库论坛(论坛数据库出错,打不开论坛,请问该怎么做)