【RECYCLEBIN】誤drop 表後長時間執行的select查詢仍可完成資料檢索現象的探祕
即使誤drop表(未使用purge引數)也不會影響長時間未完成的select語句結果!
是不是很神奇,本文通過實際操作展示給出這個現象背後的小祕密。
這個現象的背後祕密就是:回收站。在回收站功能開啟的情況下,長時間執行的select語句伊然可以通過讀取回收站中的資料完成資料的檢索。
1.建立實驗表T,並在其中初始化大量資料
sec@ora10g> create table t as select * from all_objects;
Table created.
sec@ora10g> insert into t select * from t;
24560 rows created.
sec@ora10g> /
49120 rows created.
sec@ora10g> /
98240 rows created.
sec@ora10g> /
196480 rows created.
sec@ora10g> /
392960 rows created.
sec@ora10g> /
785920 rows created.
sec@ora10g> commit;
Commit complete.
sec@ora10g> select count(*) from t;
COUNT(*)
----------
1571840
2.在第一個session中進行select操作
sec@ora10g> select * from t;
……此處省略大量不斷的輸出資料……
3.在全新開啟另外一個session完成下述動作
1)drop表T
sec@ora10g> drop table t;
Table dropped.
2)使用v$session_longops檢視當前執行的message資訊
sec@ora10g> select sid,serial#,message,time_remaining
2 from v$session_longops
3 where time_remaining > 0
4 /
Time
SID SERIAL# MESSAGE Remaining
------- ------- ------------------------------------------------------------------------------- ---------
1848 15232 Table Scan: SEC.BIN$hFitti/9oEbgQAB/AQAgDw==$0: 6268 out of 22351 Blocks done 151
可見,讀取的就是回收站中的資料。
sec@ora10g> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$hFitti/9oEbgQAB/AQAgDw==$0 TABLE
sec@ora10g> select OBJECT_NAME,ORIGINAL_NAME,TYPE,OPERATION,DROPTIME from USER_RECYCLEBIN order by DROPTIME,ORIGINAL_NAME;
OBJECT_NAME ORIGINAL_NAME TYPE OPERATION DROPTIME
------------------------------ -------------- ------ --------- -------------------
BIN$hFitti/9oEbgQAB/AQAgDw==$0 T TABLE DROP 2010-04-16:10:00:18
4.當第一個session執行完之後再重複執行select語句將會報錯。
sec@ora10g> select * from t;
select * from t
*
ERROR at line 1:
ORA-00942: table or view does not exist
5.小結
這裡是回收站幫上了忙,不過更值得思考的是在實行“危險性動作”之前一定要三思而後行。
Good luck.
secooler
10.04.26
-- The End --
是不是很神奇,本文通過實際操作展示給出這個現象背後的小祕密。
這個現象的背後祕密就是:回收站。在回收站功能開啟的情況下,長時間執行的select語句伊然可以通過讀取回收站中的資料完成資料的檢索。
1.建立實驗表T,並在其中初始化大量資料
sec@ora10g> create table t as select * from all_objects;
Table created.
sec@ora10g> insert into t select * from t;
24560 rows created.
sec@ora10g> /
49120 rows created.
sec@ora10g> /
98240 rows created.
sec@ora10g> /
196480 rows created.
sec@ora10g> /
392960 rows created.
sec@ora10g> /
785920 rows created.
sec@ora10g> commit;
Commit complete.
sec@ora10g> select count(*) from t;
COUNT(*)
----------
1571840
2.在第一個session中進行select操作
sec@ora10g> select * from t;
……此處省略大量不斷的輸出資料……
3.在全新開啟另外一個session完成下述動作
1)drop表T
sec@ora10g> drop table t;
Table dropped.
2)使用v$session_longops檢視當前執行的message資訊
sec@ora10g> select sid,serial#,message,time_remaining
2 from v$session_longops
3 where time_remaining > 0
4 /
Time
SID SERIAL# MESSAGE Remaining
------- ------- ------------------------------------------------------------------------------- ---------
1848 15232 Table Scan: SEC.BIN$hFitti/9oEbgQAB/AQAgDw==$0: 6268 out of 22351 Blocks done 151
可見,讀取的就是回收站中的資料。
sec@ora10g> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$hFitti/9oEbgQAB/AQAgDw==$0 TABLE
sec@ora10g> select OBJECT_NAME,ORIGINAL_NAME,TYPE,OPERATION,DROPTIME from USER_RECYCLEBIN order by DROPTIME,ORIGINAL_NAME;
OBJECT_NAME ORIGINAL_NAME TYPE OPERATION DROPTIME
------------------------------ -------------- ------ --------- -------------------
BIN$hFitti/9oEbgQAB/AQAgDw==$0 T TABLE DROP 2010-04-16:10:00:18
4.當第一個session執行完之後再重複執行select語句將會報錯。
sec@ora10g> select * from t;
select * from t
*
ERROR at line 1:
ORA-00942: table or view does not exist
5.小結
這裡是回收站幫上了忙,不過更值得思考的是在實行“危險性動作”之前一定要三思而後行。
Good luck.
secooler
10.04.26
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-660834/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 0504關於drop表後select查詢仍有效的問題
- 監控長時間執行的查詢(監控資料庫效能的SQL ) -- 轉資料庫SQL
- 查詢一個表插入資料的時間,按BLOCK時間BloC
- recyclebin未清引起的查詢表空間使用率慢
- 應用ROWDEPENDENCIES行級跟蹤,查詢oracle表中資料行上最後的DML時間Oracle
- 查詢某個表最後修改時間
- 怎樣查詢一個表的最後更新時間?
- 資料庫open時檢查點執行的過程資料庫
- jdon執行一段時間後經常出現的錯誤
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- 查詢正在執行的sql語句及該語句執行的時間SQL
- 後臺執行以及保持程式在後臺長時間執行
- 查詢oracle 表的大小和表的建立時間Oracle
- mysql查詢最近時間的一組資料MySql
- 關於Oracle資料庫的時間查詢Oracle資料庫
- 查詢某時間段的統計資料
- Undistract-me:當長時間執行的終端命令完成時獲取通知
- Oracle查詢表空間的每日增長量Oracle
- 03_查詢和檢索
- 時序資料庫的秘密 —— 快速檢索資料庫
- 檢視語句執行的時間
- select 表的時候如果別的會話TRUNCATE DROP PURGE表後會是什麼結果會話
- 執行長查詢時,怎樣獲取進度?
- /*列轉行查詢表資料*/
- PostgreSQL實時高效搜尋-全文檢索、模糊查詢、正則查詢、相似查詢、ADHOC查詢SQL
- 關於UPDATE中關聯查詢的執行時間考慮
- 臨時表空間的空間使用情況查詢
- drop表空間以及對應的資料檔案後空間不釋放的問題
- SQL Server之查詢檢索操作SQLServer
- EI 和 SCI 檢索號查詢
- [ORACLE BUG]查詢結果錯誤--臨時表並行Oracle並行
- sqlserver查詢資料的所有表名和行數SQLServer
- kill執行時間較長的會話會話
- 檢視oracle系統的執行時間Oracle
- 查詢某表最近5天內最後一次dml的時間
- 如何用GNU time查詢Linux命令或程式的執行時間Linux
- 查詢表空間使用情況的簡單檢視
- 臨時表空間被佔滿的原因查詢