Oracle數據閃回

Oracle數據閃回操作


假如有表 TEMP
SQL> SELECT * FROM TEMP;
 
        ID INFO
---------- --------------------------------------------------------------------------------
         1 aaa
         2 bbb
         3 ccc
 
SQL> DELETE FROM TEMP ID = 1;
 
1 row deleted
 
SQL> COMMIT;
 
Commit complete
 
SQL> SELECT * FROM TEMP;
 
        ID INFO
---------- --------------------------------------------------------------------------------
         2 bbb
         3 ccc
 
恢復數據
SQL> FLASHBACK TABLE TEMP TO TIMESTAMP TO_TIMESTAMP('2010-9-9 10:16:3','yyyy-mm-dd hh24:mi:ss');
ORA-08189: 因爲未啓用行移動功能, 不能閃回表
SQL> ALTER TABLE TEMP ENABLE ROW MOVEMENT;
Table altered   www.2cto.com 
SQL> FLASHBACK TABLE TEMP TO TIMESTAMP TO_TIMESTAMP('2010-9-9 10:16:3','yyyy-mm-dd hh24:mi:ss');
 
SQL> SELECT * FROM TEMP;
 
       ID INFO
---------- --------------------------------------------------------------------------------
         1 aaa
         2 bbb
         3 ccc
 
drop表後的恢復
SQL> DROP TABLE TEMP;
 
Table dropped
 
SQL> SELECT * FROM TEMP;
 
ORA-00942: 表或視圖不存在
 
SQL> FLASHBACK TABLE TEMP TO BEFORE DROP;
 
SQL> SELECT * FROM TEMP;   www.2cto.com 
 
        ID INFO
---------- --------------------------------------------------------------------------------
         1 aaa
         2 bbb
         3 ccc 




擴展一下:
在oracle10g中,如果不小心drop掉一張表,能不能恢復呢?
答案是肯定的,在oracle10g中,當使用命令drop table tablename 命令時,其實不會真正的刪除該表,而是把表放到了回收站中(回收站的概念類似windows中的回收站),所以我們可以通過flashback命令來恢復drop掉的表,下面就該問題做一個小小的研究
 
我們先創建一張表
Create table test (
Id int,
Name varchar(20)
)
再插入幾條數據
insert into test(id,name) values(1,'a');
insert into test(id,name) values(2,'b');
commit;
好了,爲了更好觀察,我們先執行下面的命令清空一下回收站
Purge recyclebin;
SQL> select original_name,dropscn from recyclebin;
未選定行
好了,回收站已經清空了
下面再把上面創建的test表drop掉,再看下回收站
SQL> drop table test;
表已刪除。  www.2cto.com 
SQL> select original_name,dropscn from recyclebin;
ORIGINAL_NAME  DROPSCN
-------------------------------- ----------
TEST  1742491
SQL> select * from test;
select * from test
*
第 1 行出現錯誤:
ORA-00942: 表或視圖不存在
SQL>
這時候從回收站中查到了被drop表的,而且使用select語句也找不到表了,好了,下面我們再使用flashback恢復一下
SQL> flashback table test to before drop;
閃回完成。
SQL> select * from test;
ID NAME
---------- --------------------
1 a
2 b
恢復以後,表結構和數據都被找了回來
那麼好,下面我們再出個考題,這是OCP考試裏的題,在上面的實驗基本上再執行下面的操作,想想會發生什麼事呢?
drop table test; --drop表test表
以相同的名字再次創建test表,但字段不同
Create table test (
a int,
b varchar(20),
c varchar(30)
)
drop table test --然後再次drop掉test表
再執行flashback恢復
flashback table test to before drop;
這時候大家想想會恢復哪個表呢?是第一次創建的?還是第二次創建的?好了做實驗,讓實事來說話
SQL> drop table test;
表已刪除。  www.2cto.com  
SQL> create table test(
2 a int,
3 b varchar(20),
4 c varchar(30)
5 );
表已創建。
SQL> drop table test;
表已刪除。
SQL> select original_name,dropscn from recyclebin;
ORIGINAL_NAME  DROPSCN
-------------------------------- ----------
TEST  1743515
TEST  1743435
SQL> flashback table test to before drop;
閃回完成。
SQL> select * from test;
未選定行
SQL> desc test;
名稱  是否爲空? 類型
----------------------------------------- -------- ----------------------------
A  NUMBER(38)
B  VARCHAR2(20)
C  VARCHAR2(30)
通過以上實驗,我們可以看到,雖然名字相同,但flashback恢復的只是最後一次創建的表
請注意上面的查詢回收站的語句,從回收站中,可以看到,共有兩個test表,但dropscn不一樣,使用flashback命令只恢復dropscn大的哪個表,以前的都是垃圾了
關於flashback命令還有一個需要注意的,如果在drop表時,加上了purge選項,則無法恢復,看下面實驗
SQL> drop table test purge;   www.2cto.com  
表已刪除。
SQL> select original_name,dropscn from recyclebin;
ORIGINAL_NAME  DROPSCN
-------------------------------- ----------
TEST  1743435
SQL> flashback table test to before drop;
閃回完成。
SQL> select * from test;
ID NAME
---------- --------------------
1 a
2 b
drop時使用了purge選項,所以該drop沒有放入回收站,那爲什麼執行flashback table時又恢復成功了呢?
能過上面的實驗可以看到,恢復的是我們第一次創建的test表,而第二次創建的test表就無法恢復了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章