undo回滾段原理圖
1,看undo的parameter
undo_management 是auto(還有manual),自動模式下需要撤銷表空間undo_tablespace(undotbs1),manual下不是這樣,manual手工下需要手工建立回滾rollback。
刪除表emp
scott@sen>delete emp;
已刪除14行。
沒有commit的時候可以直接rollback(dml語句需要顯示提交,但是這時候select會沒有資料)
如果commit了,使用回滾段處理
之後插入(通過表建立表create table emp2 as select * from emp;)
試驗部分:
1,sys@sen>alter system set undo_management=manual scope=spfile;
系統已更改。
sys@sen>shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
oracle 例程已經關閉。
sys@sen>startup
oracle 例程已經啟動。
total system global area 778387456 bytes
fixed size 1374808 bytes
variable size 545260968 bytes
database buffers 226492416 bytes
redo buffers 5259264 bytes
資料庫裝載完畢。
資料庫已經開啟。
sys@sen>
注意這裡manual下的undo_tablespace 為undotbs1
2,建立撤銷表空間
檢視表空間
sys@sen>create undo tablespace undotbs2 datafile 'd:\sendb\undotbs2.dbf' size 200m;
上課的時候各種錯誤:
a:undo tablespace寫成了undo_tablespace
b:忘記寫datafile關鍵字
c:寫成了d:\,不僅沒有外面加單引號,並且後面沒有指定undotbs2.dbf
d:沒有指定size
這裡,undo tablespace的名字undotbs2和後面的
'd:\sendb\undotbs2.dbf'可以一樣,也可以不一樣,但是建立了undotbs2之後就不可以再次增加乙個不一樣的名字了(乙個undo tablespace只能有乙個dbf?)
sys@sen>drop tablespace undotbs5;這個語句可以乾掉新建的(沒有omf的情況下,磁碟不能直接刪除,手動刪除)
3,更新操作(奇怪,為什麼更新並且commit成功,手動模式下不是必須需要回滾段rollback嗎,我之前沒有建立)
scott@sen>update emp set sal=2000 where lower(ename)='smith';
1.1更新,在我住處的筆記本,例項為jsce的測試,報錯了,終於來了
思考:在undo management為manual狀態下,系統回退段還是有的,非系統的需要手工建立rollback
4,更改預設撤銷表空間
sys@sen>alter system set undo_tablespace=undotbs2 scope=spfile;
之後關閉和重啟database(並無須重新啟動資料庫?問)
5, 檢視undotbs1是否有掛起的事務
select rn.name,rs.status from v$rollname rn,v$rollstat rs where
rn.name in (select segment_name from dba_segments where tablespace_name='undotbs1')
and rn.usn=rs.usn
提示沒有資料
1.1更新,不論oracle是否重啟,執行上面的命令都沒有掛起的任務,查詢都是未選定行。
還原undo management=auto,之後alter undo tablespace=undotbs2,在沒有重啟oracle下查詢有資料
重啟之後
where tablespace_name='undotbs2' 也有十條記錄
6,drop 空間
7,建立回滾段
sys@sen>create rollback segment rbs1;
回退段已建立。
奇怪,改為manual並且建立了rollback,重啟了,為什麼不讓update
Undo 回滾段 對應的系統引數
回滾段表空間,為什麼叫undo,而不是rollback?我們對資料庫操作理解為do,所以反向操作就是undo,通過對應的undo就可以達到回滾目的。第一行,undo management 為auto表示自動回滾段管理,空間不夠時自動擴充套件。第二行,undo retention 為900表示dml需...
關於Oracle資料庫中的undo回滾段
oracle資料庫當中,關於日誌與回滾那一部分,與別的資料庫確實有很大的不同。為了避免在寫日誌的同時後台程序對日誌檔案的讀操作,oracle使用了單獨的回滾段來記錄 舊 的資料。這樣可以達到並行讀寫的目的,整體i o效率提高了不少,但也引入了一些問題。最經典的莫過於ora 01555 snapsho...
ORACLE 建立回滾段
create rollback segment rs01 tablespace ts name storage initial 8m next 8m maxextents unlimited 回滾段管理一直是oracle資料庫管理的乙個難題,本文通過例項介紹oracle回滾段的概念,用法和規劃及問題...