日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

手动创建数据库实例全攻略7:UNDO

發(fā)布時間:2024/7/5 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手动创建数据库实例全攻略7:UNDO 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
手動創(chuàng)建數(shù)據(jù)庫實例全攻略7:UNDO

一、偷來的常識

網(wǎng)絡(luò)上這個哥們寫的太精彩了,直接復(fù)制閱讀之!

文字來源:http://blog.csdn.net/tianlesoftware/article/details/4901666
在開始之前,我們先來思考幾個問題?
1. ora-01555錯誤的是怎么產(chǎn)生的?有什么辦法解決?該問題,參考我的Blog: Oracle ORA-01555快照過舊http://blog.csdn.net/tianlesoftware/archive/2009/10/31/4745898.aspx 2. 回滾段(回滾表空間)有什么作用? 3. 數(shù)據(jù)庫啟動的時候,如何加載回滾段(回滾段表空間)。 4. 回滾段的數(shù)量由什么公式來計算 5. 回滾表空間的大小如何確定?一. 什么是undo Oracle數(shù)據(jù)庫在回退、撤銷或者改變數(shù)據(jù)所需要的維護數(shù)據(jù)庫信息的一種手段。這里的數(shù)據(jù)庫信息是指在數(shù)據(jù)庫提交之前的記錄的改變等事務(wù)信息。Undo 信息主要有以下用途: 當系統(tǒng)發(fā)出rollback信息 數(shù)據(jù)庫恢復(fù) 提供讀一致性當系統(tǒng)發(fā)出rollback命令時,undo 信息通過記錄的信息將數(shù)據(jù)庫的改變恢復(fù)到commit之前的狀態(tài)。在數(shù)據(jù)庫恢復(fù)期間,undo信息被用來從redo log中撤銷任何未提交到數(shù)據(jù)文件的事務(wù)。當一個用戶在訪問數(shù)據(jù)時,Undo記錄通過維護訪問數(shù)據(jù)的前鏡像數(shù)據(jù)來保證當有其他用戶改變相同數(shù)據(jù)時數(shù)據(jù)庫的讀一致性。以前數(shù)據(jù)庫使用回滾段來存儲undo信息,這種回滾段管理方式非常的復(fù)雜。現(xiàn)在數(shù)據(jù)庫采用undo的方式降低了管理的復(fù)雜性,同時減少了dba的工作負荷。但是在數(shù)據(jù)庫只能使用這兩種方式的一種??梢栽跀?shù)據(jù)庫里定義兩種方式的文件,但是,同一時刻,必須指定數(shù)據(jù)使用哪一種方式。當你需要在兩種方式中切換時,必須將系統(tǒng)重新啟動。Oracle數(shù)據(jù)庫一直使用系統(tǒng)回滾段來完成系統(tǒng)的事務(wù)。系統(tǒng)回滾段是在數(shù)據(jù)庫,創(chuàng)建的時候產(chǎn)生的,系統(tǒng)啟動后就一直在線。Dba不需要對它作任何的操作來優(yōu)化。二. 指定Undo的方式 oracle 9i以后有個初始化參數(shù):undo_management。當將undo_management設(shè)置成AUTO時系統(tǒng)使用重做表空間來管理回滾段,當它被設(shè)置成MENUAL時系統(tǒng)使用回滾段。 oracle推薦使用重做表空間代替回滾段。當系統(tǒng)使用auto方式管理undo信息時,系統(tǒng)必須指定一個undo表空間。這個表空間可以是在數(shù)據(jù)庫創(chuàng)建時產(chǎn)生,也可以數(shù)據(jù)庫創(chuàng)建后再創(chuàng)建。當實例啟動的時候,系統(tǒng)自動選擇第一個有效的undo表空間或者是rollback segment,如果沒有有效的可用的undo表空間或者是回滾段,系統(tǒng)使用system rollback segment。這種情況是不被推薦的,當系統(tǒng)運行在沒有undo的情況下,系統(tǒng)會在alert.log中記錄一條警告信息。2.1 自動管理模式(Automatic Undo Management)如果系統(tǒng)使用要使用auto方式管理undo信息,那么需要通過指定初始化參數(shù)undo_tablespace的值來指定系統(tǒng)使用哪一個undo表空間來存放undo信息。如果指定了undo_tablespace的值,但是系統(tǒng)中不存在這樣的表空間,那些系統(tǒng)啟動將會失敗。此時可以做的操作是,如果系統(tǒng)存在undo表空間,為undo_tablespace指定正確的undo表空間名字,或者將undo_tablespace注釋。系統(tǒng)會采用存在的undo表空間。否則使用手動方式。相關(guān)的初始化參數(shù): undo_tablespace 指名系統(tǒng)使用哪一個重做表空間。 undo_suppress_errors 被設(shè)置成true時表示系統(tǒng)創(chuàng)建和使用回滾段時忽略錯誤。 undo_retention 系統(tǒng)提交后,回滾段的數(shù)據(jù)保留多長時間,單位是秒。 當系統(tǒng)被設(shè)置成menual后,這幾個參數(shù)被忽略。SQL> show parameter undo NAME TYPE VALUE ------------------------------------ - ---------- --------------- undo_management string AUTO undo_retention integer 1000 undo_tablespace string UNDOTBS1補充:初始化參數(shù)UNDO_RETENTION 該參數(shù)用來指定undo 記錄保存的最長時間,以秒為單位,是個動態(tài)參數(shù),完全可以在實例運行時隨時修改通常默認是900 秒,也就是15 分鐘。 一定要注意,undo_retention 只是指定undo 數(shù)據(jù)的過期時間,并不是說,undo 中的數(shù)據(jù)一定會在undo表空間中保存15 分鐘,比如說剛一個新事務(wù)開始的時候,如果undo 表空間已經(jīng)被寫滿,則新事務(wù)的數(shù)據(jù)會自動覆蓋已提交事務(wù)的數(shù)據(jù),而不管這些數(shù)據(jù)是否已過期,因此呢,這就又關(guān)聯(lián)回了第一點,當你創(chuàng)建 一個自動管理的undo 表空間時,還要注意其空間大小,要盡可能保證undo 表空間有足夠的存儲空間。 同時還要注意,也并不是說,undo_retention 中指定的時間一過,已經(jīng)提交事務(wù)中的數(shù)據(jù)就立刻無法訪問,它只是失效,只要不被別的事務(wù)覆蓋,它會仍然存在,并可隨時被flashback 特性引用。如果你的undo表空間足夠大,而數(shù)據(jù)庫又不是那么繁忙,那么其實undo_retention 參數(shù)的值并不會影響到你,哪怕你設(shè)置成1,只要沒有事務(wù)去覆蓋undo 數(shù)據(jù),它就會持續(xù)有效。因此呢,這里還是那句話,要注意undo 表空間的大小,保證其有足夠的存儲空間。只有在一種情況下,undo 表空間能夠確保undo 中的數(shù)據(jù)在undo_retention 指定時間過期前一定有效,就是為undo 表空間指定Retention Guarantee,指定之后,oracle 對于undo 表空間中未過期的undo 數(shù)據(jù)不會覆蓋, 例如: SQL> Alter tablespace undotbs1 retention guarantee;如果想禁止undo 表空間retention guarantee, 例如: SQL> Alter tablespace undotbs1 retention noguarantee;2.2 manual管理模式 當將系統(tǒng)中初始化參數(shù)undo_management設(shè)置成manual后,系統(tǒng)啟動后使用rollback segment方式存儲undo信息。如果系統(tǒng)沒有指定undo_management,那么系統(tǒng)默認以manual方式啟動,即使設(shè)置了auto方式的參數(shù),這些參數(shù)將被忽略。當實例啟動時,系統(tǒng)根據(jù)如下幾個步驟確認online的rollback segment的數(shù)量: 初始化參數(shù)rollback_segments 初始化參數(shù)transactions、transactions_per_rollback_segment 與menual相關(guān)的初始化參數(shù) rollback_segments 指定實例啟動時所需要的回滾段 transactions 指定系統(tǒng)中最大的并發(fā)事務(wù)數(shù) transactions_per_rollback_segment 指定每一個回滾段支持的并發(fā)數(shù) max_rollback_segments 指明系統(tǒng)支持的最大的online的回滾段數(shù)目三 . 管理undo tablespace創(chuàng)建undo talespace有兩種方式: 1. 數(shù)據(jù)庫創(chuàng)建時創(chuàng)建undo tablespace; 2. 在一個已經(jīng)存在的數(shù)據(jù)庫創(chuàng)建。 在undo tablespace中不能創(chuàng)建數(shù)據(jù)庫對象,這是因為這個表空間是為數(shù)據(jù)庫recover而準備的。3.1 創(chuàng)建數(shù)據(jù)庫時創(chuàng)建undo tablespace 在創(chuàng)建數(shù)據(jù)庫的時候可以通過指定undo子句來創(chuàng)建undo tablespace,但是這個子句不是必須的。 如果在創(chuàng)建數(shù)據(jù)庫時,系統(tǒng)指定是auto模式,但是沒有指明undo tablespace的名字,那么系統(tǒng)會創(chuàng)建一個默認的回滾表空間,名稱叫sys_undotbs。這個表空間根據(jù)oracle定義的缺省值創(chuàng)建。初始化大小是10m,可以自動擴展。不過oracle推薦最好還是使用一個指定的大小。CREATE DATABASE rbdb1 CONTROLFILE REUSE ... UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';注意:如果此時系統(tǒng)創(chuàng)建undo失敗,那么整個創(chuàng)建數(shù)據(jù)庫的命令就失敗了。此時 Dba需要刪除已經(jīng)創(chuàng)建的數(shù)據(jù)文件,糾正錯誤,重建創(chuàng)建數(shù)據(jù)庫。使用create undo tablespace子句創(chuàng)建 CREATE UNDO TABLESPACE undotbs_02 DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;3.2 Undo tablespace的相關(guān)操作1. 增加數(shù)據(jù)文件 ALTER TABLESPACE undotbs_01 ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;2. 重命名數(shù)據(jù)文件 ALTER TABLESPACE undotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf';3. 使數(shù)據(jù)文件online或者offline ALTER TABLESPACE undotbs_01 online|offline;4. 開始或者結(jié)束一個聯(lián)機備份 ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;5. 刪除undo tablespace Drop tablespace undotbs_01; Drop undo表空間的時候必須是在未使用的情況下才能進行。如果undo表空間正在使用(例如事務(wù)失敗,但是還沒有恢復(fù)成功),那么drop表空間命令將失敗。在drop表空間的時候可以使用including contents。6. 切換undo tablespace 切換undo表空間有兩種方式: 1. 使用命令動態(tài)修改; 2. 修改初始化參數(shù)后重新啟動數(shù)據(jù)庫。Alter system set undo_tablespace=undotbs1; 當切換命令完成后,所有的事務(wù)就會在新的回滾表空間內(nèi)進行。以下幾種情況會導(dǎo)致切換命令失敗: 1. 表空間不存在; 2.. 表空間不是一個回滾段表空間; 3. 表空間已經(jīng)被另一個實例使用。注意:切換的操作不等待舊undo表空間的事務(wù)提交。如果舊undo表空間有事務(wù)未提交,那么舊的undo表空間進入pending offline狀態(tài),在這種模式下所有的事務(wù)能夠繼續(xù)進行,但是undo表空間不能被其他實例使用,也不能被刪除,直到所有的事務(wù)提交后, undo表空間才進入offline模式。7. 設(shè)置undo_retention dba可以設(shè)置undo_retention初始化參數(shù)指定undo回滾表空間保留undo信息的時間。在設(shè)置好這個參數(shù)時,系統(tǒng)會保留undo信息在指定的時間斷后才收回這個空間。 一般情況下,系統(tǒng)會保留undo信息到指定的時間后才回收空間,但是,如果系統(tǒng) 存在大量的事務(wù),也會將未到期的undo空間回收,以供使用。8. Undo 表空間大小的設(shè)計規(guī)范的計算公式 Undospace = UR * UPS *db_block_size+ 冗余量 UR: 表示在undo中保持的最長時間數(shù)(秒),由數(shù)據(jù)庫參數(shù)UNDO_RETENTION值決定。 UPS:表示在undo中,每秒產(chǎn)生的數(shù)據(jù)庫塊數(shù)量。和undo有關(guān)的動態(tài)性能視圖v$undostat 包含undo的統(tǒng)計信息。使用這張視圖可以估計系統(tǒng)當前所需的undo大小。 v$rollstat 是undo模式的視圖。是undo表空間的undo segments的統(tǒng)計信息 v$transaction 包含undo segments的信息。 dba_undo_extents 包含undo表空間中每一個范圍的提交時間。四. 管理回滾段 4.1 回滾段的使用方針 4.1.1 使用多個回滾段 使用多個回滾段來分擔回滾段的爭用,以提高系統(tǒng)性能。系統(tǒng)采用循環(huán)的方式來分配回滾段。當oracle創(chuàng)建數(shù)據(jù)庫時候,系統(tǒng)自動在system中分配一個system rollback segment,用來完成系統(tǒng)的事務(wù),不為大家共用。所以系統(tǒng)最后能有至少一個回滾段存放用戶回滾信息。系統(tǒng)能夠加載的用戶回滾段數(shù)量和以下幾個初始化參數(shù)有關(guān): transactions_per_rollback_segment 指定每一個回滾段支持的并發(fā)數(shù); max_rollback_segments 指明系統(tǒng)支持的最大的online的回滾段數(shù)目; rollback_segments 指定實例啟動時所需要的回滾段;4.1.2 選擇好回滾段的類型 private 必須通過實例指定名稱后才能使用。 如:必須在初始化參數(shù)中rollback_segments指定后,實例啟動才能使用,或者在實例啟動后online才能使用。 Public 則是實例啟動時系統(tǒng)自動發(fā)現(xiàn),系統(tǒng)根據(jù)初始化參數(shù)決定系統(tǒng)啟動時的回滾段。4.1.3 為事務(wù)指定回滾段 在系統(tǒng)啟動時指定所需要的回滾段,4.1.4 估計回滾段的大小 回滾段大小應(yīng)該基于系統(tǒng)最大的事務(wù)。如果回滾段過小,容易產(chǎn)生ora-01555錯誤。可以使用optimize選項來限制回滾段自動回收。回滾段的大小應(yīng)該是最大表的大小的10%,這個可以指定maxextents的數(shù)量。4.1.5 創(chuàng)建范圍大小和數(shù)量相等的回滾段組 一般來說一個回滾段應(yīng)該包含10到20個范圍。 s=T/n s是初始化時定義的范圍的大小,T是初始化的回滾段大小,n是范圍數(shù)。由此可以確定定義回滾段的子句的各個參數(shù)。4.1.6 定義optimal的值 設(shè)置這個參數(shù)可以避免回滾段無限擴展以及系統(tǒng)自動回收空間。最小是兩個范圍的大小。 設(shè)置回滾段在不同的表空間 1:如果系統(tǒng)只有一個回滾表空間,那么回滾段出現(xiàn)問題,影響系統(tǒng)不能運行。 2:包含回滾段的表空間經(jīng)常分配和去配容易產(chǎn)生碎片。 3:當回滾表空間被離線時,系統(tǒng)將沒有回滾表空間可以用。MINEXTENTS最小等于2 OPTIMAL最小應(yīng)該設(shè)置成兩個extents大小 INITIAL和 NEXT最好一樣,除了應(yīng)用使用指定的回滾段;4.2 回滾段的相關(guān)操作4.2.1 創(chuàng)建回滾段 當創(chuàng)建回滾段時,系統(tǒng)必須要有CREATE ROLLBACK SEGMENT系統(tǒng)權(quán)限。創(chuàng)建的回滾段會online,并指定了存儲參數(shù); 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 修改回滾段 修改回滾段當修改回滾段時,系統(tǒng)必須要有ALTER ROLLBACK SEGMENT系統(tǒng)權(quán)限。使回滾段online或者offline; ALTER ROLLBACK SEGMENT RB01 ONLINE;修改存儲參數(shù); ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );收縮回滾段; ALTER ROLLBACK SEGMENT RB01 SHRINK; 注意:有OPTIMAL參數(shù)時, 縮小到OPTIMAL值; 沒有OPTIMAL參數(shù)時, 縮小到MINEXTENTS所對應(yīng)的尺寸 ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K; ALTER ROLLBACK SEGMENT RB01 STAROGE(MAXEXTENTS 120);4.2.3 刪除回滾段 當刪除回滾段時,系統(tǒng)必須要有DROP ROLLBACK SEGMENT系統(tǒng)權(quán)限。 原則上,INITIAL總應(yīng)該等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由于INITIAL不能直接修改,只能先drop然后創(chuàng)建。DROP ROLLBACK SEGMENT RB01; CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1 STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);在事務(wù)中使用特定的回滾段 SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;通過這個命令,可以: 根據(jù)事務(wù)量的大小,決定使用哪一個回滾段; 將大的查詢的事務(wù)放入單獨的回滾段; 當存在大的查詢使用事務(wù)時,可以將它放入大的回滾段。4.3 和回滾段相關(guān)的性能視圖 DBA_ROLLBACK_GEGS 描述回滾段的信息,包含回滾段的名字和表空間; DBA_SEGMENTS 描述回滾段的附加信息; V$ROLLNAME 列出在線回滾段的名稱 V$ROLLSTAT 包含回滾段的統(tǒng)計信息 V$TRANSACTION 包含撤銷的統(tǒng)計信息

二、理解和實驗

ORACLE的UNDO實驗如下,依舊參照網(wǎng)絡(luò)文檔:http://blog.csdn.net/tianlesoftware/article/details/5689558

Oracle 的Undo有兩種方式: 一是使用undo 表空間,二是使用回滾段. 我們通過 undo_management 參數(shù)來控制使用哪種方式,如果設(shè)為auto,就使用UNDO 表空間,這時必須要指定一個UNDO 表空間。 如果設(shè)為manual,系統(tǒng)啟動后使用rollback segment方式存儲undo信息。如果系統(tǒng)沒有指定undo_management,那么系統(tǒng)默認以manual方式啟動,即使設(shè)置了auto方式的參數(shù),這些參數(shù)將被忽略。 當實例啟動的時候,系統(tǒng)自動選擇第一個有效的undo表空間或者是rollback segment,如果沒有有效的可用的undo表空間或者是回滾段,系統(tǒng)使用system rollback segment。這種情況是不被推薦的,當系統(tǒng)運行在沒有undo的情況下,系統(tǒng)會在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% 從結(jié)果我們看到UNDO 表空間已經(jīng)用了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 我們看一下查詢的結(jié)果,UNEXPIRED 和EXPIRED 是已使用的undo 表空間,其中expired 說明是已經(jīng)過期的數(shù)據(jù),也就是15分鐘(默認情況)以外的數(shù)據(jù),以被覆蓋,可以認為是空閑的。 在此補充一點知識: 采用UNDO 表空間時,會有一個參數(shù)UNDO_RETENTION,該參數(shù)用來指定undo 記錄保存的最長時間,以秒為單位,是個動態(tài)參數(shù),完全可以在實例運行時隨時修改,通常默認是900 秒,也就是15 分鐘。 undo_retention 只是指定undo 數(shù)據(jù)的過期時間,并不是說,undo 中的數(shù)據(jù)一定會在undo表空間中保存15 分鐘,比如說剛一個新事務(wù)開始的時候,如果undo 表空間已經(jīng)被寫滿,則新事務(wù)的數(shù)據(jù)會自動覆蓋已提交事務(wù)的數(shù)據(jù),而不管這些數(shù)據(jù)是否已過期,因此呢,這就又關(guān)聯(lián)回了第一點,當你創(chuàng)建一個自動管理的undo 表空間時,還要注意其空間大小,要盡可能保證undo 表空間有足夠的存儲空間。 undo_retention 中指定的時間一過,已經(jīng)提交事務(wù)中的數(shù)據(jù)就立刻無法訪問,它只是失效,只要不被別的事務(wù)覆蓋,它會仍然存在,并可隨時被flashback 特性引用。如果你的undo表空間足夠大,而數(shù)據(jù)庫又不是那么繁忙,那么其實undo_retention 參數(shù)的值并不會影響到你,哪怕你設(shè)置成1,只要沒有事務(wù)去覆蓋undo 數(shù)據(jù),它就會持續(xù)有效。因此呢,這里還是那句話,要注意undo 表空間的大小,保證其有足夠的存儲空間。 只有在一種情況下,undo 表空間能夠確保undo 中的數(shù)據(jù)在undo_retention 指定時間過期前一定有效,就是為undo 表空間指定Retention Guarantee,指定之后,oracle 對于undo 表空間中未過期的undo 數(shù)據(jù)不會覆蓋,例如: SQL> Alter tablespace undotbs1 retention guarantee;禁止undo 表空間retention guarantee,例如: SQL> Alter tablespace undotbs1 retention noguarantee; 總結(jié)一下: UNDO 表空間是會被重用的,只有當事務(wù)沒結(jié)束,或開了retention guarantee,或在undo_retention時間內(nèi)不能被重用。 在undo_retention規(guī)定的時間內(nèi),數(shù)據(jù)都是有效的,過期后都會設(shè)為無效,狀態(tài)被改為Expired,這些回滾段將會被看作Free Space。但是只要數(shù)據(jù)沒有被覆蓋就可以使用。如果空間已滿,新事務(wù)的數(shù)據(jù)會自動覆蓋掉已經(jīng)提交的事務(wù)數(shù)據(jù),即使在undo_retention的時間內(nèi)。除非指定Retention Guarantee模式,才能保證在undo_retention內(nèi)不被覆蓋。 二. UNDO 表空間滿了的處理方法 2.1 先模擬UNDO 表空間滿的情況SQL> alter system set undo_retention=10800; -- 3個小時 系統(tǒng)已更改。 SQL> create undo tablespace undo datafile 'F:/backup/undo.dbf' size 1m ; 表空間已創(chuàng)建。 SQL> alter tablespace undo retention guarantee; 表空間已更改。 SQL> alter system set undo_tablespace=undo; 系統(tǒng)已更改。 SQL> create table DBA(id number); 表已創(chuàng)建。 SQL> begin2 for i in 1 .. 100000 loop3 insert into dba values(i);4 commit;5 end loop;6 end;7 / begin *1 行出現(xiàn)錯誤: ORA-30036: 無法按 8 擴展段 (在還原表空間 'UNDO' 中) ORA-06512: 在 line 3 2.2 處理方法 處理方法有兩種,一是添加undo 表空間的數(shù)據(jù)文件,二是切換UNDO tablespace. 這種情況下多用在undo 表空間已經(jīng)非常大的情況。 2.2.1 增加數(shù)據(jù)文件 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; 表空間已創(chuàng)建。 2、切換到新建的UNOD表空間上來,操作如下 SQL> alter system set undo_tablespace=UNDOTBS2 scope=both; 系統(tǒng)已更改。 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表空間正在使用(例如事務(wù)失敗,但是還沒有恢復(fù)成功),那么drop表空間命令將失敗。在drop表空間的時候可以使用including contents。三. UNDO 表空間損壞的恢復(fù)方法 一般Undo 表空間損壞的情況下,數(shù)據(jù)庫都已不能正常打開了。啟動時都會報類似如下的錯誤: ORA-01157: cannot identify/lock data file 12 - see DBWR trace file ORA-01110: data file 12: '/d01/oramtest/proddata/undo01.dbf'要想解決問題,必須重建UNDO 表空間,但是如果不open, 就不能重建創(chuàng)建undo 表空間。 所以可以先用系統(tǒng)默認的undo 表空間:system rollback segment 來啟動數(shù)據(jù)庫,再創(chuàng)建UNDO 表空間。 3.1 創(chuàng)建pfile 文件 SQL> create pfile='F:/initorcl.ora' from spfile; 文件已創(chuàng)建。 3.2 修改pfile文件 #*.undo_tablespace='UNDOTBS1' #*.undo_management='AUTO' undo_management='MANUAL' rollback_segments='SYSTEM' 3.3 啟動數(shù)據(jù)庫至Mount 狀態(tài) 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 數(shù)據(jù)庫 SQL> ALTER DATABASE OPEN; 3.6 刪除舊的undo 表空間 SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS; 注:該命令不會刪除物理文件?!∫胍黄饎h除物理文件需要 AND DATAFILES CASCADE CONSTRAINTS ; 如:  drop tablespace UNDOTBS1 including contents AND DATAFILES CASCADE CONSTRAINTS ; 3.7 創(chuàng)建新的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 行出現(xiàn)錯誤: ORA-01119: 創(chuàng)建數(shù)據(jù)庫文件 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF'時出錯 ORA-27038: 所創(chuàng)建的文件已存在 OSD-04010: 指定了 <create> 選項, 但文件已經(jīng)存在 因為我們之前刪除時并沒有刪除物理文件,所以在建同名文件時就會報錯。 我們可以加上REUSE 參數(shù)。 只要文件不在使用,就可以重寫已經(jīng)存在的文件。 SQL> create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M reuse; 表空間已創(chuàng)建。 3.8 shutdown 數(shù)據(jù)庫 并將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 從上面查詢的結(jié)果,可以知道修改這2個參數(shù)必須重啟數(shù)據(jù),所以還是shutdown 吧。 SQL> shutdown immediate 3.9 修改pfile 參數(shù) *.undo_tablespace='UNDOTBS1' *.undo_management='AUTO' #undo_management='MANUAL' #rollback_segments='SYSTEM' 3.10 用剛才修改的pfile 啟動數(shù)據(jù)庫,并創(chuàng)建spfile SQL> startup pfile='F:/initorcl.ora' ; SQL> create spfile from pfile='F:/initorcl.ora'; 3.10 再次shutdown,用spfile 啟動. SQL> shutdown immediate SQL> startup一般數(shù)據(jù)文件損壞的情況也可以采用類似的方法, 先啟動到mount, 在將損壞的數(shù)據(jù)文件offline drop。 在open 數(shù)據(jù)庫,drop 掉損壞的數(shù)據(jù)文件。 當然這種做法有數(shù)據(jù)丟失。 能恢復(fù)的話,盡量恢復(fù)。

補充查詢數(shù)據(jù)庫的undo表空間和文件名不一致,用dba_tablespace表可以看到刪除/添加的操作過程。

三、參考

參考文檔:

1、http://blog.csdn.net/tianlesoftware/article/details/5689558

2、http://blog.csdn.net/tianlesoftware/article/details/4901666

四、小結(jié)

?UNDO是ORACLE里的一個關(guān)鍵配置之一,非常值得學(xué)習(xí)與研究!

?

posted on 2013-07-08 21:50?Alexy Young 閱讀(...) 評論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/alexy/p/createdb7.html

總結(jié)

以上是生活随笔為你收集整理的手动创建数据库实例全攻略7:UNDO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。