数据库表空间丢失,数据丢失怎么办? (数据库表空间丢了)

随着数据库应用越来越广泛,数据库作为企业数据存储管理的主要方式,它的数据稳定性以及安全性变得越来越重要。虽然现在数据库厂商有很多解决方案和办法在数据丢失时找回数据,但是在实际的应用过程中,仍然难免出现数据的丢失。数据库表空间丢失,数据丢失这种情况极大地影响了企业的正常运营。那么在这种情况下,我们应该如何处理呢?

一、数据丢失原因

在正式开始解决数据丢失问题之前,必须先明确其根本原因。数据丢失的原因可能包括以下因素:

1.硬件故障:硬盘故障、硬盘坏道等硬件问题可能会导致数据的丢失。

2.软件故障:操作系统升级、数据库软件故障也可能导致数据的丢失。

3.非法操作:不当的删除和修改、脚本错误和非法的操作等原因也可能导致数据的丢失。

4.恶意攻击:黑客攻击或者病毒感染等安全问题也可能导致数据的丢失。

二、解决方法

1.备份数据

对于数据库中重要的数据,建议至少备份三份,分别存储在不同的设备中。在数据丢失时,我们可以通过备份数据来恢复数据。

2.数据恢复

在数据丢失时,首先要确认数据是否有备份,如果有备份,可以直接通过备份数据来恢复数据。如果没有备份,则需要通过恢复工具进行数据恢复。目前市面上有很多恢复工具可以使用,用户可以根据自己的需求选择适合自己的工具进行数据恢复。

3.联系数据库厂商技术支持

如果用户在使用数据库过程中遇到数据丢失问题,建议之一时间联系数据库厂商技术支持。数据库厂商技术支持人员有着专业的知识和技能,可以帮助用户快速解决问题。

除此之外,为了避免数据丢失,我们应该采取一些措施来提高数据的稳定性和安全性。

1.定期备份数据

建议用户定期备份数据库中的重要数据,至少每周备份一次。

2.使用合适的硬件设备

在选择硬件设备时,应该选择一些抗震、防潮、耐用的硬盘,这样可以降低硬盘故障的几率。

3.数据库权限管理

建议管理员对数据库中的权限进行适当的控制,只授权给必须的人员。这样可以避免非法操作导致的数据丢失。

4.加强数据库安全管理

建议管理员对数据库进行加密和备份,加强安全措施,确保数据不被恶意攻击和病毒感染。

在面对数据库表空间丢失、数据丢失的情况时,我们应该冷静分析原因,采取合适的方法来解决问题,并加强数据库的安全管理,防止数据丢失再次发生。

相关问题拓展阅读:

mysql数据库被删除怎么恢复

1 找个别的机器安装个同版本的mysql或从已安装同版本的其他机器上(非同版本的也可以试下):

拷贝 mysql/data/mysql 目录到你的mysql/data/ 下吧

2 试着启动mysql服务,如果能启动了,理论上应该丢失的只有用户、授权等一些系统掘槐信息,不影响你的使用的数据;

如果不能启动,看错误日志,争取启动了。

3 赶紧把数据备份一份出来,重新把判渗友所有喊兄库(只是你后来创建的业务相关的库,不包括mysql库)都删了,重新导入一遍。理论上不这样也可以,但只是非生产重要的环境下。

4 重新做用户授权。

每个 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 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/.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

更多详细情况点击

网页链接

关于Oracle表空间移动后需要介质恢复的问题!

问题已经解决了,都是在网上找的!

把这过程中遇到的问及解决办法和大家分享一下!

首先出现问题的过程如上所说!然后我试图找到恢复介质的办法!

网上有朋友说是数据库为非归档模式造成的,要将其改为归档模式:

1.cmd;

2.sqlplus/nolog;

4.connect/as sysdba;

这时报了一个错:协议适配器错误

造成此问题的原因可能有三个:(此方法网上有)

a.监听服务没有起起来。windows平台个一如下操作:开始—程序—管理工具—服务,打开服务面板,启动oraclehome92TNSlistener服务。

b.database instance没有起起来。windows平台如下操作:开始—程序—管理工具—服务,打开服务面板,启动oracleserviceXXXX,XXXX就是你的database SID

c.注册表问题。regedit,然后进入HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0将该环境变量ORACLE_SID设置为XXXX,XXXX就是你的database SID.或者右几我的电脑,属性–高级–环境变量—系统变量–新建,变量名=oracle_sid,变量值=XXXX,XXXX就是你的database SID.或者进入sqlplus前,在command line下输set oracle_sid=XXXX,XXXX就是你的database SID

此时“协议适配器错误 ”应该就能解决了!

5.若数据库是打开的,首先关闭卸载数据库。shotdown;

这时可能出现长时间等待,可以把Oracle服务重新启动一下再重复上面的步骤即可!

6.以mount模式打开数据库:STARTUP MOUNT;

7.查询当前归档模式:ARCHIVE LOG LIST;

如果数据库日志模式为非存档模式则更改归档模式为ARCHIVELOG:ALTER DATABASE ARCHIVELOG;

再查询一下:ARCHIVE LOG LIST=》数据库日志模式 存档模式

如果要更改为非归档模式:ALTER DATABASE NOARCHIVELOG;

8.再打开数据库: ALTER DATABASE OPEN;

归档模式更改完毕!

9.第九步也是最关键的一步:恢复介质

recover datafile ‘新的数据文件路径’;

10. alter tablespace x online; SQL》表空间已更改。

使用alter database 移动数据文件时,在执行完alter database rename to 命令之后,再试图打开数据库:alter database open。可能会报类似如下的错:

ORA-01113:文件7需要介质恢复

ORA-01110:数据文件7:’E:ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF’。

这是由于数据库认为这个数据文件遭到破坏了,需要使用recover命令通过备份、日志信息来恢复。数据库的备份恢复是个比较复杂的问题,但是这个实例的解决办法还是比较简单的。

执行命令:

recover datafile ’E:ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF’

提示完成介质恢复,再打开数据库:alter database open。一切正常。

通过该alter database open;命令查看是否有其他数据文件损坏,依次进行恢复,直至所有文件正常。

Oracle DBA神器:PRM-DUL灾难恢复工具可以直接从这种受损的Oracle数据库中将数据拯救出来。

当你的数据库因为ORA-00600/ORA-07445或其他ORA-报错,或丢失关键的system表空间数据文件,或A diskgroup损坏时均可以考虑采用PRM-DUL来做恢复。PRM-DUL采用独创的DataBridge恢复技术,直接从数据文件中抽取数据后可以像DBLINK那样直接插入到新建数据库中,而无需数据落地成为DMP文件占用空间。

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


数据运维技术 » 数据库表空间丢失,数据丢失怎么办? (数据库表空间丢了)