Oracle Flashback闪回 实操研讨会

本文地址 : http://www.askmaclean.com/archives/oracle-flashback闪回-实操研讨会.html

 

 

Flashback 功能概要

所有故障案例的对策

  • 在事业持续发展计划中,需要所有故障案例的对策
  • High Availability: 365天24小时都无法终止系统

–为了继续服务

  • 需要无论是硬件还是软件发生故障都可以继续提供服务

–Real Application Clusters

–Automatic Storage Management

–Data Guard

  • 为了将故障时的downtime压缩到最小

–需要迅速处理各种故障

  • 物理故障
  • 理论故障

 

物理故障与理论故障

  • 物理故障: 数据库结构文件的破损

–对策

  • 硬件的镜像
  • 定期备份
  • 理论故障:用户以及应用的错误变更

–因为有人的参与,所以肯定会发生以上故障

  • 「更新了错误的补丁!!」
  • 「DROP了其他的表!」
  • 「 想知道3小时之前的数据!」

flashback1

 

 

理论故障的修复<传统>

 

flashback2

理论故障的修复<闪回>

不是通过备份来存储的,

不需要存储时间,所以比传统的不完全恢复要简单高速

flashback3

 

闪回功能是指什么

  • 理论故障中的恢复功能

–尽早恢复人为错误

  • 删除了重要数据、更新了错误数据、删错了表等,维护失误导致的问题
  • 应用错误、执行了错误补丁导致的问题
  • 将数据库整体,或者一部分,还原到过去某一时间点的状态

–不需要从备份恢复

  • 比传统的不完全恢复简单多了
  • 可以参考往期数据
  • 对错误的数据修改效果非常好

可以将由于理论故障造成的业务(系统终止)压抑在最低限度

 

闪回功能的设定

 

  • 为了还原数据,需要有日志

–在大部分的闪回功能中使用UNDO数据

–除UNDO 以外的设定可能也会需要闪回功能

 

UNDO  (变更之前的数据 ) 的管理

  • 循环使用UNDO 表区域(旧数据会被覆盖)
  • 如果UNDO 数据被覆盖的话,就不能闪回

→重要的是设定符合条件的UNDO表区域

  • 8i 以前:人工管理
  • 9i 以后:自动 UNDO 管理
  • UNDO_MANAGEMENT: 自动 UNDO 区域管理模式
  • UNDO_TABLESPACE:将要使用的UNDO表区域
  • UNDO_RETENTION: 指定保存的 UNDO 信息量(秒単位)
  • 10g 以后:自动 UNDO 调优功能
  • 根据表区域的尺寸以及事务的长度,动态变更UNDO储存时间段

 

Flashback 功能的种类

 

参照系 功能名 功能概要 将要使用的信息
Flashback Query 参考往期数据 UNDO 信息
Flashback Version Query 展示指定的时间间隔的所有变更历史 UNDO 信息
Flashback Transaction
Query
展示通过一定期间内的指定的/所有的事务,来执行的变更 UNDO 信息
Flashback Data Archive 保存一定期间内的历史数据,进行参考 Flashback Archive
区域

 

 

恢复系 Flashback Database 将数据库整体恢复到过去的某个时点 Flashback Log
Flashback Table 通过表単位,将数据返回到指定的时间点 UNDO 信息
Flashback Drop 取消表的 Drop 操作 残留在原来的表中的区域
Flashback Transaction 取消指定事务 REDO 信息

 

 

Flashback 环境

 

实操环境  

工作开始前的状況

详细
Operating System Oracle Linux 6.3
使用OS 用户 oracle (密码: oracle)
Database Software Oracle Database 11g Release 2   11.2.0.3
Database 制作完成ORACLE_SID=orcl
Database 的设定 闪回数据库模式无效化

归档日志模式无效化
不使用RMAN 日志不使用

默认FRA 的情况

DB 架构 scott/tiger

 

 

详细
ORACLE_BASE /u01/app/oracle
ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1
高速恢复区域 /u01/app/oracle/fast_recovery_area
归档日志文件 /u01/app/oracle/admin/orcl/arch
数据库文件群 /u01/app/oracle/oradata/orcl

 

通过DB (orcl) 设定的参数

*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/fast_recovery_area/orcl/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4322230272
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=839909376
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

 

练习 Flashback 环境作成

Archivelog 模式 /Flashback 模式/ 确认Supplemental Logging
SELECT LOG_MODE , FLASHBACK_ON , SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
确认UNDO_RETENTION
SHOW PARAMETER UNDO_RETENTION

确认FLASHBACK_DATABASE_LOG
SELECT * FROM V$FLASHBACK_DATABASE_LOG

确认FLASHBACK_DATABASE_STAT
SELECT * FROM V$FLASHBACK_DATABASE_STAT

确认FLASHBACK_DATABASE_LOGFILE
SELECT * FROM V$FLASHBACK_DATABASE_LOGFILE

 

 

  • 执行例
$ sqlplus / as sysdba

SQL> SELECT LOG_MODE,FLASHBACK_ON,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

LOG_MODE           FLASHBACK_ON  SUPPLEME

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

NOARCHIVELOG  NO  NO

SQL> SHOW PARAMETER UNDO_RETENTION

NAME       TYPE    VALUE

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

undo_retention  integer         900



SQL> SELECT * FROM V$FLASHBACK_DATABASE_LOG;

没有选择记录。

SQL> SELECT * FROM V$FLASHBACK_DATABASE_STAT;

没有选择记录。

SQL> SELECT * FROM V$FLASHBACK_DATABASE_LOGFILE;

没有选择记录。

 

 

 

scott 架构相关的数据变更

UPDATE SCOTT.DEPT SET LOC = ‘TOKYO’ WHERE DEPTNO = ’10’;

确认高速恢复区域
ls -l /u01/app/oracle/fast_recovery_area/ORCL/*

 

$ sqlplus scott/tiger

SQL> UPDATE SCOTT.DEPT SET LOC = ‘TOKYO’ WHERE DEPTNO = ’10’;

1行更新完成。

SQL>COMMIT;

Commit完成。

$ ls -l /u01/app/oracle/fast_recovery_area/ORCL/*

total 0

 

闪回数据库模式有效化所必需的设定
需要归档日志模式
在Flashback on中设定
需要使得Supplemental Logging有效化
通过MOUNT 状态变更

$ sqlplus / as sysdba

SQL> shutdown immediate

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database flashback on;

SQL> alter database add supplemental log data;

SQL> alter database open;

 

$ sqlplus / as sysdba

SQL> shutdown immediate

关闭数据库。

数据库被dismount了

ORACLE实例关闭。

SQL> startup mount

ORACLE实例启动

Total System Global Area  839282688 bytes

Fixed Size      2233000 bytes

Variable Size    578817368 bytes

Database Buffers    255852544 bytes

Redo Buffers      2379776 bytes

数据库被mount了。

SQL> alter database archivelog;

数据库被变更。

 

SQL> alter database flashback on;

数据库被变更。

SQL> alter database add supplemental log data;

数据库被变更。

SQL> alter database open;

数据库被变更。

SQL> SELECT LOG_MODE,FLASHBACK_ON,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

LOG_MODE     FLASHBACK_ON  SUPPLEME

————      ————–          ————–

ARCHIVELOG   YES  YES

 

scott 架构相关的数据变更
UPDATE SCOTT.DEPT SET LOC = ‘ CHICAGO ‘ WHERE DEPTNO = ’10’;
高速恢复区域的确认

ls -l /u01/app/oracle/fast_recovery_area/ORCL/*
strings –print-file-name /u01/app/oracle/fast_recovery_area/ORCL/flashback/* |grep CHICAGO

 

SQL> UPDATE SCOTT.DEPT SET LOC = ‘ CHICAGO ‘ WHERE DEPTNO = ’10’;

1行更新完成。

SQL>COMMIT;

Commit完成。

$ ls -l /u01/app/oracle/fast_recovery_area/ORCL/*

/u01/app/oracle/fast_recovery_area/ORCL/flashback:

total 102416

-rw-r—– 1 oracle oinstall 52436992 Jun 25 10:30 o1_mf_8wkzz0td_.flb

-rw-r—– 1 oracle oinstall 52436992 Jun 25 10:26 o1_mf_8wkzz7qt_.flb

/u01/app/oracle/fast_recovery_area/ORCL/onlinelog:

total 0

$ strings –print-file-name /u01/app/oracle/fast_recovery_area/ORCL/flashback/* |grep CHICAGO

/u01/app/oracle/fast_recovery_area/ORCL/flashback/o1_mf_8wkzz0td_.flb: CHICAGO,

 

 

Flashback Query

通过SELECT 文的 AS OF 句获得指定的过去某个时点的数据
指定特定的时间参考往期的数据

SELECT ~ FROM 表名 AS OF TIMESTAMP TO_TIMESTAMP (时间,’YYYY-MM-DD HH:MI:SS’);

通过指定“几分钟之前”可以参考过去的数据

SELECT ~ FROM 表名 AS OF TIMESTAMP (SYSTIMESTAMP – INTERVAL ‘XX’ MINUTE);
指定SCN (为了管理数据库的时间,指定内部唯一顺序编号)可以参考以往的数据
SELECT ~ FROM 表名 AS OF SCN (xxxx);

 

确认SCN 的编号
SELECT CURRENT_SCN FROM V$DATABASE;

数据更新  DALLAS →OSAKA
UPDATE SCOTT.DEPT SET LOC = ‘OSAKA’ WHERE DEPTNO = ’20’;
用变更前的时间查询、确认 DALLAS 被表示出来了
SELECT * FROM SCOTT.DEPT AS OF TIMESTAMP TO_TIMESTAMP (时间,’YYYY-MM-DD HH:MI:SS’);
在XX 分前进行查询确认 DALLAS 被表示出来了
SELECT * FROM SCOTT.DEPT AS OF TIMESTAMP (SYSTIMESTAMP – INTERVAL ‘XX’ MINUTE);
通过在① 中确认到 SCN编号进行查询,确认 DALLAS 被表示出来了
SELECT * FROM SCOTT.DEPT AS OF SCN ( SCN 编号 );

 

SQL> SELECT * FROM SCOTT.DEPT WHERE DEPTNO=’20’;

DEPTNO       DNAME    LOC

———-          ————–              ————-

20                  RESEARCH    DALLAS

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN

———–

1085045

SQL> UPDATE SCOTT.DEPT SET LOC = ‘OSAKA’ WHERE DEPTNO = ’20’;

1行更新完成。

SQL> COMMIT;

commit完成。

 

SQL> SELECT * FROM SCOTT.DEPT AS OF TIMESTAMP TO_TIMESTAMP (‘2013-05-28 11:20:00′,’YYYY-MM-DD HH:MI:SS’) WHERE DEPTNO = ’20’;

DEPTNO     DNAME  LOC

———-         ————–              ————-

20                 RESEARCH    DALLAS

SQL> SELECT * FROM SCOTT.DEPT AS OF TIMESTAMP (SYSTIMESTAMP – INTERVAL ‘5’ MINUTE) WHERE DEPTNO = ’20’;

DEPTNO     DNAME    LOC

———-        ————–                ————-

20                RESEARCH    DALLAS

SQL> SELECT * FROM SCOTT.DEPT AS OF SCN(1085045) WHERE DEPTNO = ’20’;

DEPTNO      DNAME    LOC

———-         ————–               ————-

20                 RESEARCH    DALLAS

 

 

 

 

Flashback Version Query

 

  • SELECT 文在使用VERSIONS BETWEEN 句,指定闪回版本查询
  • 指定的时间范围内存在的,获得指定行的各种版本

可以确认是怎样到达现在的值的过程

SELECT ~ FROM 表名 VERSIONS BETWEEN 时间范围

 

插入SCOTT.DEPT 数据
INSERT INTO SCOTT.DEPT VALUES(50,’DIRECT’,’TOKYO’);

数据更新 TOKYO→OSAKA
UPDATE SCOTT.DEPT SET LOC=’OSAKA’ WHERE DEPTNO=50;

数据更新  OSAKA → FUKUOKA
UPDATE SCOTT.DEPT SET LOC=’ FUKUOKA ‘ WHERE DEPTNO=50;

通过闪回版本查询确认事务
SELECT VERSIONS_XID,VERSIONS_STARTTIME,
VERSIONS_OPERATION,DEPTNO,LOC
FROM SCOTT.DEPT
VERSIONS BETWEEN scn 数字 and 数字
WHERE DEPTNO = 50;

 

SQL> INSERT INTO SCOTT.DEPT VALUES(50,’DIRECT’,’TOKYO’);

1行制作完成。

SQL> COMMIT;

commit完成。

SQL> UPDATE SCOTT.DEPT SET LOC=’OSAKA’ WHERE DEPTNO=50;

1行更新完成。

SQL> COMMIT;

commit完成。

SQL> UPDATE SCOTT.DEPT SET LOC=’ FUKUOKA ‘ WHERE DEPTNO=50;

1行更新完成。

SQL> COMMIT;

commit完成。

flashback4

 

  • 通过事务単位展示变更历史

–追踪用1 事务变更多个表以及行的历史时比较有效

–可以获得取消变更的 SQL 文( UNDO 数据)

 

SELECT * FROM FLASHBACK_TRANSACTION_QUERY

WHERE XID=’XXXXXXXXXXXX’;

指定事务 ID ,追踪通过这个事务执行的变更

 

①通过闪回版本查询指定调查完成的事务ID,追踪指定的事务中的处理+获得UNDO数据

 

SQL> SELECT VERSIONS_XID,VERSIONS_STARTTIME,

VERSIONS_OPERATION,DEPTNO,LOC

FROM SCOTT.DEPT

VERSIONS BETWEEN scn minvalue and maxvalue

WHERE  DEPTNO = 50;

VERSIONS_XID        VERSIONS_STARTTIME  V      DEPTNO  LOC

———————-         ———————                 —    —              ——-
07000600BD020000  13-05-28 13:53:32              U     50      FUKUOKA
0500080075030000    13-05-28 13:53:19             U     50      OSAKA
02001B0071030000   13-05-28 13:52:22              I      50      TOKYO

SELECT operation,undo_sql  FROM  flashback_transaction_query

WHERE xid=’0500080075030000′;

 

SQL>SELECT operation,undo_sql  FROM  flashback_transaction_query WHERE xid=’0500080075030000′;

OPERATION

——————————–

UNDO_SQL

—————————————————————————————————-

UPDATE

update “SCOTT”.”DEPT” set “LOC” = ‘TOKYO’ where ROWID = ‘AAASZFAAEAAAACHAAE’;

 

取消这个处理SQL语句

INSERT⇒DELETE

UPDATE ⇒ UPDATE

DELETE ⇒ INSERT

 

 

 


  • 可以保存更久的更新数据的历史repository

–通过在专用区域中保存UNDO 数据,可以保持更久

–对于特定的表,可以保持历史设置

  • 使用用途

–Compliance

–监视报告

–Information Lifecycle Management (ILM)

–数据解析

 

闪回数据归档文件相关的信息确认

SELECT OWNER_NAME,FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , RETENTION_IN_DAYS FROM DBA_FLASHBACK_ARCHIVE;

SELECT FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , TABLESPACE_NAME FROM DBA_FLASHBACK_ARCHIVE_TS;

SELECT TABLE_NAME , OWNER_NAME , FLASHBACK_ARCHIVE_NAME , ARCHIVE_TABLE_NAME, STATUS FROM DBA_FLASHBACK_ARCHIVE_TABLES;

 

在表区域中准备闪回数据归档用的区域

  • 设定合适的保存阶段
  • 在可以在每个保存阶段中制成多个区域

CREATE FLASHBACK ARCHIVE fda_test

TABLESPACE USERS

QUOTA     区域尺寸  RETENTION   期間

 

 

 

对想留下历史信息的表来进行闪回数据归档有效化

ALTER TABLE SCOTT.DEPT FLASHBACK ARCHIVE fda_test;

 

闪回数据归档文件相关的信息确认

SELECT OWNER_NAME,FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , RETENTION_IN_DAYS FROM DBA_FLASHBACK_ARCHIVE;

SELECT FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , TABLESPACE_NAME FROM DBA_FLASHBACK_ARCHIVE_TS;

SELECT TABLE_NAME , OWNER_NAME , FLASHBACK_ARCHIVE_NAME , ARCHIVE_TABLE_NAME, STATUS FROM DBA_FLASHBACK_ARCHIVE_TABLES;

 

 

SQL> SELECT OWNER_NAME,FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , RETENTION_IN_DAYS FROM DBA_FLASHBACK_ARCHIVE;

没有选择记录。

SQL> SELECT FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , TABLESPACE_NAME FROM DBA_FLASHBACK_ARCHIVE_TS;

没有选择记录。

SQL> SELECT TABLE_NAME , OWNER_NAME , FLASHBACK_ARCHIVE_NAME , ARCHIVE_TABLE_NAME, STATUS FROM DBA_FLASHBACK_ARCHIVE_TABLES;

没有选择记录。

SQL> CREATE FLASHBACK ARCHIVE fda_test

TABLESPACE USERS

QUOTA 50M RETENTION 1 YEAR;

闪回归档制作完成。

SQL> ALTER TABLE SCOTT.DEPT FLASHBACK ARCHIVE fda_test;

表变更完成。

 

SQL> SELECT OWNER_NAME , FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , RETENTION_IN_DAYS FROM DBA_FLASHBACK_ARCHIVE;

OWNER_NAME    FLASHBACK_ARCHIVE_NAME    FLASHBACK_ARCHIVE#    RETENTION_IN_DAYS

———- ———-     ——————————————       ———————————      —————–

SYS                        FDA_TEST                                      1                                            365

SQL> SELECT FLASHBACK_ARCHIVE_NAME , FLASHBACK_ARCHIVE# , TABLESPACE_NAME FROM DBA_FLASHBACK_ARCHIVE_TS;

FLASHBACK_ARCHIVE_NAME  FLASHBACK_ARCHIVE#  TABLESPACE_NAME

——————————————    ———————————     —————————-

FDA_TEST                                    1                                           USERS

SQL> SELECT TABLE_NAME , OWNER_NAME , FLASHBACK_ARCHIVE_NAME , ARCHIVE_TABLE_NAME, STATUS FROM DBA_FLASHBACK_ARCHIVE_TABLES;

TABLE_NAME    OWNER_NAME    FLASHBACK_ARCHIVE_NAME    ARCHIVE_TABLE_NAME    STATUS

——————-     ———————     ——————————————       ———————————       ————-

DEPT                  SCOTT                  FDA_TEST                                       SYS_FBA_HIST_75333        ENABLED

 

 

恢复系功能

Flashback Transaction

  • 取消错误执行的事务

–指定事务识别符 ( XID ),取消指定事务

–使用REDO 日志的信息

  • 可以使用online REDO 日志、归档REDO 日志
  • 需要Supplemental Logging有效化 (*1)

DBMS_FLASHBACK.TRANSACTION_BACKOUT procedure中,

指定事务 ID,取消指定事务

 

与事务没有依存关系的情况

 

flashback5

 

flashback6


SQL> CREATE table test( id number, name varchar2(5));
表制作完成。

SQL> INSERT INTO test VALUES(1,'T1');
1行制作完成。

SQL> INSERT INTO test VALUES(2,'T1');
1行制作完成。

SQL> INSERT INTO test VALUES(3,'T1');
1行制作完成。

SQL> commit;
commit完成。



SQL> UPDATE test SET name='T2' WHERE id=1;
1行更新完成。



SQL> UPDATE test SET name='T2' WHERE id=2;
1行更新完成。
SQL> commit;
commit完成。
SQL> UPDATE test SET name='T3' WHERE id=3;
1行更新完成。
SQL> INSERT INTO test VALUES(4,'T3');
1行制作完成。
SQL> commit;
commit完成。



SQL> SELECT versions_xid,versions_operation, id,name 
   FROM  test
   VERSIONS BETWEEN scn minvalue and maxvalue;

VERSIONS_XID    V     ID NAME
--------------------------  -      --  -----
07000C00CD020000 I      4 T3
07000C00CD020000 U      3 T3
030004007D030000 U      2 T2
030004007D030000 U      1 T2
01000000BE020000 I      3 T1
01000000BE020000 I      2 T1
01000000BE020000 I      1 T1

选择了7行。



SQL> DECLARE
   f_xid sys.XID_ARRAY := sys.XID_ARRAY();
 BEGIN
   f_xid.extend;
   f_xid(1) := HEXTORAW('030004007D030000');
   DBMS_FLASHBACK.TRANSACTION_BACKOUT(1,f_xid);
 END;
 /

PL/SQL procedure正常完成。

SQL> SELECT * FROM test;
ID        NAME
---------  -----
1           T1
 2          T1
 3          T3
 4          T3

 

 

依赖于事务的情况

 

flashback7

 

flashback8

 

flashback9

 

 SQL> CREATE table test2( id number, name varchar2(5));

表制作完成。

SQL> INSERT INTO test2 VALUES(1,'T1');

1行制作完成。

SQL> INSERT INTO test2 VALUES(2,'T1');

1行制作完成。

SQL> INSERT INTO test2 VALUES(3,'T1');

1行制作完成。

SQL> commit;

commit完成。



 SQL> UPDATE test2 SET name='T2' WHERE id=2;

1行更新完成。

SQL> UPDATE test2 SET name='T2' WHERE id=3;

1行更新完成。

SQL> commit;

commit完成。

SQL> UPDATE test2 SET name='T3' WHERE id=3;
1行更新完成。

SQL> INSERT INTO test2 VALUES(4,'T3');
1行制作完成。

SQL> commit;
commit完成。



SQL> SELECT versions_xid,versions_operation, id,name 
    FROM  test2
    VERSIONS BETWEEN scn minvalue and maxvalue;

VERSIONS_XID        V     ID NAME
----------------                -         --- -----
06001D003D040000 I      4 T3
06001D003D040000 U      3 T3
01000700C2020000 U      3 T2
01000700C2020000 U      2 T2
02001C0083030000 I      3 T1
02001C0083030000 I      2 T1
02001C0083030000 I      1 T1

选择了7行。



SQL> DECLARE
   f_xid sys.XID_ARRAY := sys.XID_ARRAY();
 BEGIN
   f_xid.extend;
   f_xid(1) := HEXTORAW(' 01000700C2020000 '); 
DBMS_FLASHBACK.TRANSACTION_BACKOUT(1,f_xid);
 END;
 /
PL/SQL procedure正常完成。

行1中发生错误。:

ORA-55504: 

"SYS.DBMS_FLASHBACK", 行37

ORA-06512: "SYS.DBMS_FLASHBACK", 行70

ORA-06512: 行6



SQL> DECLARE

   f_xid sys.XID_ARRAY := sys.XID_ARRAY();

 BEGIN

   f_xid.extend;

   f_xid(1) := HEXTORAW(' 01000700C2020000 ');

   DBMS_FLASHBACK.TRANSACTION_BACKOUT

       (1,f_xid, DBMS_FLASHBACK.NONCONFLICT_ONLY);

 END;

 /

PL/SQL procedure正常完成。



SQL> SELECT * FROM test2;

ID        NAME

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

1           T1

 2          T1

 3          T3

 4          T3

 

 

  • 与事务有依赖关系的情况下,设定闪回操作
说明
NOCASCADE 检测出依赖性的情况下,报错 (默认 )
NOCASCADE_FORCE 不考虑依赖事务,强制取消指定事务
NONCONFLICT_ONLY 对于没有发生竞争的行区别变更
CASCADE 完全取消指定事务以及依赖事务 (commit时的反顺序 )

 

 

Flashback Table

  • 仅仅将指定表数据恢复到指定时点的状态的功能

–可以取消错误执行的DML语句

–闪回操作之前需要设定行移动的有效化

–因为无法保证ROWID 的値,所以需要考虑使用了ROWID的SQL的情况

  • 限制项目

–表结构的变更无法闪回

–包含TRUNCATE 的所有 DDL 语句都无法取消

 

FLASHBACK TABLE 表名 to 时间 ;

 

确认SCOTT.EMP 表的内容
SELECT EMPNO,ENAME ,JOB FROM SCOTT.EMP WHERE EMPNO = ‘7369’ ;

行删除SCOTT.EMP 表
DELETE FROM SCOTT.EMP WHERE EMPNO = ‘7369 ‘ ;
行移动的有效化
ALTER TABLE SCOTT.EMP ENABLE ROW MOVEMENT;
指定「XX 分前 」 、闪回
FLASHBACK TABLE SCOTT.EMP to timestamp (systimestamp-interval ‘XX’ minute);

結果确认
SELECT EMPNO,ENAME ,JOB FROM SCOTT.EMP WHERE EMPNO = ‘7369’ ;

 
SQL> SELECT EMPNO,ENAME ,JOB FROM SCOTT.EMP WHERE EMPNO = ‘7369’ ;

EMPNO ENAME JOB
———- ———- ———
7369 SMITH CLERK

SQL> DELETE FROM SCOTT.EMP WHERE EMPNO = ‘7369’ ;

1行被删除。

SQL> COMMIT;

commit完成。
SQL> ALTER TABLE SCOTT.EMP ENABLE ROW MOVEMENT;

表被变更。

SQL> FLASHBACK TABLE SCOTT.EMP to timestamp (systimestamp – interval ‘2’ minute);

闪回完成。

SQL> SELECT EMPNO,ENAME ,JOB FROM SCOTT.EMP WHERE EMPNO = ‘7369’ ;

EMPNO ENAME JOB
———- ———- ———
7369 SMITH CLERK

 

 

Flashback Drop

  • 将删除掉的表复原的功能

–可以取消错误的drop

  • 限制事項

–每个表区域删除时都不能闪回

–除去系统表区域,对于本地管理表区域,可以使用

 

FLASHBACK TABLE 表名 TO BEFORE DROP ;

 

通过DROP删除SCOTT.EMP 表
DROP TABLE SCOTT.EMP ;

确认加入到垃圾箱
SELECT object_name , original_name , operation , createtime FROM recyclebin ;
闪回
FLASHBACK TABLE SCOTT.EMP TO BEFORE DROP;
结果确认
SELECT COUNT(*) FROM SCOTT.EMP ;

 

SQL> conn scott/tiger

连接完成。

SQL> DROP TABLE SCOTT.EMP ;

表删除完成。

SQL> SELECT object_name , original_name , operation , createtime FROM recyclebin ;

OBJECT_NAME           ORIGINAL_NAME  OPERATION         CREATETIME

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

BIN$3dSKMruwYi3gQwEAAH+wwQ==$1 BIN$3dQ6fhcWSrLgQwEAAH85MA==$0  DROP    2011-09-17:10:21:59

BIN$3dSKMruxYi3gQwEAAH+wwQ==$0 EMP  DROP    2011-09-17:10:21:59

SQL> FLASHBACK TABLE SCOTT.EMP TO BEFORE DROP;

闪回完成。

SQL> SELECT COUNT(*) FROM SCOTT.EMP ;

  COUNT(*)

----------

14






Flashback Database

  • 数据库全体を指定時点的状态に戻す功能

–代替传统的不完整恢复的功能

※但是无法处理数据库结构文件的物理破损

  • 限制事项

–需要停止数据库

–需要RESETLOGS (与不完全恢复相同)

–需要获得闪回日志

 

FLASHBACK DATABASE TO TIMESTAMP 时间;

 
关闭数据库
shutdown immediate
mount数据库
startup mount
闪回到「XX 分前 」
FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-XX/24/60) ;
通过「 RESETLOGS 」 启动数据库
ALTER DATABASE OPEN RESETLOGS ;

 

SQL> shutdown immediate

数据库关闭。

dismount数据库。

ORACLE实例关闭了。

SQL> startup mount

启动ORACLE实例。

Total System Global Area  839282688 bytes

Fixed Size       2233000 bytes

Variable Size    583011672 bytes

Database Buffers       251658240 bytes

Redo Buffers       2379776 bytes

mount数据库。

 

flashback10

 

 

  • 存储点是什么

–闪回数据库以及其他媒介恢复操作相关功能

  • 有保障的存储点是指( Guaranteed Restore point 、后文称为 GRP )

–以一般的存储点不同,为了保障一定执行 Flashback Database ,会保存必需的Flashback Log ,会自动删除

–即使Flashback Logging 没有有效化,制成GRP的话,为了执行指定时点的Flashback Database ,就会开始获得Flashback Log 。

–Flashback Logging 有效化时,可以对任意时点执行 Flashback Database ,Flashback Logging 无效 +制成了 GRP 的情况下,可以仅对制成了GRP时点执行 Flashback Database 。

–仅仅想对指定时点执行Flashback Database 时,推荐制成GRP (有保障的存储点)

 

  • 有保障的存储点的使用前提条件

–Archive Log 模式

  • 有保障的存储点,回滚数据库时,通过FLASHBACK DATABASE 命令,需要使用存储点时点前后开始的归档REDO日志

–高速恢复区域( DB_RECOVERY_FILE_DEST / DB_RECOVERY_FILE_DEST_SIZE )

–Flashback Log 保持期間( DB_FLASHBACK_RETENTION_TARGET )(选项)

–需要将COMPATIBLE 初始化参数设置为 10.2 以上

–闪回数据库无效时(或者以前制成的所有有保障的存储点都被删除时),首次制成有保障的存储点的话,数据库虽然被mount了,但不需要启动

 

制成有保障的存储点
CREATE RESTORE POINT BEFORE_INSERT GUARANTEE FLASHBACK DATABASE;

确认SQL*Plus
SELECT NAME , SCN , TIME , DATABASE_INCARNATION# , GUARANTEE_FLASHBACK_DATABASE , STORAGE_SIZE FROM V$RESTORE_POINT;
插入数据
INSERT INTO SCOTT.DEPT VALUES(60,’DIRECT’,’ DETROIT ‘);

 

执行闪回
shutdown immediate
startup mount
FLASHBACK DATABASE TO RESTORE POINT BEFORE_INSERT;
ALTER DATABASE OPEN RESETLOGS;

确认数据
SELECT * FROM SCOTT.DEPT;

 
SQL> CREATE RESTORE POINT BEFORE_INSERT GUARANTEE FLASHBACK DATABASE;

存储点制作完成。

SQL> SELECT NAME , SCN , TIME , DATABASE_INCARNATION# ,

GUARANTEE_FLASHBACK_DATABASE , STORAGE_SIZE FROM V$RESTORE_POINT;
NAME SCN TIME DATABASE_INCARNATION# GUA STORAGE_SIZE
—————————– ———- —————————————- ——————————— ——- —— — ————
BEFORE_INSERT 1086591 13-07-15 11:51:20.000000000 4 YES 104857600

SQL> INSERT INTO SCOTT.DEPT VALUES(60,’DIRECT’,’ DETROIT ‘);
1行制作完成。

SQL> COMMIT;
commit完成。
SQL> shutdown immediate
数据库关闭。
数据库被dismount。
ORACLE实例关闭。

SQL> startup mount
ORACLE实例启动。
Total System Global Area 839282688 bytes
Fixed Size 2233000 bytes
Variable Size 553651544 bytes
Database Buffers 281018368 bytes
Redo Buffers 2379776 bytes
数据库被mount。

SQL> FLASHBACK DATABASE TO RESTORE POINT BEFORE_INSERT;
闪回完成

SQL> ALTER DATABASE OPEN RESETLOGS;

数据库变更完成。

SQL> SELECT * FROM SCOTT.DEPT;

DEPTNO DNAME LOC
———— ——————– —————-
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

 

 

Flashback 区域冗余的情况
高速恢复区域冗余的情况,警报日志中就会输入下述警报信息。
ORA-19815: 警告 : db_recovery_file_dest_size ( string byte ) 使用了100.00% byte,以及只有 0 byte可以使用了。
ORA-19809: 超过了恢复文件的限制。
ORA-19804: 从限制string中无法重新生成string byte的磁盘区域。

 

处理方法
扩大DB_RECOVERY_FILE_DEST_SIZE 的値
删除高速恢复区域中不需要的文件
通过RMAN 的 DELETE 命令删除
通过OS 命令删除

扩大DB_RECOVERY_FILE_DEST_SIZE 的値
alter system set db_recovery_file_dest_size=(充分大的尺寸)
执行例

SQL> alter system set db_recovery_file_dest_size=5000M scope = both;

系统变更完成。

从高速恢复区域中删除不需要的文件
方法1 :通过RMAN 的 DELETE 命令删除

RMAN> delete noprompt archivelog until time ‘sysdate-1’;  –删除1天前的归档日志

执行例
RMAN> delete noprompt archivelog until time ‘sysdate-1’;

归档日志删除完成
归档日志文件名=/u01/app/oracle/fast_recovery_area/ORCL/archivelog/2013_05_28/o1_mf_1_8_8t8byro9_.arc 记录ID=1
归档日志删除完成
归档日志文件名=/u01/app/oracle/fast_recovery_area/ORCL/archivelog/2013_05_28/o1_mf_1_9_8t91lvwp_.arc 记录ID=2
删除2个选项完成

从高速恢复区域中删除不需要的文件
方法 2 :通过OS 命令删除
rm –f /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2013_05_28/*
RMAN> crosscheck archivelog all;
RMAN> delete expired archivelog all;
执行例

$ rm –f /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2013_05_28/*

RMAN> crosscheck archivelog all;

本文地址 : http://www.askmaclean.com/archives/oracle-flashback闪回-实操研讨会.html

RMAN> delete expired archivelog all;

删除了2EXPIRED选项

关注刘相兵的新浪微博

扫码加入微信Oracle小密圈,了解Oracle最新技术下载分享资源

Speak Your Mind

沪公网安备 31010802001379号

TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569