oracle数据库表如何恢复到特定时间点

oracle数据库表如何恢复到特定时间点,第1张

如果开启闪回可以使用闪回表。\x0d\selectlog_mode,flashback_onfromv$database;\x0d\如果是下面结果则开了闪回\x0d\LOG_MODEFLASHBACK_ON\x0d\------------------------------\x0d\ARCHIVELOGYES\x0d\可以执行以下命令\x0d\altertable表名enablerowmovement;--开启表行移动\x0d\flashbacktable表名totimestampto_timestamp('2013081314:00:00','yyyymmddhh24:mi:ss');\x0d\--闪回到2013年8月13日14点\x0d\你要是没开启,有逻辑备份可以使用imp命令导入数据。\x0d\如果没用逻辑备份,开启归档模式,有物理备份,能够停机、数据丢失的话,可以采用不完全恢复\x0d\用rman登陆\x0d\rmantarget/\x0d\执行以下命令\x0d\run{shutdownimmediate;\x0d\startupmount;\x0d\setuntiltime="to_date('2013081314:00:00','yyyymmddhh24:mi:ss')";\x0d\restoredatabase;\x0d\recoverdatabase;\x0d\alterdatabaseopenresetlogs;}\x0d\切记!做以上任何 *** 作前做好备份,否则出了问题后悔莫及。\x0d\而且建议你联系你们数据库管理员处理这个问题。

不需要设置 立即识别对行的所有更改

在 Oracle i Database 中 我们看到它推出了以闪回查询形式表示的 时间机器 该特性允许 DBA 看到特定时间的列值 只要在还原段中提供该数据块此前镜像的拷贝即可 但是 闪回查询只提供某时刻数据的固定快照 而不是在两个时间点之间被更改数据的运行状态表示 某些应用程序 如涉及到外币管理的应用程序 可能需要了解一段时期内数值数据的变化 而不仅仅是两个时间点的数值 由于闪回版本查询特性 Oracle Database g 能够更方便高效地执行该任务

查询对表的更改

在本示例中 我使用了一个银行外币管理应用程序 其数据库含有一个名称为 RATES 的表 用于记录特定时间的汇率

SQL> desc rates    Name              NullType        CURRENCY                   VARCHAR ( )    RATE                       NUMBER( )

该表显示 US$ 与各种其他货币的汇率 在 CURRENCY 列中显示 在金融服务行业中 汇率不但在变更时进行更新 而且被记录在历史中 需要这种方式的原因是银行交易可能在 过去时间 生效 以便适应由于汇款而耗费的时间 例如 对于一项在上午 : 发生但在上午 : 生效的交易 其有效汇率是上午 : 的汇率 而不是现在的汇率

直到现在 唯一的选择是创建一个汇率历史表来存储汇率的变更 然后查询该表是否提供历史记录 另一种选择是在 RATES 表本身中记录特定汇率适用性的开始和结束时间 当发生变更时 现有行中的 END_TIME 列被更新为 SYSDATE 并插入一个具有新汇率的新行 其 END_TIME 为 NULL

但是在 Oracle Database g 中 闪回版本查询特性不需要维护历史表或存储开始和结束时间 使用该特性 您不必进行额外的设置 即可获得某行在过去特定时间的值

例如 假定该 DBA 在正常业务过程中数次更新汇率 ― 甚至删除了某行并重新插入该行

insert into rates values ( EURO );    mit;    update rates set rate = ;    mit;    update rates set rate = ;    mit;    delete rates;    mit;    insert into rates values ( EURO );    mit;    update rates set rate = ;    mit;

在进行了这一系列 *** 作后 DBA 将通过以下命令获得 RATE 列的当前提交值

SQL> select from rates;

CURR       RATE        EURO    

此输出显示 RATE 的当前值 没有显示从第一次创建该行以来发生的所有变更 这时使用闪回查询 您可以找出给定时间点的值 但我们对构建变更的审计线索更感兴趣 ― 有些类似于通过便携式摄像机来记录变更 而不只是在特定点拍摄一系列快照

以下查询显示了对表所做的更改

select versions_starttime versions_endtime versions_xid     versions_operation rate    from rates versions beeen timestamp minvalue and maxvalue    order by VERSIONS_STARTTIME    /

VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE        DEC PM  DEC PM  C I         DEC PM  DEC PM  A A U         DEC PM  DEC PM  A B U         DEC PM                         A C D         DEC PM  DEC PM  A D I         DEC PM                         A E U    

注意 此处显示了对该行所作的所有更改 甚至包括该行被删除和重新插入的情况 VERSION_OPERATION 列显示对该行执行了什么 *** 作 (Insert/Update/Delete) 所做的这些工作不需要历史表或额外的列

在上述查询中 列 versions_starttime versions_endtime versions_xid versions_operation 是伪列 与 ROWNUM LEVEL 等其他熟悉的伪列相类似 其他伪列 ― 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN ― 显示了该时刻的系统更改号 列 versions_xid 显示了更改该行的事务标识符 有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到 其中列 XID 显示事务 id 例如 使用上述的 VERSIONS_XID 值 A D UNDO_SQL 值显示了实际的语句

SELECT UNDO_SQL    FROM FLASHBACK_TRANSACTION_QUERY    WHERE XID = A D ;

UNDO_SQL        insert into ANANDA RATES ( CURRENCY RATE ) values ( EURO );

除了实际语句之外 该视图还显示提交 *** 作的时间标记和 SCN 查询开始时的 SCN 和时间标记以及其他信息

找出一段时期中的变更

现在 让我们来看如何有效地使用这些信息 假设我们需要找出下午 : : 时 RATE 列的值 我们可以执行

select rate versions_starttime versions_endtime    from rates versions    beeen timestamp    to_date( / / : : mm/dd/yyyy hh :mi:ss )    and to_date( / / : : mm/dd/yyyy hh :mi:ss )    /

RATE VERSIONS_STARTTIME     VERSIONS_ENDTIME           

此查询与闪回查询类似 在以上的示例中 开始和结束时间为空 表示汇率在该时间段中没有更改 而是包含一个时间段 还可以使用 SCN 来找出过去的版本值 可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号 以下是一个示例

select rate versions_starttime versions_endtime    from rates versions    beeen scn and     /

使用关键词 MINVALUE 和 MAXVALUE 可以显示还原段中提供的所有变更 您甚至可以提供一个特定的日期或 SCN 值作为范围的一个端点 而另一个端点是文字 MAXVALUE 或 MINVALUE 例如 以下查询提供那些只从下午 : : 开始的变更 而不是全部范围的变更

select versions_starttime versions_endtime versions_xid     versions_operation rate    from rates versions beeen timestamp    to_date( / / : : mm/dd/yyyy hh :mi:ss )    and maxvalue    order by VERSIONS_STARTTIME    /

VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE        DEC PM                         A C D         DEC PM  DEC PM  A D I         DEC PM                         A E U    

最终的分析

闪回版本查询随取随用地复制表变更的短期易变数值审计 这一优点使得 DBA 能够获得过去时间段中的所有变更而不是特定值 只要还原段中提供数据 就可以尽情使用 因此 最大的可用版本依赖于 UNDO_RETENTION 参数

lishixinzhi/Article/program/Oracle/201311/17217

在不开归档日志的情况下,Oracle数据库的备份只能依赖exp命令(逻辑备份)导出数据文件(注意:不包括日志文件以及控制文件等),导出的所有数据仅仅以一个大文件的方式来存放,但是这种备份容易导致丢失数据。举个例子:如果5号晚上进行了exp数据导出,但是在6号的运行过程中发生宕机,数据丢失,这个时候从5号备份后一直到6号宕机前的数据将全部丢失(即使将日志文件和控制文件拷出来都无法恢复,因为exp导出的数据无法与这些日志文件一一对应起来恢复)。所以采用exp方式备份数据还是存在很大风险的。

另一种方式就是使用Oracle自带的备份工具rman。一次rman备份(物理备份)的全过程如下:

因为使用rman备份不会产生数据丢失的情况,所以必须有一个全备份的文件,使用rman需要先进行一次全备份,相当于将当前数据库里面的所有文件以及日志都全盘拷贝一份到备份介质中,然后通过归档日志(实时更新的)的记录看每个进程都对数据库做了哪些修改,只要保留了一份物理备份以及物理备份之后的所有归档日志,就能够将数据库恢复到宕机前一刻的状态,将数据丢失降到最低。(每个redo log写满之后就开始写到achive log里面进行归档,这个里面还是有个时间段的,不能做到完全的实时)

首先你要知道依赖关系:

flashback database依赖于:闪回日志

flashback drop依赖于:回收站

flashback table/query依赖于:undo

开启闪回要在mount状态下:

alter system set db_flashback_retention_target=2880 scope=both;

alter database flashback on;

再者你要利用事务号获得undo语句

查看事务号:select versions_xid,empno,ename,sal from tt01

versions between timestamp minvalue and maxvalue

order by empno;

根据得到的事务号查看undo_sql语句:

select undo_sql from flashback_transaction_query

where xid='versions_xid' //这里的XID就是上面查询到的versions_xid

如果只是闪回误删除的表:

flashback table TT01 to before drop;

闪回的是最近删除的一张表,当然也可以根据情况自定义闪回误删的表

步骤:

查看DB回收站内容:show recyclebin;

在里面可以查看到删除的表,根据里面的recyclebin name可以来查看表结构

比如:desc "BIN$3naDFKEKFIDISB332DI"

要在oracle数据库处于mount状态的时候才能启用或者关闭archivelog功能。

startup monut;

alter database archivelog;

然后

alter database open;

以上就是关于oracle数据库表如何恢复到特定时间点全部的内容,包括:oracle数据库表如何恢复到特定时间点、OracleDatabase10g:闪回版本查询、rman备份为什么要设置闪回数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9832973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存