没有控制文件怎么恢复数据库文件恢复dbms

数据库设计系列11--选择文件组织方式和索引
20%80%80/20/12312,
DBMSDBMSDBMS
1.2.3.4.5.orderbygroup by6.7.8.9.25%10.
<span type="1" blog_id="59573" userid='
分享到朋友圈
好的文章,和好友一起分享Oracle数据库数据丢失之后的恢复方法_OTPUB_领先的IT学习&直播平台
Oracle数据库数据丢失之后的恢复方法
日期:&&&&&&来源:ITpub&&&&&&作者:佚名&&&&&&编辑:otpub&&&&&&点击:497次
不管是在日常的数据库测试开发还是运维过程中,大家都有可能因为误操作导致数据库数据丢失、错误更新等问题,让你在那一瞬间恨不得剁掉按回车键的那个手指,同时也希望有方法能立即恢复相关数据,刚好,oracle 提供了一些强大的方法或机制,可以让你找到 “后悔药”。根据 的特点和提供的工具,主要方法有以下几种方法:1.利用逻辑备份使用 import 工具丢失数据的表2、利用物理备份来通过还原数据文件并进行不完全恢复3、利用 dbms_logmnr 包从 redo log 文件中恢复4、利用 flashback 特性恢复数据为了方便使用方法的介绍,上述恢复方法都将基于以下场景进行:系统管理员在前一天晚上 11 点用 export 对数据库做了全库逻辑备份,然后对所有数据文件进行了热备份。第二天上午 10 点,系统管理员在修改表 TFUNDASSET 的数据时,由于修改语句的条件写错了,导致一批记录(几千条)的 ztm 字段被修改成了错误的值,而且已经提交。这个表是资产表,相对而言数据变化不频繁。一、利用逻辑备份使用 import 工具恢复丢失的数据export/import 是 oracle 提供的用于对数据库进行逻辑备份的工具。该工具适用于备份那些数据量不大、业务量不多的数据库系统。因为如果在前一天晚上 11 点用 export 做了逻辑备份,那么当今天上午 10 点数据库意外崩溃时,从备份起到数据库崩溃的这段时间里的数据修改操作(包括 DDL 和 DML)都会丢失。如果丢失数据内的表上的数据是相对比较稳定,也就是说该表上基本没有 DML 操作,例如标准代码表、分区表里的历史数据,那么采用 import 来导入该表可以比较完整的恢复数据。如果该表是经常变化的业务表,那么这些丢失的数据只能根据业务情况从纸质记录恢复,或者其他途径恢复。示例如下:这个表是一个资产表。相对来说,今天系统运行中修改的数据较少,丢失的数据量可以承受或者可以从别的途径恢复。那就可以用 import 来恢复。方法一:1、把这个表的数据备份到另一个表:2、删除该表的记录:3、执行下面的命令:这个命令中在关键字 tables 中指定需要导入的表名字,ignore=y 表示忽略表已经存在的错误。4、导入结束后,检查表中的记录,并用适当的方法恢复当天的修改。方法二:1、 把需要恢复的表导入到另一个用户下面:2、检查数据以后,把原表记录删除:3、然后从另一用户表中插入回去:4、 数据量比较大时可以采用如下方法:&二、利用物理备份来通过还原数据文件并进行不完全恢复如果数据库运行在归档模式下,那么可以通过使用以前的数据文件备份进行还原,然后利用归档日志进行前滚,直到回滚到错误操作的时间点前,然后重置日志文件打开数据库。可以通过下列方法确认是否是运行在归档模式:如果是如上所示,那么就是运行在归档模式了。假定在前一天晚上 11 点做了全库物理备份,那么可以考虑如下恢复:1、关闭数据库:由于数据库的不完全恢复必须在一个关闭的数据库上实施,利用一个旧的数据库的备份还原,然后用日志根据需要逐步前滚,而不能还原一个新的备份,再回退到某个时间点。通知各客户端数据库将关闭,然后发出:数据库已经关闭。已经卸载数据库。ORACLE 例程已经关闭。2、确定错误操作的时间:可以根据操作员的估计来确定不完全恢复需要前滚停止的时间,也可以利用 LogMiner 来分析日志文件(这个工具将在后面介绍),找出错误操作的准确时间。3、还原数据文件:先对当前的数据库文件进行备份,然后再用以前的最近一次备份覆盖现有数据文件。注意:不覆盖现有的控制文件。4、基于时间点恢复,启动数据库到装配状态:这样数据库就恢复到了 2015 年 10 月 20 日的 9 点 58 分零秒。然后再利用业务资料补充这段时间内的数据。&三、利用 dbms_logmnr 包从 log 文件中恢复&这个包是由 Oracle 提供,与 dbms_logmnr_d 包配合使用可以方便地分析联机日志文件和归档日志文件,从这些日志文件中提取出所有对数据库的更改操作。在使用这个包之前,需要先做一些设置和修改:1、打开 initorcl.ora,修改初始化参数 utl_file_dir,设置 dbms_logmnr_d 包将要使用的数据字典文件的放置目录。然后重启数据库使参数生效。2、以 sys 用户连接到数据库执行 dbmslmd.sql 脚本重建 dbms_logmnr_d 这个包。应用 Logminer 分析重做日志文件的操作主要有以下步骤:使用 dbms_logmnr_d 里的存储过程 build 创建一个外部数据字典文件;使用 dbms_logmnr 里的存储过程 add_logfile 添加要分析的日志文件;使用 dbms_logmnr 里的存储过程 start_logmnr 启动分析;查询与 dbms_logmnr 相关的几个视图来获取日志文件内容;使用 dbms_logmnr 里的存储过程 end_logmnr 结束分析。下面详细讲述使用的过程&1)使用 dbms_logmnr_d 里的存储过程 build 创建一个外部数据字典文件:2)使用 dbms_logmnr 里的存储过程 add_logfile 添加要分析的日志文件到待分析文件列表:如果没有运行在归档模式,那么由于重做日志文件的循环使用可能导致日志文件被覆盖而无法获取到所要寻找的恢复条目。如果运行在归档模式,则可以通过查看 $ORACLE_HOME\admin\orcl\bdump 目录下的 alert_orcl.log 里日志文件归档的时间和错误操作的时间来确定加入哪些归档日志文件到待分析的文件列表中去。注意:执行以上过程时 logfilename 参数需要写日志文件的全路径,否则会报错。重复以上操作直到把所有需要分析的文件都加到列表中去。这样就可以启动进行分析。3)使用 dbms_logmnr 里的存储过程 start_logmnr 启动分析;这样就可以通过下面的查询来获取日志文件的内容了。&4)查询与 dbms_logmnr 相关的几个视图来获取日志文件内容;&这样就可以找出要恢复所需的语句。注意:v$logmnr_contents 只对执行 dbms_logmnr.start_logmnr 的会话有效,如果通过其他会话或者使用 dbms_logmnr.end_logmnr 终止了分析,都将不能访问 v$logmnr_contents 的数据。如果要使其他会话也能获取到这些数据,可以通过另外建表来实现,如:create table undo_sql as select * from v$logmnr_contents。再对 undo_sql 进行授权,其他用户就可以访问 v$logmnr_contents 的数据了。&5)使用 dbms_logmnr 里的存储过程 end_logmnr 结束分析。&使用完成以后用下面的命令来结束分析活动:exec dbms_logmnr.end_这样就释放了分配给 logminer 的资源(内存和数据结构)。从上面的过程可知,如果是更新的数据量比较大,而日志文件比较小,就可能会导致日志文件的切换。如果没有及时去挖掘日志文件(没有运行在归档模式),那么可能会由于日志文件的循环使用而导致数据不可恢复。如果运行在归档模式,也可能由于需要分析的日志文件比较多而时间较长。&四、利用 flashback 新特性恢复数据&Oracle9i 开始提供了闪回查询(Flashback Query)功能,对于误删除或者误更新并且已经 commit 了的情况提供了简便快捷的恢复方法;而在 Oracle 提供闪回查询之前,碰到这种情况只能通过备份来进行基于时间点的恢复或者使用 logmnr 挖掘日志来恢复,无疑这比闪回查询要麻烦而且费时。使用这个 Flashback Query 特性的前提条件:1. 数据库必须处于 Automatic Undo Management 状态。2. 最大可以闪回查询的时间段由 UNDO_RETENTION 初始化参数(单位为秒)指定可以通过 ALTER SYSTEM SET UNDO_RETENTION = &seconds&; 来动态修改参数值。&如何使用 Flashback Query 来恢复数据呢?&1)通过 SQL使用 SELECT 语句的 AS OF 来进行闪回查询,语法如下:使用 AS OF 关键字来对表,视图或者物化视图进行 Flashback Query,如果指定了 SCN,那么 expr 部分必须是一个数字,如果指定了 TIMESTAMP,那么 expr 必须是一个 timestamp 类型的值。查询结果将返回在指定的 SCN 或者时间点上的数据。下面我们使用 scott 方案来作一个实验。如果想在 update 的子查询部分使用 AS OF,那么该查询只能返回一条记录,否则将会报错。可以通过添加一个临时表作为中转,然后再作更新,如下:2)通过 DBMS_FLASHBACK 包来恢复DBMS_FLASHBACK 包提供了以下几个函数:& &ENABLE_AT_TIME:设置当前 SESSION 的闪回查询时间& &ENABLE_AT_SYSTEM_CHANGE_NUMBER:设置当前 SESSION 的闪回查询 SCN& &GET_SYSTEM_CHANGE_NUMBER:取得当前数据库的 SCN& &DISABLE:关闭当前 SESSION 的闪回查询当将一个 SESSION 设置为闪回查询模式之后,后续的查询都会基于那个时间点或者 SCN 的数据库状态,如果 SESSION 结束,那么即使没有明确指定 DISABLE,闪回查询也会自动失效。当 SESSION 运行在闪回查询状态时,不允许进行任何 DML 和 DDL 操作。如果要用 DML 操作来进行数据恢复就必须使用 PL/SQL 游标。示例:通过上面的例子可以看出,只要这个修改的时间不早于 sysdate- (UNDO_RETENTION 指定的秒数), 就可通过这种方式来恢复数据。对于问题中的批量数据,可以写个过程来完成获取到更改前的数据:然后再用这个临时表里的数据来更新 TFUNDASSET 就可以了。五、总结比较以上几种恢复数据的方法的使用过程,我们可以看出:1、exp/imp 只适合于数据变化不大的表的数据丢失的情况,即使用这种方法处理后也需要从业务办理资料中修正数据,否则导致数据丢失;2、采用基于时间点的不完全恢复可以恢复丢失的数据,但是需要关关闭数据库,减少系统可用时间,而且也会丢失恢复时间点以后的数据;3、使用 LogMiner 可以较好的恢复数据,但是要求数据库尽可能运行在归档模式,否则也可能导致数据丢失。好处是不用关闭系统,能够从日志文件中得到所有的数据。4、使用 Flashback 最方便和简洁,可以直接得到修改前的数据,但是需要依赖系统设置,并且需要占用大量的回滚表空间。因此选择什么样的方法来恢复数据,取决于你的系统环境和具体情况,不能生搬硬套。采用正确的方法才能最大程度的减少数据的丢失。当然,最好是不需要用到这些恢复的办法。前提是,你必须做好以下的工作:1、为不同环境创建不同的数据库用户、不同密码(如果不能用户不同,一定要密码不同);2、将 owner 和应用用户分开,并做适度授权;3、在做 DML 前,先用同样的条件做查询,看根据结果集是否符合预期。相关课程:1、2、3、
本站所载作品版权归作者及原出处共同所有。凡本网注明“来源:”的所有作品、文章,版权均属于本站,转载、摘编或利用其它方式使用上述作品,应注明“来源:” 或 “摘自:”。
NUTANIX网络规模超融合架构
Tableau教程(一)入门
OTPUB技术沙龙—虚拟化解决方案
Oracle数据库性能优化他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)当前位置:
Oracle 数据库中数据丢失的几种恢复方法
Oracle 数据库中数据丢失的几种恢复方法
<dd data-toggle='tooltip' data-placement='top' data-original-title='作者:
彭志刚 &&'>作者:
<dd data-toggle='tooltip' data-placement='top' data-original-title='添加时间:
18:44:00 &&'>
<span data-toggle='tooltip' data-placement='top' data-original-title=' 阅读:6056'> 6056
无论是开发、测试还是运维过程中,大家都可能会因为误操作、连错数据库、用错用户、语句条件有误等原因,导致错误删除、错误更新等问题。当你恨不得剁掉按回车的那个指头、捶胸顿足、或者吓得腿软时,肯定希望有办法来恢复这些数据。刚好,oracle提供了一些强大的方法或机制,可以让你找到“后悔药”。
根据oracle数据库的特点和提供的工具,主要方法有以下几种方法:
利用逻辑备份使用import工具丢失数据的表
利用物理备份来通过还原数据文件并进行不完全恢复
利用dbms_logmnr包从redo log文件中恢复
利用flashback特性恢复数据
为了方便使用方法的介绍,上述恢复方法都将基于以下场景进行:系统管理员在前一天晚上11点用export对数据库做了全库逻辑备份,然后对所有数据文件进行了热备份。第二天上午10点,系统管理员在修改表TFUNDASSET的数据时,由于修改语句的条件写错了,导致一批记录(几千条)的ztm字段被修改成了错误的值,而且已经提交。这个表是资产表,相对而言数据变化不频繁。
一、利用逻辑备份使用import工具恢复丢失的数据
export/import是oracle提供的用于对数据库进行逻辑备份的工具。该工具适用于备份那些数据量不大、业务量不多的数据库系统。因为如果在前一天晚上11点用export做了逻辑备份,那么当今天上午10点数据库意外崩溃时,从备份起到数据库崩溃的这段时间里的数据修改操作(包括DDL和DML)都会丢失。如果丢失数据内的表上的数据是相对比较稳定,也就是说该表上基本没有DML操作,例如标准代码表、分区表里的历史数据,那么采用import来导入该表可以比较完整的恢复数据。如果该表是经常变化的业务表,那么这些丢失的数据只能根据业务情况从纸质记录恢复,或者其他途径恢复。
▲示例如下:这个表是一个资产表。相对来说,今天系统运行中修改的数据较少,丢失的数据量可以承受或者可以从别的途径恢复。那就可以用import来恢复。
1、把这个表的数据备份到另一个表:
2、删除该表的记录:
3、执行下面的命令:
这个命令中在关键字tables中指定需要导入的表名字,ignore=y表示忽略表已经存在的错误。
4、导入结束后,检查表中的记录,并用适当的方法恢复当天的修改。
1、 把需要恢复的表导入到另一个用户下面:
2、检查数据以后,把原表记录删除:
3、然后从另一用户表中插入回去:
4、&数据量比较大时可以采用如下方法:
二、利用物理备份来通过还原数据文件并进行不完全恢复
如果数据库运行在归档模式下,那么可以通过使用以前的数据文件备份进行还原,然后利用归档日志进行前滚,直到回滚到错误操作的时间点前,然后重置日志文件打开数据库。
可以通过下列方法确认是否是运行在归档模式:
如果是如上所示,那么就是运行在归档模式了。
▲假定在前一天晚上11点做了全库物理备份,那么可以考虑如下恢复:
1、关闭数据库:
由于数据库的不完全恢复必须在一个关闭的数据库上实施,利用一个旧的数据库的备份还原,然后用日志根据需要逐步前滚,而不能还原一个新的备份,再回退到某个时间点。
通知各客户端数据库将关闭,然后发出:
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
2、确定错误操作的时间:
可以根据操作员的估计来确定不完全恢复需要前滚停止的时间,也可以利用LogMiner来分析日志文件(这个工具将在后面介绍),找出错误操作的准确时间。
3、还原数据文件:
先对当前的数据库文件进行备份,然后再用以前的最近一次备份覆盖现有数据文件。注意:不覆盖现有的控制文件。
4、基于时间点恢复,启动数据库到装配状态:
这样数据库就恢复到了日的9点58分零秒。
然后再利用业务资料补充这段时间内的数据。
三、利用dbms_logmnr包从log文件中恢复
这个包是由Oracle提供,与dbms_logmnr_d包配合使用可以方便地分析联机日志文件和归档日志文件,从这些日志文件中提取出所有对数据库的更改操作。
在使用这个包之前,需要先做一些设置和修改:
1、打开initorcl.ora,修改初始化参数utl_file_dir,设置dbms_logmnr_d包将要使用的数据字典文件的放置目录。
然后重启数据库使参数生效。
2、以sys用户连接到数据库执行dbmslmd.sql脚本重建dbms_logmnr_d这个包。
应用Logminer分析重做日志文件的操作主要有以下步骤:
●&使用dbms_logmnr_d里的存储过程build创建一个外部数据字典文件;
●&使用dbms_logmnr里的存储过程add_logfile添加要分析的日志文件;
●&使用dbms_logmnr里的存储过程start_logmnr启动分析;
●&查询与dbms_logmnr相关的几个视图来获取日志文件内容;
●&使用dbms_logmnr里的存储过程end_logmnr结束分析。
▲下面详细讲述使用的过程
1、使用dbms_logmnr_d里的存储过程build创建一个外部数据字典文件:
2、使用dbms_logmnr里的存储过程add_logfile添加要分析的日志文件到待分析文件列表:
如果没有运行在归档模式,那么由于重做日志文件的循环使用可能导致日志文件被覆盖而无法获取到所要寻找的恢复条目。如果运行在归档模式,则可以通过查看$ORACLE_HOME\admin\orcl\bdump目录下的alert_orcl.log里日志文件归档的时间和错误操作的时间来确定加入哪些归档日志文件到待分析的文件列表中去。
注意:执行以上过程时logfilename参数需要写日志文件的全路径,否则会报错。重复以上操作直到把所有需要分析的文件都加到列表中去。这样就可以启动进行分析。
3、使用dbms_logmnr里的存储过程start_logmnr启动分析;
这样就可以通过下面的查询来获取日志文件的内容了。
4、查询与dbms_logmnr相关的几个视图来获取日志文件内容;
这样就可以找出要恢复所需的语句。注意:v$logmnr_contents只对执行dbms_logmnr.start_logmnr的会话有效,如果通过其他会话或者使用dbms_logmnr.end_logmnr终止了分析,都将不能访问v$logmnr_contents的数据。如果要使其他会话也能获取到这些数据,可以通过另外建表来实现,如:
create table undo_sql as select * from v$logmnr_contents。
再对undo_sql进行授权,其他用户就可以访问v$logmnr_contents的数据了。
5、使用dbms_logmnr里的存储过程end_logmnr结束分析。
使用完成以后用下面的命令来结束分析活动:exec dbms_logmnr.end_
这样就释放了分配给logminer的资源(内存和数据结构)。
从上面的过程可知,如果是更新的数据量比较大,而日志文件比较小,就可能会导致日志文件的切换。如果没有及时去挖掘日志文件(没有运行在归档模式),那么可能会由于日志文件的循环使用而导致数据不可恢复。如果运行在归档模式,也可能由于需要分析的日志文件比较多而时间较长。
四、利用flashback新特性恢复数据
Oracle9i 开始提供了闪回查询(Flashback Query)功能,对于误删除或者误更新并且已经commit了的情况提供了简便快捷的恢复方法;而在Oracle 提供闪回查询之前,碰到这种情况只能通过备份来进行基于时间点的恢复或者使用logmnr挖掘日志来恢复,无疑这比闪回查询要麻烦而且费时。
使用这个Flashback Query特性的前提条件:
1.&& 数据库必须处于Automatic Undo Management 状态。
2.&& 最大可以闪回查询的时间段由UNDO_RETENTION 初始化参数(单位为秒)指定
可以通过ALTER SYSTEM SET UNDO_RETENTION = &seconds&;来动态修改参数值。&
▲如何使用Flashback Query来恢复数据呢?
1. &通过SQL
使用SELECT 语句的AS OF 来进行闪回查询,语法如下:
使用AS OF 关键字来对表,视图或者物化视图进行Flashback Query,如果指定了SCN,那么expr 部分必须是一个数字,如果指定了TIMESTAMP,那么expr 必须是一个timestamp类型的值。查询结果将返回在指定的SCN 或者时间点上的数据。
下面我们使用scott 方案来作一个实验。
如果想在update 的子查询部分使用AS OF,那么该查询只能返回一条记录,否则将会报错。
可以通过添加一个临时表作为中转,然后再作更新,如下:
2.通过DBMS_FLASHBACK包来恢复
DBMS_FLASHBACK 包提供了以下几个函数:
&ENABLE_AT_TIME:设置当前SESSION 的闪回查询时间
ENABLE_AT_SYSTEM_CHANGE_NUMBER:设置当前SESSION 的闪回查询SCN
GET_SYSTEM_CHANGE_NUMBER:取得当前数据库的SCN
&DISABLE:关闭当前SESSION 的闪回查询
当将一个SESSION 设置为闪回查询模式之后,后续的查询都会基于那个时间点或者SCN 的数据库状态,如果SESSION 结束,那么即使没有明确指定DISABLE,闪回查询也会自动失效。
当SESSION 运行在闪回查询状态时,不允许进行任何DML 和DDL 操作。如果要用DML操作来进行数据恢复就必须使用PL/SQL 游标。
通过上面的例子可以看出,只要这个修改的时间不早于sysdate- (UNDO_RETENTION指定的秒数),就可通过这种方式来恢复数据。
对于问题中的批量数据,可以写个过程来完成获取到更改前的数据:
然后再用这个临时表里的数据来更新TFUNDASSET就可以了。
比较以上几种恢复数据的方法的使用过程,我们可以看出:
●&&&exp/imp只适合于数据变化不大的表的数据丢失的情况,即使用这种方法处理后也需要从业务办理资料中修正数据,否则导致数据丢失;
●&&&采用基于时间点的不完全恢复可以恢复丢失的数据,但是需要关关闭数据库,减少系统可用时间,而且也会丢失恢复时间点以后的数据;
●&&&使用LogMiner可以较好的恢复数据,但是要求数据库尽可能运行在归档模式,否则也可能导致数据丢失。好处是不用关闭系统,能够从日志文件中得到所有的数据。
●&&&使用Flashback最方便和简洁,可以直接得到修改前的数据,但是需要依赖系统设置,并且需要占用大量的回滚表空间。
因此选择什么样的方法来恢复数据,取决于你的系统环境和具体情况,不能生搬硬套。采用正确的方法才能最大程度的减少数据的丢失。
当然,最好是不需要用到这些恢复的办法。前提是,你必须做好以下的工作:
1、& 为不同环境创建不同的数据库用户、不同密码(如果不能用户不同,一定要密码不同);
2、& 将owner和应用用户分开,并做适度授权;
3、& 在做DML前,先用同样的条件做查询,看根据结果集是否符合预期。
恒生技术之眼他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 mysql 数据库文件恢复 的文章

 

随机推荐