随着数据库应用越来越广泛,数据库作为企业数据存储管理的主要方式,它的数据稳定性以及安全性变得越来越重要。虽然现在数据库厂商有很多解决方案和办法在数据丢失时找回数据,但是在实际的应用过程中,仍然难免出现数据的丢失。数据库表空间丢失,数据丢失这种情况极大地影响了企业的正常运营。那么在这种情况下,我们应该如何处理呢?
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了嘉黎免费建站欢迎大家使用!
一、数据丢失原因
在正式开始解决数据丢失问题之前,必须先明确其根本原因。数据丢失的原因可能包括以下因素:
1.硬件故障:硬盘故障、硬盘坏道等硬件问题可能会导致数据的丢失。
2.软件故障:操作系统升级、数据库软件故障也可能导致数据的丢失。
3.非法操作:不当的删除和修改、脚本错误和非法的操作等原因也可能导致数据的丢失。
4.恶意攻击:黑客攻击或者病毒感染等安全问题也可能导致数据的丢失。
二、解决方法
1.备份数据
对于数据库中重要的数据,建议至少备份三份,分别存储在不同的设备中。在数据丢失时,我们可以通过备份数据来恢复数据。
2.数据恢复
在数据丢失时,首先要确认数据是否有备份,如果有备份,可以直接通过备份数据来恢复数据。如果没有备份,则需要通过恢复工具进行数据恢复。目前市面上有很多恢复工具可以使用,用户可以根据自己的需求选择适合自己的工具进行数据恢复。
3.联系数据库厂商技术支持
如果用户在使用数据库过程中遇到数据丢失问题,建议之一时间联系数据库厂商技术支持。数据库厂商技术支持人员有着专业的知识和技能,可以帮助用户快速解决问题。
除此之外,为了避免数据丢失,我们应该采取一些措施来提高数据的稳定性和安全性。
1.定期备份数据
建议用户定期备份数据库中的重要数据,至少每周备份一次。
2.使用合适的硬件设备
在选择硬件设备时,应该选择一些抗震、防潮、耐用的硬盘,这样可以降低硬盘故障的几率。
3.数据库权限管理
建议管理员对数据库中的权限进行适当的控制,只授权给必须的人员。这样可以避免非法操作导致的数据丢失。
4.加强数据库安全管理
建议管理员对数据库进行加密和备份,加强安全措施,确保数据不被恶意攻击和病毒感染。
在面对数据库表空间丢失、数据丢失的情况时,我们应该冷静分析原因,采取合适的方法来解决问题,并加强数据库的安全管理,防止数据丢失再次发生。
成都网站建设公司-创新互联,建站经验丰富以策略为先导10多年以来专注数字化网站建设,提供企业网站建设,高端网站设计,响应式网站制作,设计师量身打造品牌风格,热线:028-869222201 找个别的机器安装个同版本的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/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
更多详细情况点击
网页链接
问题已经解决了,都是在网上找的!
把这过程中遇到的问及解决办法和大家分享一下!
首先出现问题的过程如上所说!然后我试图找到恢复介质的办法!
网上有朋友说是数据库为非归档模式造成的,要将其改为归档模式:
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 xxxx 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文件占用空间。
关于数据库表空间丢了的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
成都网站建设选创新互联(☎:028-86922220),专业从事成都网站制作设计,高端小程序APP定制开发,成都网络营销推广等一站式服务。
本文题目:数据库表空间丢失,数据丢失怎么办?(数据库表空间丢了)
网页URL:http://www.shufengxianlan.com/qtweb/news21/555521.html
成都网站建设公司_创新互联,为您提供品牌网站设计、Google、自适应网站、网站排名、网站营销、建站公司
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联