在数字化时代,数据库是企业的重要资产,它存储了企业的重要数据,例如客户信息、订单记录、工作文件等等。因此,当数据库数据丢失或损坏时,企业将面临严重的损失,从而影响业务。

意外删去数据库是常见的数据丢失原因之一。这种情况发生在很多人身上,如果没有备份,就意味着数据完全丢失。但是,许多人没有意识到,即使数据库被意外删除了,它的数据仍然可以恢复。本文将讨论有关数据恢复的问题,并提供一些简单的方法,用于恢复被删除的数据库和数据。

如何恢复数据库?

1. 恢复软件:从存储介质上找回已删除的文件。

如果只是误删了一个表或一个数据库,而且零散,那么可以使用一些恢复软件来找回文件。例如Recuva、EaseUS Data Recovery Wizard等。这些恢复软件可以扫描存储设备,找到被删除的文件并恢复它们。这对于单个且零散的文件非常有用,但当文件数目非常多时,这些软件工具难以应对。仅获得了零散的数据,还需要进行进一步的处理。

2. 数据库备份:恢复数据库

备份是常见又重要的恢复方法。数据库备份可以使您轻松地从完全丢失的数据中恢复数据。无论您是使用第三方软件还是数据库自带的备份程序,备份都应该是一个重要的前提。保持最新的备份可以保证您的数据在意外情况下有备份可恢复。

恢复备份的流程

使用备份进行恢复有以下两种情况:

1. 只需恢复数据,而不恢复整个数据库

这种情况在小型数据库管理系统中非常常见。通常情况下,您可以备份表或数据库的所有备份。如果发生数据丢失,您可以使用备份将它们恢复回来。使用数据库管理软件中的还原的功能,您可以选择要恢复的表并将它们恢复到最新状态。

2. 恢复整个数据库

在较大的数据库环境中,恢复整个数据库的过程可能会更加复杂。通常,您需要将初始备份复制到一个新的位置,并还原最新的备份。此外,恢复的顺序也非常重要,因为如果顺序不对,可能会引起进一步的损坏。

如何避免数据库数据丢失?

除了备份之外,还有一些可以使用来保护您的数据库不被删除或损坏。以下是一些建议:

1. 定期备份数据库

如前所述,备份是恢复被删除的数据库最容易且便捷的方法。定期备份可以保证数据得到最新与完整的恢复。

2. 避免意外删除

意外删除是导致数据丢失的常见原因之一。通过使用数据库回收站或限制操作权限,可以避免意外删除。例如,只将删除权限授予操作管理员。

3. 检查并修复数据库

定期检查和修复数据库可以保证数据库系统的稳定运行,避免数据丢失或损坏。大多数数据库软件都具有自动检查和修复功能,使用它们可以避免人为错误。

结论

当数据库被意外删除时,数据并没有真正丢失。通过使用一些简单的恢复方法,可以重新获得数据。但是,为了保护数据库和数据,必须定期备份数据库,并使用其他方法避免在不必要的情况下删除或损坏数据。只有这样,数据的安全才能得到保障。

相关问题拓展阅读:

求助,不小心删除数据库了,有什么办法恢复

有的,删除后停止往删除数据库那分区写任何数据。然后联巧老辩孝缺系专业的数含烂据恢复公司。删除后数据库基本成碎片了,常规恢复软件恢复不了。如需帮助请百度:成都和信数据恢复

把mysql数据库删了,请问可以恢复吗

1.如果有备份,洞春兆恢复备份数据就可以。

2.如果在企业管理器里删除了数据库,如果有备份,恢纳租复备份数据就可以。

3. 如果你是在程序里卸载sql程序,数据就在sql安装目录里,附加数据库就可以了。

4.如果备份数据都没有,可以找个硬盘数据恢复森键公司。

2.如者伏果在企业管理器里删除了数据库,如果有备份,恢复备份数据就可以。3.如果你是在程序里卸载sql程序,数据就在sql安首明携装槐卖目录里,附加数据库就可以了。

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

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

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

背景

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

SYS_TABLES 描述 InnoDB 表信息CREATE TABLE SYS_TABLES (NAME varchar(255) NOT NULL DEFAULT ”,  表名ID bigint(20) unsigned NOT NULL DEFAULT ‘0’,  表idN_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 yum install -y gcc flex bison# make# make sys_parser

# ./sys_parser 读取表结构信息

sys_parser databases/table

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

# ./stream_parserYou must specify file with -f optionUsage: ./stream_parser -f  Where:    -hPrint this help    -V or -g   – Print debug information    -s size    – Amount of memory used for disk cache (allowed examples 1G 10M). Default 100M    -Tretrieves 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 -f -t table.sql  Where    -f — InnoDB page or directory with pages(all pages should have same index_id)    -t — CREATE statement of a table    -o — Save dump in this file. Otherwise print to stdout    -l — 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)innodb_datafile is in REDUNDANT formatinnodb_datafile is in COMPACT formatinnodb_datafile is in MySQL 5.6 format    -T  — retrieves only pages with index id = NM (N – high word, M – low word of id)    -b — Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/    -i — Read external pages at their offsets from .    -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 allint(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/01.page -t dictionary/SYS_TABLES.sql > dumps/default/SYS_TABLES 2> dumps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/02.page -t dictionary/SYS_COLUMNS.sql > dumps/default/SYS_COLUMNS 2> dumps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/03.page -t dictionary/SYS_INDEXES.sql > dumps/default/SYS_INDEXES 2> dumps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/04.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,所以从01.page 获取表 id./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/01.page -t dictionary/SYS_TABLES.sql | grep sakila/actorB28  2AD4D  SYS_TABLES  “sakila/actor”  0   “”B28  2AD4D  SYS_TABLES  “sakila/actor”  0   “”  0

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

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/03.page -t dictionary/SYS_INDEXES.sql | grepBABCA  SYS_INDEXES”PRIMARY”BAC3C  SYS_INDEXES”idx_actor_last_name”BABCA  SYS_INDEXES”PRIMARY”BAC3C  SYS_INDEXES”idx_actor_last_name”

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

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

4. 最后导入恢复的数据

cat dumps/default/*.sql | mysql sakila

更多详细情况点击

网页链接

关于数据库删了能恢复吗的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。