oracle flashback6,ORACLE 11G FLASHBACK FEATURE

ORACLE 11G FLASHBACK FEATURE

Author: Rainny Zhong

Date: 2009-4-28

Oracle的闪回功能非常强大,如果了解它并真正掌握它,你会发现比介质恢复要省事不少。有这么一个既省事又强大的功能,我们为何不用呢?所以,花点心思,来学习一下它的使用。能用FLASHBACK解决问题的时候,绝不要使用介质恢复。

请参看:Oracle® DatabaseAdvanced Application Developer's Guide11gRelease 1 (11.1)B28424-03第373页:第13章:Using Oracle Flashback Technology

1.ORACLE闪回技术概述

ORACLE闪回技术利用自动的回退管理(Automatic Undo Management),它们依赖于UNDO数据。

下面是为应用开发而准备的闪回技术:

nOracle Flashback Query

nOracle Flashback Version Query

nFlashback Transaction Query

nDBMS_FLASHBACK Package

nFlashback Transaction

nFlashback Data Archive (Oracle Total Recall)

下面是为数据库管理而准备的闪回技术:

nOracle Flashback Table

nOracle Flashback Drop

nOracle Flashback Database

2.为ORACLE闪回技术配置数据库

要利用ORACLE的闪回技术功能,你必须对数据库进行一些相关的设置。

2.1.配置数据库自动回退管理

n创建一个回退表空间

n设定下面的实例参数以启用自动的回退管理(AUM)

–UNDO_MANAGEMENT=’AUTO’

–UNDO_TABLESPACE=’UNDO_TBS’

–UNDO_RETENTION=integer

你可以查询V$UNDOSTAT.TUNED_UNDORETENTION以获得当前回退表空间的回退保持时间

设置UNDO_RETENTION并不能保证没有到期的UNDO数据不被丢弃或覆盖.

n在回退表空间指定RETENTION GUARANTEE子句以保证未到期的UNDO数据不被丢弃或覆盖

2.2.为Flashback Transaction Query配置数据库

n数据库必须是10G或10G以上

n启用追加日志

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

2.3.为Flashback Transaction配置数据库

■With the database mounted but not open, enable ARCHIVELOG:

ALTER DATABASE ARCHIVELOG;

■Open at least one archive log:

ALTER SYSTEM ARCHIVE LOG CURRENT;

■If not done already, enable supplemental logging:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

2.4.为指定的LOB字段启用闪回操作功能

To enable flashback operations on specific LOB columns of a table, use the ALTER TABLE statement with the RETENTION option.

因为LOB字段会产生很大的UNDO数据,所以你必须选择性地对确实需要的LOB字段才启用闪回操作功能。

2.5.授予必要的权限

对于Oracle Flashback Query和Oracle Flashback Version Query,必须拥有下面的权限:

■对数据库对象有FLASHBACK和SELECT权限

■为了查询所有的表,你必须有FLASHBACK ANY TABLE权限

对于Oracle Flashback Transaction Query,必须拥有下面的权限:

■有SELECT ANY TRANSACTION权限

■为了执行从Oracle Flashback Transaction Query获取的回退SQL语句,你必须对表有SELECT,UPDATE,DELETE,INSERT权限

对于DBMS_FLASHBACK包,必须拥有下面的权限:

■对DBMS_FLASHBACK包有EXECUTE权限

对于Flashback Data Archive (Oracle Total Recall),必须拥有下面的权限:

■有FLASHBACK ARCHIVE权限

■你要将FLASHBACK ARCHIVE权限授予用户,你必须以SYSDBA登录或拥有FLASHBACK ARCHIVE ADMINISTER系统权限

■为了执行下面的语句,你还必面拥有FLASHBACK ARCHIVE ADMINISTER系统权限:

CREATE FLASHBACK ARCHIVE;

ALTER FLASHBACK ARCHIVE;

DROP FLASHBACK ARCHIVE;

■为了将FLASHBACK ARCHIVE ADMINISTER授予用户,你必须以SYSDBA登录

为了创建一个缺省的Flashback Data Archive,请以SYSDBA登录,并发布CREATE FLASHBACK ARCHIVE或ALTER FLASHBACK ARCHIVE语句。

3.Oracle Flashback Query(SELECT AS OF)

Example 13–1 retrieves the state of the record for Chung at 9:30AM, April 4, 2004:

Example 13–1 Retrieving a Lost Row with Oracle Flashback Query

SELECT * FROM employees

AS OF TIMESTAMP

TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')

WHERE last_name = 'Chung';

Example 13–2 restores Chung's information to the employees table:

Example 13–2 Restoring a Lost Row After Oracle Flashback Query

INSERT INTO employees

(SELECT * FROM employees

AS OF TIMESTAMP

TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')

WHERE last_name = 'Chung');

闪回查询可以用到DDL语句中:

CREATE VIEW hour_ago AS

SELECT * FROM employees

AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);

闪回查询也可以用到集合操作符中:

INSERTINTOemployees((SELECT*FROMemployeesASOFTIMESTAMP(SYSTIMESTAMP-INTERVAL'60'MINUTE))MINUSSELECT*FROMemployees);

4.Oracle Flashback Version Query

ORACLE闪回版本查询是用于获取行在一段时间间隔里的不同版本。当每发布一次COMMIT,就产生一个新的行版本。语法:

VERSIONS {BETWEEN {SCN | TIMESTAMP} startAND end}

下面是闪回版本查询的伪列:

VERSIONS_STARTSCN:行版本创建时的开始SCN,如果为NULL,表示行版本是在START之前创建的。

VERSIONS_STARTTIME:行版本创建时的开始时间戳,如果为NULL,表示行版本是在START之前创建的。

VERSIONS_ENDSCN:行版本期满SCN,如果为NULL,表示行版本是在查询时是当前的或对应一个DELETE操作

VERSIONS_ENDTIME:行版本期满时间戳,如果为NULL,表示行版本是在查询时是当前的或对应一个DELETE操作

VERSIONS_XID:创建行版本的事务ID

VERSIONS_OPERATION:事务所做的操作:I代表INSERT,D代表DELETE,U代表UPDATE,行版本是INSERT操作之后产生的,在DELETE之前产生的,或行版本是受UPDATE操作的影响而产生的。如果用户更新一个索引键,Oracle Flashback Version Query会把UPDATE看成是两个操作:DELETE加INSERT,在VERSIONS_OPERATION中会有两行,一个D和一个I。

一个行版本在ERSIONS_START*至VERSIONS_END*(但不包括VERSIONS_END*本身)期间是有效的。也就是说在时间t有效:VERSIONS_START* <=t

举个例子:

VERSIONS_START_TIMEVERSIONS_END_TIMESALARY

------------------------------------------

09-SEP-200325-NOV-200310243

行版本SALARY=10243在09-SEP-2003到25-NOV-2003但不包括25-NOV-2003本身(也就是25-NOV-2003 00:00:00之前)期间有效。

Oracle Flashback Version Query的例子:

SELECTversions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,name,salaryFROMemployeesVERSIONSBETWEEN

TIMESTAMPTO_TIMESTAMP('2003-07-18 14:00:00','YYYY-MM-DD HH24:MI:SS')

ANDTO_TIMESTAMP('2003-07-18 17:00:00','YYYY-MM-DD HH24:MI:SS')WHEREname='JOE';

5.Oracle Flashback Transaction Query

ORACLE闪回事务查询通过查询FLASHBACK_TRANSACTION_QUERY视图来实现。

下面是一个例子:SELECTxid,operation,start_scn,commit_scn,logon_user,undo_sqlFROMflashback_transaction_queryWHERExid=HEXTORAW('000200030000002D');

字段解释:

XID:事务ID

OPERATION:事务所做的操作

START_SCN:操作开始时的SCN

COMMIT_SCN:操作结束时的SCN

LOGON_USER:执行操作的USER

UNDO_SQL:如果要回退这个事务所需的SQL代码

ORACLE闪回事务查询要和ORACLE闪回版本查询结合起来:

SELECTxid,logon_userFROMflashback_transaction_queryWHERExidIN(SELECTversions_xidFROMemployeesVERSIONSBETWEEN

TIMESTAMPTO_TIMESTAMP('2003-07-18 14:00:00','YYYY-MM-DD HH24:MI:SS')

ANDTO_TIMESTAMP('2003-07-18 17:00:00','YYYY-MM-DD HH24:MI:SS'));

6.Flashback Transaction Query和Flashback Version Query的结合

ORACLE闪回事务查询一般是和ORACLE闪回版本查询结合起来使用。

我们来创建测试表和测试数据:

CREATETABLEemp(empnoNUMBERPRIMARYKEY,empnameVARCHAR2(16),salaryNUMBER);INSERTINTOempVALUES(111,'Mike',555);COMMIT;CREATETABLEdept(deptnoNUMBER,deptnameVARCHAR2(32));INSERTINTOdeptVALUES(10,'Accounting');COMMIT;

现在EMP和DEPT表都只有一行。假设有一个事务错误地删除了员工编号为111的记录:

UPDATEempSETsalary=salary+100WHEREempno=111;INSERTINTOdeptVALUES(20,'Finance');DELETEFROMempWHEREempno=111;COMMIT;

接下来,另外一个事务重新插入员工编号为111的记录,但用不同的姓名:

INSERTINTOempVALUES(111,'Tom',777);UPDATEempSETsalary=salary+100WHEREempno=111;UPDATEempSETsalary=salary+50WHEREempno=111;COMMIT来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/684234/viewspace-1025009/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值