本文地址 : https://www.askmac.cn/archives/oracle-flashback闪回-实操研讨会.html
Flashback 功能概要
所有故障案例的对策
- 在事业持续发展计划中,需要所有故障案例的对策
- High Availability: 365天24小时都无法终止系统
–为了继续服务
- 需要无论是硬件还是软件发生故障都可以继续提供服务
–Real Application Clusters
–Automatic Storage Management
–Data Guard
- 为了将故障时的downtime压缩到最小
–需要迅速处理各种故障
- 物理故障
- 理论故障
物理故障与理论故障
- 物理故障: 数据库结构文件的破损
–对策
- 硬件的镜像
- 定期备份
- 理论故障:用户以及应用的错误变更
–因为有人的参与,所以肯定会发生以上故障
- 「更新了错误的补丁!!」
- 「DROP了其他的表!」
- 「 想知道3小时之前的数据!」
理论故障的修复<传统>
理论故障的修复<闪回>
不是通过备份来存储的,
不需要存储时间,所以比传统的不完全恢复要简单高速
闪回功能是指什么
- 理论故障中的恢复功能
–尽早恢复人为错误
- 删除了重要数据、更新了错误数据、删错了表等,维护失误导致的问题
- 应用错误、执行了错误补丁导致的问题
- 将数据库整体,或者一部分,还原到过去某一时间点的状态
–不需要从备份恢复
- 比传统的不完全恢复简单多了
- 可以参考往期数据
- 对错误的数据修改效果非常好
可以将由于理论故障造成的业务(系统终止)压抑在最低限度
闪回功能的设定
- 为了还原数据,需要有日志
–在大部分的闪回功能中使用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 的设定 | 闪回数据库模式无效化
归档日志模式无效化 默认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完成。
- 通过事务単位展示变更历史
–追踪用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,取消指定事务
与事务没有依存关系的情况
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
依赖于事务的情况
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数据库。
- 存储点是什么
–闪回数据库以及其他媒介恢复操作相关功能
- 有保障的存储点是指( 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;
略
本文地址 : https://www.askmac.cn/archives/oracle-flashback闪回-实操研讨会.html
RMAN> delete expired archivelog all;
略
删除了2EXPIRED选项
Comment