Oracle 恢復表數據到指定時間點
昨天在操作數據庫的時候,對一張表執行了update語句,但是沒有加上where過濾條件,導致表中的數據全部都被修改了。所以就想着嘗試將表恢復到指定的時間點上。
嘗試執行如下語句:
- select * from table_name as of timestamp to_timestamp('time','yyyy-mm-dd hh24:mi:ss');
- alter table table_name enable row movement;
- flashback table table_name to timestamp TO_TIMESTAMP('time','yyyy-mm-dd hh24:mi:ss');
以上的語句分別用來:
- 查看緩存區指定時間點指定表的數據
- 為表開啟行遷移(允許Oracle 修改分配給行的rowid。在Oracle 中,插入一行時就會為它分配一個rowid,而且這一行永遠擁有這個rowid。閃回表處理會對EMP 完成DELETE,並且重新插入行,這樣就會為這些行分配一個新的rowid。要支持閃回就必須允許Oracle 執行這個操作)
- 閃回到指定時間點
但是昨天執行第一條語句的時候出錯了
ORA-01555 snapshot too old:
rollback segment number string with name "string" too small
是的,說是快照太舊了。
這個就很無語,然后網上查了一下,引起這個報錯的原因如下:
- undo段太小
- 事務被頻繁提交
- 查詢時間過長
這個其實就是undo段太小然后事務的頻繁提交導致undo段被覆蓋了,再想去查的時候就會報snapshot too old
解決方法就是避免上面三個原因的發生了。
但是,我誤操作的數據怕是還原不回來了- -