因為在檢查all_objects時發現有一張表的last_ddl_time發生了變化,為了防止是其結構發生變化,進而進行了檢查。但是如果沒有對原始表的結構記錄,該如何處理呢?
因為當時該資料庫已經開啟了FLASH BACK功能,所以通過這個線索來進行處理。
進行如下方法:
as select *
from tab_log as timestamp(`2008-12-08 8:00:00`, `YYYY-MM-DD HH24:MI:SS`) where rownum<5;
然後比對tab_log_ver和tab_log欄位沒有發現不同。為防止判斷有問題,又做了進一步的實驗:
SQL> desc test_log_ver
Name Type Nullable Default Comments
———– ————- ——– ——- ——–
MESSAGE_ID VARCHAR2(100)
TASK_ID VARCHAR2(18)
SUBMIT_TIME VARCHAR2(14) Y
TERMINAL_ID VARCHAR2(20) Y
STATUS CHAR(10) Y
然後開始修改該測試表的結構:
Table altered
Executed in 0.125 seconds
SQL> alter table test_log_ver add(test_col number);
Table altered
Executed in 0 seconds
SQL> select object_name,
2 to_char(created, `yyyy-mm-dd hh24:mi:ss`) created,
3 to_char(last_ddl_time, `yyyy-mm-dd hh24:mi:ss`) last_ddl_time
4 from user_objects
5 where object_name = `TEST_LOG_VER`
6 ;
OBJECT_NAME CREATED LAST_DDL_TIME
—————- ——————- ———————
TEST_LOG_VER 2008-12-08 15:38:00 2008-12-08 15:46:15
Executed in 0.016 seconds
試圖檢查修改之前的資料資訊:
to_timestamp(`2008-12-08 15:38:10`, `YYYY-MM-DD HH24:MI:SS`)
ORA-01466: unable to read data – table definition has changed
報ORA-01466錯誤。使用FLASHBACK TABLE來執行,同樣的報錯資訊。
SYSDATE
———————–
2008-12-08 16:28:50
在16:28分時,執行FLASHBACK操作,並且指定的時間大於2008-12-08 15:46:15。
SQL> flashback table XXX.test_log_ver to timestamp to_timestamp(`2008-12-08 15:50:00`, `YYYY-MM-DD HH24:MI:SS`);
Flashback complete.
成功執行!
這裡我們不難發現,如果結構發生改變,基於FLASH BACK的查詢或者恢復都會有一定的問題,它只能恢復到修改後的時間點。畢竟FLASHBACK是為資料的快速恢復來設計使用的。
但是可以在一定的程度上證明,資料結構沒有發生改變的時間。否則就會報ORA-01466錯誤了。
-:)