手动创建数据库实例全攻略7:UNDO
生活随笔
收集整理的這篇文章主要介紹了
手动创建数据库实例全攻略7:UNDO
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
手動創建數據庫實例全攻略7:UNDO
在開始之前,我們先來思考幾個問題? 1. ora-01555錯誤的是怎么產生的?有什么辦法解決?該問題,參考我的Blog: Oracle ORA-01555快照過舊http://blog.csdn.net/tianlesoftware/archive/2009/10/31/4745898.aspx 2. 回滾段(回滾表空間)有什么作用? 3. 數據庫啟動的時候,如何加載回滾段(回滾段表空間)。 4. 回滾段的數量由什么公式來計算 5. 回滾表空間的大小如何確定?一. 什么是undo Oracle數據庫在回退、撤銷或者改變數據所需要的維護數據庫信息的一種手段。這里的數據庫信息是指在數據庫提交之前的記錄的改變等事務信息。Undo 信息主要有以下用途: 當系統發出rollback信息 數據庫恢復 提供讀一致性當系統發出rollback命令時,undo 信息通過記錄的信息將數據庫的改變恢復到commit之前的狀態。在數據庫恢復期間,undo信息被用來從redo log中撤銷任何未提交到數據文件的事務。當一個用戶在訪問數據時,Undo記錄通過維護訪問數據的前鏡像數據來保證當有其他用戶改變相同數據時數據庫的讀一致性。以前數據庫使用回滾段來存儲undo信息,這種回滾段管理方式非常的復雜。現在數據庫采用undo的方式降低了管理的復雜性,同時減少了dba的工作負荷。但是在數據庫只能使用這兩種方式的一種。可以在數據庫里定義兩種方式的文件,但是,同一時刻,必須指定數據使用哪一種方式。當你需要在兩種方式中切換時,必須將系統重新啟動。Oracle數據庫一直使用系統回滾段來完成系統的事務。系統回滾段是在數據庫,創建的時候產生的,系統啟動后就一直在線。Dba不需要對它作任何的操作來優化。二. 指定Undo的方式 oracle 9i以后有個初始化參數:undo_management。當將undo_management設置成AUTO時系統使用重做表空間來管理回滾段,當它被設置成MENUAL時系統使用回滾段。 oracle推薦使用重做表空間代替回滾段。當系統使用auto方式管理undo信息時,系統必須指定一個undo表空間。這個表空間可以是在數據庫創建時產生,也可以數據庫創建后再創建。當實例啟動的時候,系統自動選擇第一個有效的undo表空間或者是rollback segment,如果沒有有效的可用的undo表空間或者是回滾段,系統使用system rollback segment。這種情況是不被推薦的,當系統運行在沒有undo的情況下,系統會在alert.log中記錄一條警告信息。2.1 自動管理模式(Automatic Undo Management)如果系統使用要使用auto方式管理undo信息,那么需要通過指定初始化參數undo_tablespace的值來指定系統使用哪一個undo表空間來存放undo信息。如果指定了undo_tablespace的值,但是系統中不存在這樣的表空間,那些系統啟動將會失敗。此時可以做的操作是,如果系統存在undo表空間,為undo_tablespace指定正確的undo表空間名字,或者將undo_tablespace注釋。系統會采用存在的undo表空間。否則使用手動方式。相關的初始化參數: undo_tablespace 指名系統使用哪一個重做表空間。 undo_suppress_errors 被設置成true時表示系統創建和使用回滾段時忽略錯誤。 undo_retention 系統提交后,回滾段的數據保留多長時間,單位是秒。 當系統被設置成menual后,這幾個參數被忽略。SQL> show parameter undo NAME TYPE VALUE ------------------------------------ - ---------- --------------- undo_management string AUTO undo_retention integer 1000 undo_tablespace string UNDOTBS1補充:初始化參數UNDO_RETENTION 該參數用來指定undo 記錄保存的最長時間,以秒為單位,是個動態參數,完全可以在實例運行時隨時修改通常默認是900 秒,也就是15 分鐘。 一定要注意,undo_retention 只是指定undo 數據的過期時間,并不是說,undo 中的數據一定會在undo表空間中保存15 分鐘,比如說剛一個新事務開始的時候,如果undo 表空間已經被寫滿,則新事務的數據會自動覆蓋已提交事務的數據,而不管這些數據是否已過期,因此呢,這就又關聯回了第一點,當你創建 一個自動管理的undo 表空間時,還要注意其空間大小,要盡可能保證undo 表空間有足夠的存儲空間。 同時還要注意,也并不是說,undo_retention 中指定的時間一過,已經提交事務中的數據就立刻無法訪問,它只是失效,只要不被別的事務覆蓋,它會仍然存在,并可隨時被flashback 特性引用。如果你的undo表空間足夠大,而數據庫又不是那么繁忙,那么其實undo_retention 參數的值并不會影響到你,哪怕你設置成1,只要沒有事務去覆蓋undo 數據,它就會持續有效。因此呢,這里還是那句話,要注意undo 表空間的大小,保證其有足夠的存儲空間。只有在一種情況下,undo 表空間能夠確保undo 中的數據在undo_retention 指定時間過期前一定有效,就是為undo 表空間指定Retention Guarantee,指定之后,oracle 對于undo 表空間中未過期的undo 數據不會覆蓋, 例如: SQL> Alter tablespace undotbs1 retention guarantee;如果想禁止undo 表空間retention guarantee, 例如: SQL> Alter tablespace undotbs1 retention noguarantee;2.2 manual管理模式 當將系統中初始化參數undo_management設置成manual后,系統啟動后使用rollback segment方式存儲undo信息。如果系統沒有指定undo_management,那么系統默認以manual方式啟動,即使設置了auto方式的參數,這些參數將被忽略。當實例啟動時,系統根據如下幾個步驟確認online的rollback segment的數量: 初始化參數rollback_segments 初始化參數transactions、transactions_per_rollback_segment 與menual相關的初始化參數 rollback_segments 指定實例啟動時所需要的回滾段 transactions 指定系統中最大的并發事務數 transactions_per_rollback_segment 指定每一個回滾段支持的并發數 max_rollback_segments 指明系統支持的最大的online的回滾段數目三 . 管理undo tablespace創建undo talespace有兩種方式: 1. 數據庫創建時創建undo tablespace; 2. 在一個已經存在的數據庫創建。 在undo tablespace中不能創建數據庫對象,這是因為這個表空間是為數據庫recover而準備的。3.1 創建數據庫時創建undo tablespace 在創建數據庫的時候可以通過指定undo子句來創建undo tablespace,但是這個子句不是必須的。 如果在創建數據庫時,系統指定是auto模式,但是沒有指明undo tablespace的名字,那么系統會創建一個默認的回滾表空間,名稱叫sys_undotbs。這個表空間根據oracle定義的缺省值創建。初始化大小是10m,可以自動擴展。不過oracle推薦最好還是使用一個指定的大小。CREATE DATABASE rbdb1 CONTROLFILE REUSE ... UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';注意:如果此時系統創建undo失敗,那么整個創建數據庫的命令就失敗了。此時 Dba需要刪除已經創建的數據文件,糾正錯誤,重建創建數據庫。使用create undo tablespace子句創建 CREATE UNDO TABLESPACE undotbs_02 DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;3.2 Undo tablespace的相關操作1. 增加數據文件 ALTER TABLESPACE undotbs_01 ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;2. 重命名數據文件 ALTER TABLESPACE undotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf';3. 使數據文件online或者offline ALTER TABLESPACE undotbs_01 online|offline;4. 開始或者結束一個聯機備份 ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;5. 刪除undo tablespace Drop tablespace undotbs_01; Drop undo表空間的時候必須是在未使用的情況下才能進行。如果undo表空間正在使用(例如事務失敗,但是還沒有恢復成功),那么drop表空間命令將失敗。在drop表空間的時候可以使用including contents。6. 切換undo tablespace 切換undo表空間有兩種方式: 1. 使用命令動態修改; 2. 修改初始化參數后重新啟動數據庫。Alter system set undo_tablespace=undotbs1; 當切換命令完成后,所有的事務就會在新的回滾表空間內進行。以下幾種情況會導致切換命令失敗: 1. 表空間不存在; 2.. 表空間不是一個回滾段表空間; 3. 表空間已經被另一個實例使用。注意:切換的操作不等待舊undo表空間的事務提交。如果舊undo表空間有事務未提交,那么舊的undo表空間進入pending offline狀態,在這種模式下所有的事務能夠繼續進行,但是undo表空間不能被其他實例使用,也不能被刪除,直到所有的事務提交后, undo表空間才進入offline模式。7. 設置undo_retention dba可以設置undo_retention初始化參數指定undo回滾表空間保留undo信息的時間。在設置好這個參數時,系統會保留undo信息在指定的時間斷后才收回這個空間。 一般情況下,系統會保留undo信息到指定的時間后才回收空間,但是,如果系統 存在大量的事務,也會將未到期的undo空間回收,以供使用。8. Undo 表空間大小的設計規范的計算公式 Undospace = UR * UPS *db_block_size+ 冗余量 UR: 表示在undo中保持的最長時間數(秒),由數據庫參數UNDO_RETENTION值決定。 UPS:表示在undo中,每秒產生的數據庫塊數量。和undo有關的動態性能視圖v$undostat 包含undo的統計信息。使用這張視圖可以估計系統當前所需的undo大小。 v$rollstat 是undo模式的視圖。是undo表空間的undo segments的統計信息 v$transaction 包含undo segments的信息。 dba_undo_extents 包含undo表空間中每一個范圍的提交時間。四. 管理回滾段 4.1 回滾段的使用方針 4.1.1 使用多個回滾段 使用多個回滾段來分擔回滾段的爭用,以提高系統性能。系統采用循環的方式來分配回滾段。當oracle創建數據庫時候,系統自動在system中分配一個system rollback segment,用來完成系統的事務,不為大家共用。所以系統最后能有至少一個回滾段存放用戶回滾信息。系統能夠加載的用戶回滾段數量和以下幾個初始化參數有關: transactions_per_rollback_segment 指定每一個回滾段支持的并發數; max_rollback_segments 指明系統支持的最大的online的回滾段數目; rollback_segments 指定實例啟動時所需要的回滾段;4.1.2 選擇好回滾段的類型 private 必須通過實例指定名稱后才能使用。 如:必須在初始化參數中rollback_segments指定后,實例啟動才能使用,或者在實例啟動后online才能使用。 Public 則是實例啟動時系統自動發現,系統根據初始化參數決定系統啟動時的回滾段。4.1.3 為事務指定回滾段 在系統啟動時指定所需要的回滾段,4.1.4 估計回滾段的大小 回滾段大小應該基于系統最大的事務。如果回滾段過小,容易產生ora-01555錯誤。可以使用optimize選項來限制回滾段自動回收。回滾段的大小應該是最大表的大小的10%,這個可以指定maxextents的數量。4.1.5 創建范圍大小和數量相等的回滾段組 一般來說一個回滾段應該包含10到20個范圍。 s=T/n s是初始化時定義的范圍的大小,T是初始化的回滾段大小,n是范圍數。由此可以確定定義回滾段的子句的各個參數。4.1.6 定義optimal的值 設置這個參數可以避免回滾段無限擴展以及系統自動回收空間。最小是兩個范圍的大小。 設置回滾段在不同的表空間 1:如果系統只有一個回滾表空間,那么回滾段出現問題,影響系統不能運行。 2:包含回滾段的表空間經常分配和去配容易產生碎片。 3:當回滾表空間被離線時,系統將沒有回滾表空間可以用。MINEXTENTS最小等于2 OPTIMAL最小應該設置成兩個extents大小 INITIAL和 NEXT最好一樣,除了應用使用指定的回滾段;4.2 回滾段的相關操作4.2.1 創建回滾段 當創建回滾段時,系統必須要有CREATE ROLLBACK SEGMENT系統權限。創建的回滾段會online,并指定了存儲參數; CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1STORAGE ( INITIAL integer K|M NEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );4.2.2 修改回滾段 修改回滾段當修改回滾段時,系統必須要有ALTER ROLLBACK SEGMENT系統權限。使回滾段online或者offline; ALTER ROLLBACK SEGMENT RB01 ONLINE;修改存儲參數; ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );收縮回滾段; ALTER ROLLBACK SEGMENT RB01 SHRINK; 注意:有OPTIMAL參數時, 縮小到OPTIMAL值; 沒有OPTIMAL參數時, 縮小到MINEXTENTS所對應的尺寸 ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K; ALTER ROLLBACK SEGMENT RB01 STAROGE(MAXEXTENTS 120);4.2.3 刪除回滾段 當刪除回滾段時,系統必須要有DROP ROLLBACK SEGMENT系統權限。 原則上,INITIAL總應該等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由于INITIAL不能直接修改,只能先drop然后創建。DROP ROLLBACK SEGMENT RB01; CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1 STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);在事務中使用特定的回滾段 SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;通過這個命令,可以: 根據事務量的大小,決定使用哪一個回滾段; 將大的查詢的事務放入單獨的回滾段; 當存在大的查詢使用事務時,可以將它放入大的回滾段。4.3 和回滾段相關的性能視圖 DBA_ROLLBACK_GEGS 描述回滾段的信息,包含回滾段的名字和表空間; DBA_SEGMENTS 描述回滾段的附加信息; V$ROLLNAME 列出在線回滾段的名稱 V$ROLLSTAT 包含回滾段的統計信息 V$TRANSACTION 包含撤銷的統計信息
一、偷來的常識
網絡上這個哥們寫的太精彩了,直接復制閱讀之!
文字來源:http://blog.csdn.net/tianlesoftware/article/details/4901666在開始之前,我們先來思考幾個問題? 1. ora-01555錯誤的是怎么產生的?有什么辦法解決?該問題,參考我的Blog: Oracle ORA-01555快照過舊http://blog.csdn.net/tianlesoftware/archive/2009/10/31/4745898.aspx 2. 回滾段(回滾表空間)有什么作用? 3. 數據庫啟動的時候,如何加載回滾段(回滾段表空間)。 4. 回滾段的數量由什么公式來計算 5. 回滾表空間的大小如何確定?一. 什么是undo Oracle數據庫在回退、撤銷或者改變數據所需要的維護數據庫信息的一種手段。這里的數據庫信息是指在數據庫提交之前的記錄的改變等事務信息。Undo 信息主要有以下用途: 當系統發出rollback信息 數據庫恢復 提供讀一致性當系統發出rollback命令時,undo 信息通過記錄的信息將數據庫的改變恢復到commit之前的狀態。在數據庫恢復期間,undo信息被用來從redo log中撤銷任何未提交到數據文件的事務。當一個用戶在訪問數據時,Undo記錄通過維護訪問數據的前鏡像數據來保證當有其他用戶改變相同數據時數據庫的讀一致性。以前數據庫使用回滾段來存儲undo信息,這種回滾段管理方式非常的復雜。現在數據庫采用undo的方式降低了管理的復雜性,同時減少了dba的工作負荷。但是在數據庫只能使用這兩種方式的一種。可以在數據庫里定義兩種方式的文件,但是,同一時刻,必須指定數據使用哪一種方式。當你需要在兩種方式中切換時,必須將系統重新啟動。Oracle數據庫一直使用系統回滾段來完成系統的事務。系統回滾段是在數據庫,創建的時候產生的,系統啟動后就一直在線。Dba不需要對它作任何的操作來優化。二. 指定Undo的方式 oracle 9i以后有個初始化參數:undo_management。當將undo_management設置成AUTO時系統使用重做表空間來管理回滾段,當它被設置成MENUAL時系統使用回滾段。 oracle推薦使用重做表空間代替回滾段。當系統使用auto方式管理undo信息時,系統必須指定一個undo表空間。這個表空間可以是在數據庫創建時產生,也可以數據庫創建后再創建。當實例啟動的時候,系統自動選擇第一個有效的undo表空間或者是rollback segment,如果沒有有效的可用的undo表空間或者是回滾段,系統使用system rollback segment。這種情況是不被推薦的,當系統運行在沒有undo的情況下,系統會在alert.log中記錄一條警告信息。2.1 自動管理模式(Automatic Undo Management)如果系統使用要使用auto方式管理undo信息,那么需要通過指定初始化參數undo_tablespace的值來指定系統使用哪一個undo表空間來存放undo信息。如果指定了undo_tablespace的值,但是系統中不存在這樣的表空間,那些系統啟動將會失敗。此時可以做的操作是,如果系統存在undo表空間,為undo_tablespace指定正確的undo表空間名字,或者將undo_tablespace注釋。系統會采用存在的undo表空間。否則使用手動方式。相關的初始化參數: undo_tablespace 指名系統使用哪一個重做表空間。 undo_suppress_errors 被設置成true時表示系統創建和使用回滾段時忽略錯誤。 undo_retention 系統提交后,回滾段的數據保留多長時間,單位是秒。 當系統被設置成menual后,這幾個參數被忽略。SQL> show parameter undo NAME TYPE VALUE ------------------------------------ - ---------- --------------- undo_management string AUTO undo_retention integer 1000 undo_tablespace string UNDOTBS1補充:初始化參數UNDO_RETENTION 該參數用來指定undo 記錄保存的最長時間,以秒為單位,是個動態參數,完全可以在實例運行時隨時修改通常默認是900 秒,也就是15 分鐘。 一定要注意,undo_retention 只是指定undo 數據的過期時間,并不是說,undo 中的數據一定會在undo表空間中保存15 分鐘,比如說剛一個新事務開始的時候,如果undo 表空間已經被寫滿,則新事務的數據會自動覆蓋已提交事務的數據,而不管這些數據是否已過期,因此呢,這就又關聯回了第一點,當你創建 一個自動管理的undo 表空間時,還要注意其空間大小,要盡可能保證undo 表空間有足夠的存儲空間。 同時還要注意,也并不是說,undo_retention 中指定的時間一過,已經提交事務中的數據就立刻無法訪問,它只是失效,只要不被別的事務覆蓋,它會仍然存在,并可隨時被flashback 特性引用。如果你的undo表空間足夠大,而數據庫又不是那么繁忙,那么其實undo_retention 參數的值并不會影響到你,哪怕你設置成1,只要沒有事務去覆蓋undo 數據,它就會持續有效。因此呢,這里還是那句話,要注意undo 表空間的大小,保證其有足夠的存儲空間。只有在一種情況下,undo 表空間能夠確保undo 中的數據在undo_retention 指定時間過期前一定有效,就是為undo 表空間指定Retention Guarantee,指定之后,oracle 對于undo 表空間中未過期的undo 數據不會覆蓋, 例如: SQL> Alter tablespace undotbs1 retention guarantee;如果想禁止undo 表空間retention guarantee, 例如: SQL> Alter tablespace undotbs1 retention noguarantee;2.2 manual管理模式 當將系統中初始化參數undo_management設置成manual后,系統啟動后使用rollback segment方式存儲undo信息。如果系統沒有指定undo_management,那么系統默認以manual方式啟動,即使設置了auto方式的參數,這些參數將被忽略。當實例啟動時,系統根據如下幾個步驟確認online的rollback segment的數量: 初始化參數rollback_segments 初始化參數transactions、transactions_per_rollback_segment 與menual相關的初始化參數 rollback_segments 指定實例啟動時所需要的回滾段 transactions 指定系統中最大的并發事務數 transactions_per_rollback_segment 指定每一個回滾段支持的并發數 max_rollback_segments 指明系統支持的最大的online的回滾段數目三 . 管理undo tablespace創建undo talespace有兩種方式: 1. 數據庫創建時創建undo tablespace; 2. 在一個已經存在的數據庫創建。 在undo tablespace中不能創建數據庫對象,這是因為這個表空間是為數據庫recover而準備的。3.1 創建數據庫時創建undo tablespace 在創建數據庫的時候可以通過指定undo子句來創建undo tablespace,但是這個子句不是必須的。 如果在創建數據庫時,系統指定是auto模式,但是沒有指明undo tablespace的名字,那么系統會創建一個默認的回滾表空間,名稱叫sys_undotbs。這個表空間根據oracle定義的缺省值創建。初始化大小是10m,可以自動擴展。不過oracle推薦最好還是使用一個指定的大小。CREATE DATABASE rbdb1 CONTROLFILE REUSE ... UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';注意:如果此時系統創建undo失敗,那么整個創建數據庫的命令就失敗了。此時 Dba需要刪除已經創建的數據文件,糾正錯誤,重建創建數據庫。使用create undo tablespace子句創建 CREATE UNDO TABLESPACE undotbs_02 DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;3.2 Undo tablespace的相關操作1. 增加數據文件 ALTER TABLESPACE undotbs_01 ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;2. 重命名數據文件 ALTER TABLESPACE undotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf';3. 使數據文件online或者offline ALTER TABLESPACE undotbs_01 online|offline;4. 開始或者結束一個聯機備份 ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;5. 刪除undo tablespace Drop tablespace undotbs_01; Drop undo表空間的時候必須是在未使用的情況下才能進行。如果undo表空間正在使用(例如事務失敗,但是還沒有恢復成功),那么drop表空間命令將失敗。在drop表空間的時候可以使用including contents。6. 切換undo tablespace 切換undo表空間有兩種方式: 1. 使用命令動態修改; 2. 修改初始化參數后重新啟動數據庫。Alter system set undo_tablespace=undotbs1; 當切換命令完成后,所有的事務就會在新的回滾表空間內進行。以下幾種情況會導致切換命令失敗: 1. 表空間不存在; 2.. 表空間不是一個回滾段表空間; 3. 表空間已經被另一個實例使用。注意:切換的操作不等待舊undo表空間的事務提交。如果舊undo表空間有事務未提交,那么舊的undo表空間進入pending offline狀態,在這種模式下所有的事務能夠繼續進行,但是undo表空間不能被其他實例使用,也不能被刪除,直到所有的事務提交后, undo表空間才進入offline模式。7. 設置undo_retention dba可以設置undo_retention初始化參數指定undo回滾表空間保留undo信息的時間。在設置好這個參數時,系統會保留undo信息在指定的時間斷后才收回這個空間。 一般情況下,系統會保留undo信息到指定的時間后才回收空間,但是,如果系統 存在大量的事務,也會將未到期的undo空間回收,以供使用。8. Undo 表空間大小的設計規范的計算公式 Undospace = UR * UPS *db_block_size+ 冗余量 UR: 表示在undo中保持的最長時間數(秒),由數據庫參數UNDO_RETENTION值決定。 UPS:表示在undo中,每秒產生的數據庫塊數量。和undo有關的動態性能視圖v$undostat 包含undo的統計信息。使用這張視圖可以估計系統當前所需的undo大小。 v$rollstat 是undo模式的視圖。是undo表空間的undo segments的統計信息 v$transaction 包含undo segments的信息。 dba_undo_extents 包含undo表空間中每一個范圍的提交時間。四. 管理回滾段 4.1 回滾段的使用方針 4.1.1 使用多個回滾段 使用多個回滾段來分擔回滾段的爭用,以提高系統性能。系統采用循環的方式來分配回滾段。當oracle創建數據庫時候,系統自動在system中分配一個system rollback segment,用來完成系統的事務,不為大家共用。所以系統最后能有至少一個回滾段存放用戶回滾信息。系統能夠加載的用戶回滾段數量和以下幾個初始化參數有關: transactions_per_rollback_segment 指定每一個回滾段支持的并發數; max_rollback_segments 指明系統支持的最大的online的回滾段數目; rollback_segments 指定實例啟動時所需要的回滾段;4.1.2 選擇好回滾段的類型 private 必須通過實例指定名稱后才能使用。 如:必須在初始化參數中rollback_segments指定后,實例啟動才能使用,或者在實例啟動后online才能使用。 Public 則是實例啟動時系統自動發現,系統根據初始化參數決定系統啟動時的回滾段。4.1.3 為事務指定回滾段 在系統啟動時指定所需要的回滾段,4.1.4 估計回滾段的大小 回滾段大小應該基于系統最大的事務。如果回滾段過小,容易產生ora-01555錯誤。可以使用optimize選項來限制回滾段自動回收。回滾段的大小應該是最大表的大小的10%,這個可以指定maxextents的數量。4.1.5 創建范圍大小和數量相等的回滾段組 一般來說一個回滾段應該包含10到20個范圍。 s=T/n s是初始化時定義的范圍的大小,T是初始化的回滾段大小,n是范圍數。由此可以確定定義回滾段的子句的各個參數。4.1.6 定義optimal的值 設置這個參數可以避免回滾段無限擴展以及系統自動回收空間。最小是兩個范圍的大小。 設置回滾段在不同的表空間 1:如果系統只有一個回滾表空間,那么回滾段出現問題,影響系統不能運行。 2:包含回滾段的表空間經常分配和去配容易產生碎片。 3:當回滾表空間被離線時,系統將沒有回滾表空間可以用。MINEXTENTS最小等于2 OPTIMAL最小應該設置成兩個extents大小 INITIAL和 NEXT最好一樣,除了應用使用指定的回滾段;4.2 回滾段的相關操作4.2.1 創建回滾段 當創建回滾段時,系統必須要有CREATE ROLLBACK SEGMENT系統權限。創建的回滾段會online,并指定了存儲參數; CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1STORAGE ( INITIAL integer K|M NEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );4.2.2 修改回滾段 修改回滾段當修改回滾段時,系統必須要有ALTER ROLLBACK SEGMENT系統權限。使回滾段online或者offline; ALTER ROLLBACK SEGMENT RB01 ONLINE;修改存儲參數; ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );收縮回滾段; ALTER ROLLBACK SEGMENT RB01 SHRINK; 注意:有OPTIMAL參數時, 縮小到OPTIMAL值; 沒有OPTIMAL參數時, 縮小到MINEXTENTS所對應的尺寸 ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K; ALTER ROLLBACK SEGMENT RB01 STAROGE(MAXEXTENTS 120);4.2.3 刪除回滾段 當刪除回滾段時,系統必須要有DROP ROLLBACK SEGMENT系統權限。 原則上,INITIAL總應該等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由于INITIAL不能直接修改,只能先drop然后創建。DROP ROLLBACK SEGMENT RB01; CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1 STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);在事務中使用特定的回滾段 SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;通過這個命令,可以: 根據事務量的大小,決定使用哪一個回滾段; 將大的查詢的事務放入單獨的回滾段; 當存在大的查詢使用事務時,可以將它放入大的回滾段。4.3 和回滾段相關的性能視圖 DBA_ROLLBACK_GEGS 描述回滾段的信息,包含回滾段的名字和表空間; DBA_SEGMENTS 描述回滾段的附加信息; V$ROLLNAME 列出在線回滾段的名稱 V$ROLLSTAT 包含回滾段的統計信息 V$TRANSACTION 包含撤銷的統計信息
二、理解和實驗
ORACLE的UNDO實驗如下,依舊參照網絡文檔:http://blog.csdn.net/tianlesoftware/article/details/5689558
Oracle 的Undo有兩種方式: 一是使用undo 表空間,二是使用回滾段. 我們通過 undo_management 參數來控制使用哪種方式,如果設為auto,就使用UNDO 表空間,這時必須要指定一個UNDO 表空間。 如果設為manual,系統啟動后使用rollback segment方式存儲undo信息。如果系統沒有指定undo_management,那么系統默認以manual方式啟動,即使設置了auto方式的參數,這些參數將被忽略。 當實例啟動的時候,系統自動選擇第一個有效的undo表空間或者是rollback segment,如果沒有有效的可用的undo表空間或者是回滾段,系統使用system rollback segment。這種情況是不被推薦的,當系統運行在沒有undo的情況下,系統會在alert.log中記錄一條警告信息。 SQL> show parameter undo NAME TYPE VALUE ------------------------------------ ----------- ------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1 參考:Oracle undo 管理 http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4901666.aspx 一. UNDO 表空間 下面來看一下undo 的表空間管理。先來查看一下表空間的使用情況: /* Formatted on 2010/6/23 9:46:58 (QP5 v5.115.810.9015) */ SELECT a.tablespace_name,ROUND (a.total_size) "total_size(MB)",ROUND (a.total_size) - ROUND (b.free_size, 3) "used_size(MB)",ROUND (b.free_size, 3) "free_size(MB)",ROUND (b.free_size / total_size * 100, 2) || '%' free_rateFROM ( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 total_sizeFROM dba_data_filesGROUP BY tablespace_name) a,( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 free_sizeFROM dba_free_spaceGROUP BY tablespace_name) bWHERE a.tablespace_name = b.tablespace_name(+); TABLESPACE_NAME total_size(MB) used_size(MB) free_size(MB) FREE_RATE -------------------- -------------- ------------- ------------- -------------- SYSAUX 580 545.187 34.813 6% UNDOTBS1 90 23.875 66.125 73.47% DAVE 20 6.25 13.75 68.75% USERS 10 8.375 1.625 16.25% SYSTEM 960 951.062 8.938 93% 從結果我們看到UNDO 表空間已經用了23.875M。 我們看一下這使用的23M空間里空閑和非空閑比例: /* Formatted on 2010/6/23 9:49:53 (QP5 v5.115.810.9015) */SELECT tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)"FROM dba_undo_extents GROUP BY tablespace_name, status; TABLESPACE_NAME STATUS Bytes(M) -------------------- --------- ---------- UNDOTBS1 UNEXPIRED 9.1875 UNDOTBS1 EXPIRED 13.6875 我們看一下查詢的結果,UNEXPIRED 和EXPIRED 是已使用的undo 表空間,其中expired 說明是已經過期的數據,也就是15分鐘(默認情況)以外的數據,以被覆蓋,可以認為是空閑的。 在此補充一點知識: 采用UNDO 表空間時,會有一個參數UNDO_RETENTION,該參數用來指定undo 記錄保存的最長時間,以秒為單位,是個動態參數,完全可以在實例運行時隨時修改,通常默認是900 秒,也就是15 分鐘。 undo_retention 只是指定undo 數據的過期時間,并不是說,undo 中的數據一定會在undo表空間中保存15 分鐘,比如說剛一個新事務開始的時候,如果undo 表空間已經被寫滿,則新事務的數據會自動覆蓋已提交事務的數據,而不管這些數據是否已過期,因此呢,這就又關聯回了第一點,當你創建一個自動管理的undo 表空間時,還要注意其空間大小,要盡可能保證undo 表空間有足夠的存儲空間。 undo_retention 中指定的時間一過,已經提交事務中的數據就立刻無法訪問,它只是失效,只要不被別的事務覆蓋,它會仍然存在,并可隨時被flashback 特性引用。如果你的undo表空間足夠大,而數據庫又不是那么繁忙,那么其實undo_retention 參數的值并不會影響到你,哪怕你設置成1,只要沒有事務去覆蓋undo 數據,它就會持續有效。因此呢,這里還是那句話,要注意undo 表空間的大小,保證其有足夠的存儲空間。 只有在一種情況下,undo 表空間能夠確保undo 中的數據在undo_retention 指定時間過期前一定有效,就是為undo 表空間指定Retention Guarantee,指定之后,oracle 對于undo 表空間中未過期的undo 數據不會覆蓋,例如: SQL> Alter tablespace undotbs1 retention guarantee;禁止undo 表空間retention guarantee,例如: SQL> Alter tablespace undotbs1 retention noguarantee; 總結一下: UNDO 表空間是會被重用的,只有當事務沒結束,或開了retention guarantee,或在undo_retention時間內不能被重用。 在undo_retention規定的時間內,數據都是有效的,過期后都會設為無效,狀態被改為Expired,這些回滾段將會被看作Free Space。但是只要數據沒有被覆蓋就可以使用。如果空間已滿,新事務的數據會自動覆蓋掉已經提交的事務數據,即使在undo_retention的時間內。除非指定Retention Guarantee模式,才能保證在undo_retention內不被覆蓋。 二. UNDO 表空間滿了的處理方法 2.1 先模擬UNDO 表空間滿的情況SQL> alter system set undo_retention=10800; -- 3個小時 系統已更改。 SQL> create undo tablespace undo datafile 'F:/backup/undo.dbf' size 1m ; 表空間已創建。 SQL> alter tablespace undo retention guarantee; 表空間已更改。 SQL> alter system set undo_tablespace=undo; 系統已更改。 SQL> create table DBA(id number); 表已創建。 SQL> begin2 for i in 1 .. 100000 loop3 insert into dba values(i);4 commit;5 end loop;6 end;7 / begin * 第 1 行出現錯誤: ORA-30036: 無法按 8 擴展段 (在還原表空間 'UNDO' 中) ORA-06512: 在 line 3 2.2 處理方法 處理方法有兩種,一是添加undo 表空間的數據文件,二是切換UNDO tablespace. 這種情況下多用在undo 表空間已經非常大的情況。 2.2.1 增加數據文件 SQL> ALTER TABLESPACE undo ADD DATAFILE 'F:/backup/undo02.dbf' size 100M reuse; 表空間已更改。 SQL> begin2 for i in 1..100000 loop3 insert into dba values(1);4 commit;5 end loop;6 end;7 / PL/SQL 過程已成功完成。 2.2.2 切換UNDO 表空間 1、建立新的表空間UNDOTBS2 SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 'F:/backup/undo03.dbf' size 100M reuse; 表空間已創建。 2、切換到新建的UNOD表空間上來,操作如下 SQL> alter system set undo_tablespace=UNDOTBS2 scope=both; 系統已更改。 3、將原來的UNDO表空間,置為脫機: SQL> alter tablespace UNDO offline; 表空間已更改。 4、刪除原來的UNDO表空間: SQL> drop tablespace UNDO including contents AND DATAFILES CASCADE CONSTRAINTS ; 表空間已刪除。 如果只是drop tablespace UNDO ,則只會在刪除控制文件里的記錄,并不會物理刪除文件。 Drop undo表空間的時候必須是在未使用的情況下才能進行。如果undo表空間正在使用(例如事務失敗,但是還沒有恢復成功),那么drop表空間命令將失敗。在drop表空間的時候可以使用including contents。三. UNDO 表空間損壞的恢復方法 一般Undo 表空間損壞的情況下,數據庫都已不能正常打開了。啟動時都會報類似如下的錯誤: ORA-01157: cannot identify/lock data file 12 - see DBWR trace file ORA-01110: data file 12: '/d01/oramtest/proddata/undo01.dbf'要想解決問題,必須重建UNDO 表空間,但是如果不open, 就不能重建創建undo 表空間。 所以可以先用系統默認的undo 表空間:system rollback segment 來啟動數據庫,再創建UNDO 表空間。 3.1 創建pfile 文件 SQL> create pfile='F:/initorcl.ora' from spfile; 文件已創建。 3.2 修改pfile文件 #*.undo_tablespace='UNDOTBS1' #*.undo_management='AUTO' undo_management='MANUAL' rollback_segments='SYSTEM' 3.3 啟動數據庫至Mount 狀態 SQL> STARTUP MOUNT pfile='F:/initorcl.ora' ; 3.4 offline drop undo 表空間SQL> ALTER DATABASE DATAFILE 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' OFFLINE DROP; 3.5 open 數據庫 SQL> ALTER DATABASE OPEN; 3.6 刪除舊的undo 表空間 SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS; 注:該命令不會刪除物理文件。 要想一起刪除物理文件需要 AND DATAFILES CASCADE CONSTRAINTS ; 如: drop tablespace UNDOTBS1 including contents AND DATAFILES CASCADE CONSTRAINTS ; 3.7 創建新的UNDO 表空間 SQL> create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M ; create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M * 第 1 行出現錯誤: ORA-01119: 創建數據庫文件 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF'時出錯 ORA-27038: 所創建的文件已存在 OSD-04010: 指定了 <create> 選項, 但文件已經存在 因為我們之前刪除時并沒有刪除物理文件,所以在建同名文件時就會報錯。 我們可以加上REUSE 參數。 只要文件不在使用,就可以重寫已經存在的文件。 SQL> create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M reuse; 表空間已創建。 3.8 shutdown 數據庫 并將pfile 改回 SQL> select name,issys_modifiable from v$parameter where name='undo_management' or name='rollback_segments'; NAME ISSYS_MOD -------------------- --------- rollback_segments FALSE undo_management FALSE 從上面查詢的結果,可以知道修改這2個參數必須重啟數據,所以還是shutdown 吧。 SQL> shutdown immediate 3.9 修改pfile 參數 *.undo_tablespace='UNDOTBS1' *.undo_management='AUTO' #undo_management='MANUAL' #rollback_segments='SYSTEM' 3.10 用剛才修改的pfile 啟動數據庫,并創建spfile SQL> startup pfile='F:/initorcl.ora' ; SQL> create spfile from pfile='F:/initorcl.ora'; 3.10 再次shutdown,用spfile 啟動. SQL> shutdown immediate SQL> startup一般數據文件損壞的情況也可以采用類似的方法, 先啟動到mount, 在將損壞的數據文件offline drop。 在open 數據庫,drop 掉損壞的數據文件。 當然這種做法有數據丟失。 能恢復的話,盡量恢復。補充查詢數據庫的undo表空間和文件名不一致,用dba_tablespace表可以看到刪除/添加的操作過程。
三、參考
參考文檔:
1、http://blog.csdn.net/tianlesoftware/article/details/5689558
2、http://blog.csdn.net/tianlesoftware/article/details/4901666
四、小結
?UNDO是ORACLE里的一個關鍵配置之一,非常值得學習與研究!
?
posted on 2013-07-08 21:50?Alexy Young 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/alexy/p/createdb7.html
總結
以上是生活随笔為你收集整理的手动创建数据库实例全攻略7:UNDO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: moment 时间格式化
- 下一篇: 用API获得Internet Explo