还原点就是一个特色的SCN,记录在controlfile中,属于lightweight级别,很小,可以存储上千个,也可以更多.
还原点有保护的和非保护之分,那么差别在哪里呢,测试看一下,建立一个名为emp_before_delete的非保护(默认)还原点.
数据库未启动闪回,创建还原点:
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
SQL> select * from v$restore_point
SCN DATABASE_INCARNATION# GUA STORAGE_SIZE TIME NAME
---------- --------------------- --- ------------ ---------------------------------------- --------------------
834685 2 NO 0 18-4月 -08 11.35.29.000000000 上午 EMP_BEFORE_DELETE
SQL> delete from scott.emp;
已删除15行。
SQL> commit;
提交完成。
闪回表到还原点:
SQL>flashback table scott.emp to restore point EMP_BEFORE_DELETE
闪回完成。
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
9888 Obraiz DBA 7782 2008-04-14 15:24:38 8000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
已选择15行。
SQL> alter database flashback on;
数据库已更改。
SQL> select * from v$restore_point;
SCN DATABASE_INCARNATION# GUA STORAGE_SIZE TIME NAME
---------- --------------------- --- ------------ ---------------------------------------- --------------------
834685 2 NO 0 18-4月 -08 11.35.29.000000000 上午 EMP_BEFORE_DELETE
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1298184 bytes
Variable Size 209715448 bytes
Database Buffers 398458880 bytes
Redo Buffers 2895872 bytes
数据库装载完毕。
SQL> flashback database to restore point EMP_BEFORE_DELETE;
flashback database to restore point EMP_BEFORE_DELETE
*
第 1 行出现错误:
ORA-38729: 执行 FLASHBACK 的闪回数据库日志数据不足。
可以发现闪回数据库没有闪回到以前还原点的闪回日志,如果我们建立保护的还原点会什么样呢?是否可以使用flashback database,会不会系统自动建立日志呢,如果不建立日志怎么闪回呢?
SQL> alter database open;
数据库已更改。
SQL> flashback table scott.emp to restore point EMP_BEFORE_DELETE;
flashback table scott.emp to restore point EMP_BEFORE_DELETE
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-12801: 并行查询服务器 P000 中发出错误信号
ORA-01555: 快照过旧: 回退段号 7 (名称为 "_SYSSMU7$") 过小
再次回滚时,undo表空间已经没有历史数据,闪回到还原点读取的还是UNDO.
SQL> select count(*) from scott.emp;
COUNT(*)
----------
0
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/175005/viewspace-246296/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/175005/viewspace-246296/