考点:
闪回数据库不能撤销物理损坏,而只能恢复用户错误造成的逻辑错误.
闪回查询允许查询过去某个时间的数据库,可以借助于-条Select 语句或通过将会话临时退回到过去以使其所有查询都针对先前版本的数据库.
闪回事务能自动执行修复过程,一旦使用了闪回查询确认了引起问题的事务, Oracle 可以构造SQL语句来反转事务中的更改。
闪回表,如果己确定针对某个表提交了不正确的操作,可以指示Oracle 反转从特定的时间点以来对该表所做的所有更改,而保持其他所有表当前的状态.
考点:
闪回查询的三种形式都依赖UNDO段的使用.
19.1.3 闪回删除
现在可以撤销删除一个表,通过将DROP 命令映射到RENAME 命令可以实现此功能。
允许将表恢复到删除时的状态,而不会丢失任何数据.
闪回删除是DROP 命令特有的,而不能闪回TRUNCATE 命令。还原任何相关的索引及权限和表本身.
闪回数据库的基本条件是归档模式打开:
SQL> archivelog list;
SQL> selectlog_mode from v$database;
如果没有打开,开启归档模式
SQL> alterdatabase archivelog;
设置闪回恢复区目录与大小
SQL> altersystem set db_recovery_file_dest='/flash_recovery_area';
SQL> altersystem set db_recovery_file_dest_size=8G;
设置闪回保留目标时间(单位:分钟,默认1天)
SQL> altersystem set db_flashback_retention_target=240;
启用闪回日志记录。
SQL> shutdown immediate;
SQL> startup mount;
SQL> alterdatabase flashback on ;
确认是否已经打开
SQL> selectflashback_on from v$database;
FLASHBACK_ON
------------------
YES
19.2.4 使用闪回数据库
方法:
• 关闭数据库.
• 加载数据库
• 闪回到某个时间点、SCN 或日志切换序列号。
• 使用RESETLOGS 打开数据库.
实验1. 使用SQL*Plus 执行闪回
--确认闪回已经打开 SQL> select flashback_on from v$database;
FLASHBACK_ON ------------------ YES --查表表有3条记录 SQL> select * from t;
ID NAME ---------- ---------- 1 a 2 b 3 c --查询此时的时间 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2018-05-05 10:51:21 --向表中插入第4条记录 SQL> insert into t values (4,'d'); SQL> commit;
--关闭数据库,启动到加载模式 SQL> shutdown abort; SQL> startup mount; --闪回到插入第4条记录之前的时间 SQL> flashback database to timestamp to_timestamp('2018-05-05 10:51:21', -dd hh24:mi:ss'); SQL> alter database open read only;
数据库已更改。 --查表表有3条记录 SQL> select * from t;
ID NAME ---------- ---------- 1 a 2 b 3 c --关闭数据库,启动到加载模式 SQL> shutdown abort; SQL> startup mount; --闪回到插入第4条记录之后的时间
SQL> flashback database to timestamp to_timestamp('2018-05-05 10:54:21', -dd hh24:mi:ss'); SQL> alter database open read only; --查表表有4条记录 SQL> select * from t;
ID NAME ---------- ---------- 1 a 2 b 3 c 4 d
SQL> shutdown abort; --常规方法无法打开数据库 SQL> startup 数据库装载完毕。 ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
--打开数据库
SQL> alter database open resetlogs;
数据库已更改。 --查表表有4条记录 SQL> select * from t;
ID NAME ---------- ---------- 1 a 2 b 3 c 4 d
SQL> |
2. 使用RMAN 执行闪回
SQL> select * from t;
ID NAME ---------- ---------- 1 a 2 b 3 c 4 d
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER ------------------------ 3271874
SQL> insert into t values(5,'e');
已创建 1 行。
SQL> commit;
提交完成。
SQL> SQL> alter system switch logfile;
系统已更改。
SQL> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS ---------- ---------- ---------------- 1 4 ACTIVE 2 2 CURRENT 3 3 INACTIVE
SQL> insert into t values(6,'f');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY ------------------- 2018-05-05 13:39:08
--关闭数据库,启动到加载模式 SQL> shutdown abort; SQL> startup mount;
------------------- 4 ----------------------------- RMAN> flashback database to scn=3271874;
启动 flashback 于 05-5月 -18 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=21 设备类型=DISK
正在开始介质的恢复 介质恢复完成, 用时: 00:00:15
完成 flashback 于 05-5月 -18
SQL> alter database open read only;
数据库已更改。
SQL> select * from t;
ID NAME ---------- ---------- 1 a 2 b 3 c 4 d
------------------- 4 ----------------------------- --关闭数据库,启动到加载模式 SQL> shutdown abort; SQL> startup mount; ----------------- 5 ------------------------ RMAN> flashback database to sequence=2 ;
启动 flashback 于 05-5月 -18 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=21 设备类型=DISK
正在开始介质的恢复 介质恢复完成, 用时: 00:00:15
完成 flashback 于 05-5月 -18 --------------- 5 ------------------ --关闭数据库,启动到加载模式 SQL> shutdown abort; SQL> startup mount; ----------------- 6 --------------------
RMAN>FLASHBACK DATABASE TO TIME = "TO_DATE('2018-05-05 14:02:30', 'YYYY-MM-DD HH24:MI:SS')"; SQL> alter database open read only;
数据库已更改。
SQL> select * from t;
ID NAME ---------- ---------- 1 a 2 b 3 c 4 d 5 f 6 f
已选择6行。
----------------- 6 --------------------
|