ORACLE 11G FLASHBACK FEATURE

ORACLE 11G FLASHBACK FEATURE

Author: Rainny Zhong

Date: 2009-4-28

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

请参看:Oracle® Database Advanced Application Developer's Guide11g Release 1 (11.1)B28424-03373页:第13章:Using Oracle Flashback Technology

1.ORACLE闪回技术概述

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

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

n Oracle Flashback Query

n Oracle Flashback Version Query

n Flashback Transaction Query

n DBMS_FLASHBACK Package

n Flashback Transaction

n Flashback Data Archive (Oracle Total Recall)

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

n Oracle Flashback Table

n Oracle Flashback Drop

n Oracle 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 数据库必须是10G10G以上

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,必须拥有下面的权限:

对数据库对象有FLASHBACKSELECT权限

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

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

SELECT ANY TRANSACTION权限

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

对于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);

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

INSERT INTO employees
((SELECT *
FROM employees AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '60' MINUTE)) MINUS
SELECT * FROM employees);

4.Oracle Flashback Version Query

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

VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND 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代表INSERTD代表DELETEU代表UPDATE,行版本是INSERT操作之后产生的,在DELETE之前产生的,或行版本是受UPDATE操作的影响而产生的。如果用户更新一个索引键,Oracle Flashback Version Query会把UPDATE看成是两个操作:DELETEINSERT,在VERSIONS_OPERATION中会有两行,一个D和一个I

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

举个例子:

VERSIONS_START_TIME VERSIONS_END_TIME SALARY

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

09-SEP-2003 25-NOV-2003 10243

行版本SALARY=1024309-SEP-200325-NOV-2003但不包括25-NOV-2003本身(也就是25-NOV-2003 000000之前)期间有效。

Oracle Flashback Version Query的例子:

SELECT versions_startscn,
versions_starttime
,
versions_endscn
,
versions_endtime
,
versions_xid
,
versions_operation
,
name,
salary
FROM employees VERSIONS BETWEEN

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

AND TO_TIMESTAMP('2003-07-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE name = 'JOE';

5.Oracle Flashback Transaction Query

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

下面是一个例子:SELECT xid, operation, start_scn, commit_scn, logon_user, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('000200030000002D');

字段解释:

XID:事务ID

OPERATION:事务所做的操作

START_SCN:操作开始时的SCN

COMMIT_SCN:操作结束时的SCN

LOGON_USER:执行操作的USER

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

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

SELECT xid, logon_user
FROM flashback_transaction_query
WHERE xid IN
(SELECT versions_xid
FROM employees VERSIONS BETWEEN

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

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

6.Flashback Transaction Query Flashback Version Query的结合

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

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

CREATE TABLE emp(empno NUMBER PRIMARY KEY,
empname
VARCHAR2(16),
salary
NUMBER);INSERT INTO emp VALUES (111, 'Mike', 555);COMMIT;CREATE TABLE dept(deptno NUMBER,
deptname
VARCHAR2(32));INSERT INTO dept VALUES (10, 'Accounting');COMMIT;

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

UPDATE emp SET salary = salary + 100 WHERE empno = 111;INSERT INTO dept VALUES (20, 'Finance');DELETE FROM emp WHERE empno = 111;COMMIT;

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

INSERT INTO emp VALUES (111, 'Tom', 777);UPDATE emp SET salary = salary + 100 WHERE empno = 111;UPDATE emp SET salary = salary + 50 WHERE empno = 111;COMMIT

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/684234/viewspace-1025009/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/684234/viewspace-1025009/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值