一、TableSpace的存儲(chǔ)參數(shù)
?
1、本地管理TableSpace的存儲(chǔ)參數(shù)
?
??? 需要注意:本地管理TableSpace不能指定默認(rèn)存儲(chǔ)參數(shù),也不能指定MINIMUM_EXTENT
?
??? AUTOALLOCATE使用最小盤(pán)區(qū)為64K的系統(tǒng)管理。
??? UNIFORM SIZE則為指定SIZE的統(tǒng)一大小盤(pán)區(qū),默認(rèn)值為1M
?
2、字典管理TableSpace的存儲(chǔ)參數(shù)
?
??? INITIAL????? 定義該段中第一個(gè)盤(pán)區(qū)以字節(jié)計(jì)(KorM)的大小
??? NEXT???????? 定義第二個(gè)盤(pán)區(qū)以字節(jié)計(jì)的大小(KorM)
??? PCTINCREASE? 指定第二個(gè)(NEXT)盤(pán)區(qū)以后的每個(gè)盤(pán)區(qū)增長(zhǎng)百分比
??? MINEXTENTS?? 指定在表空間中第一次創(chuàng)建一個(gè)段時(shí)所分配的盤(pán)區(qū)數(shù)
??? MAXEXTENTS?? 確定一個(gè)段可以擁有的最大盤(pán)區(qū)數(shù)(可以是UNLIMITED)
?
??? 修改語(yǔ)句如下:
??? ALTER TABLESPACE users
??? DEFAULT STORAGE (
??? NEXT 100K
??? MAXEXTENTS 20
??? PCTINCREASE 0);
?
??? 注1:不能在一條ALTER語(yǔ)句中同時(shí)指定INITIAL、MINEXTENTS的值
??? 注2:表空間默認(rèn)存儲(chǔ)參數(shù)修改之后只影響未來(lái)數(shù)據(jù),對(duì)已有不做變更
?
3、合并字典管理TableSpace的空閑空間
?
??? 當(dāng)Oracle的TableSpace中的段被取消時(shí),會(huì)重新將盤(pán)區(qū)標(biāo)記為空閑,但是任何相鄰的空閑盤(pán)區(qū)并不能重組為更大的空閑盤(pán)區(qū),這樣就形成了碎片,從而使得分配更大的空閑盤(pán)區(qū)更加困難。
?
??? 有一下幾種方法進(jìn)行合并:
?
??? 1. 當(dāng)為一個(gè)段分配新盤(pán)區(qū)時(shí)Oracle無(wú)法找到足夠大的空閑盤(pán)區(qū)時(shí),會(huì)自動(dòng)合并相鄰空閑盤(pán)區(qū)并再次查找;
??? 2. 表空間的PCTINCREASE值不為0時(shí),SMON后臺(tái)進(jìn)程定期合并相鄰空閑盤(pán)區(qū);
??? 3. 一個(gè)PCTINCREASE值不為0的段被取消或截?cái)鄷r(shí),會(huì)執(zhí)行限制形式的合并,即使包含該段的TableSpace的PCTINCREASE=0
??? 4. 使用ALTER TABLESPACE ... COALESCE語(yǔ)句手動(dòng)合并相鄰空閑盤(pán)區(qū)
?
??? 注:本地管理的TableSpace會(huì)由位圖自動(dòng)跟蹤相鄰空閑空間,因而不必考慮合并。
?
4、監(jiān)控空閑空間
?
??? SQL> select block_id,bytes,blocks
??? 2? from dba_free_space
??? 3? where tablespace_name = 'WXQ_TBS'
??? 4? order by block_id;
?
????? BLOCK_ID????? BYTES???? BLOCKS
??? ---------- ---------- ----------
???????????? 9????? 65536????????? 8
??????????? 17????? 65536????????? 8
??????????? 25????? 65536????????? 8
??????????? 33????? 65536????????? 8
??? 2? from dba_free_space
??? 3? where tablespace_name = 'WXQ_TBS'
??? 4? order by block_id;
?
????? BLOCK_ID????? BYTES???? BLOCKS
??? ---------- ---------- ----------
???????????? 9????? 65536????????? 8
??????????? 17????? 65536????????? 8
??????????? 25????? 65536????????? 8
??????????? 33????? 65536????????? 8
??? ....
?
??? 上面的查詢說(shuō)明最先幾個(gè)就是未合并的空閑空間
??? 在執(zhí)行 ALTER TABLESPACE wxq_tbs COALESCE; 后,再執(zhí)行以上查詢則
?
????? BLOCK_ID????? BYTES???? BLOCKS
??? ---------- ---------- ----------
???????????? 9????? 65536?????????32
??? ---------- ---------- ----------
???????????? 9????? 65536?????????32
??? ....
?
?
?
二、修改表空間可用性
?
1、表空間脫機(jī)
?
??? 使表空間脫機(jī)主要是用于以下幾種情況:
??? * 使數(shù)據(jù)庫(kù)一部分不可用,而同時(shí)允許正常訪問(wèn)數(shù)據(jù)庫(kù)的剩余部分
??? * 執(zhí)行一次脫機(jī)表空間的備份
??? * 更新、維護(hù)一個(gè)應(yīng)用時(shí),使得該應(yīng)用和它的表組不可用
?
??? ALTER 語(yǔ)句中的可選項(xiàng):
?
??? NORMAL(default):正常脫機(jī),若有寫(xiě)錯(cuò)誤的結(jié)果時(shí),該表空間中沒(méi)有數(shù)據(jù)文件可以被當(dāng)前脫機(jī)。Oracle會(huì)設(shè)置檢查點(diǎn);
??? TEMPORARY:暫時(shí)脫機(jī),即使表空間中有文件錯(cuò)誤狀態(tài)也依然脫機(jī),同時(shí)設(shè)置檢查點(diǎn)。聯(lián)機(jī)時(shí)無(wú)需介質(zhì)恢復(fù);
??? IMMEDIATE:立即脫機(jī),不設(shè)置檢查點(diǎn)。重新聯(lián)機(jī)時(shí)需要介質(zhì)恢復(fù)。NOARCHIVELOG模式中不可使用;
??? FOR RECOVER:使在恢復(fù)中的數(shù)據(jù)庫(kù)表空間為表空間point-in-time恢復(fù)設(shè)置為脫機(jī)
?
??? 注:最好使用NORMAL脫機(jī),這樣重新聯(lián)機(jī)時(shí)無(wú)需恢復(fù),即使RESETLOGS也無(wú)需恢復(fù)。無(wú)法正常脫機(jī)才使用TEMPORARY選項(xiàng)。
?
??? 在使表空間脫機(jī)前需要確認(rèn)以下幾點(diǎn):
?
??? * 表空間沒(méi)有活動(dòng)的回滾段,否則無(wú)法脫機(jī)
??? * 脫機(jī)前修改表空間的分配,因?yàn)槊摍C(jī)后無(wú)法訪問(wèn)其中的對(duì)象或排序區(qū)域
?
??? 舉例:
??? ALTER TABLESPACE users OFFLINE NORMAL;
?
2、表空間聯(lián)機(jī)
?
??? ALTER TABLESPACE users ONLINE;
?
??? 可以單獨(dú)改變TableSpace中的文件的聯(lián)機(jī)/脫機(jī)狀態(tài):
?
??? ALTER TABLESPACE?... DATAFILE?{ONLINE|OFFLINE};
??? ALTER TABLESPACE?... TEMPFILE?{ONLINE|OFFLINE}; --不用列出具體文件地址
?
??? 當(dāng)使用該命令時(shí),表空間本身的聯(lián)機(jī)狀態(tài)并沒(méi)有改變,只是改變了數(shù)據(jù)文件的狀態(tài)。
?
??? 也可以使用以下語(yǔ)句來(lái)改變數(shù)據(jù)文件的聯(lián)機(jī)狀態(tài),但是要輸入文件名:
?
??? ALTER DATABASE DATAFILE?... {ONLINE|OFFLINE};
??? ALTER DATABASE TEMPFILE?... {ONLINE|OFFLINE};
?
?
?
三、使用只讀表空間
?
??? 只讀表空間的作用:
?
??? * 消除執(zhí)行數(shù)據(jù)庫(kù)大量的靜態(tài)部分的備份和恢復(fù)需要
??? * 提供一種完全保護(hù)歷史數(shù)據(jù)的方法
??? * 防止任何用戶對(duì)該空間的所有表進(jìn)行更新
?
??? 注:可以從只讀表空間中取消項(xiàng),但是不能創(chuàng)建可修改。
?
1、使表空間只讀
?
??? ALTER TABLESPACE ... READ ONLY;
?
??? 在執(zhí)行該操作前需要滿足以下條件:
?
??? * 該表空間必須是聯(lián)機(jī)的
??? * 該表空間必須沒(méi)有包含任何活動(dòng)的回滾段
??? * 不可以對(duì)SYSTEM表空間進(jìn)行該操作
??? * 該表空間當(dāng)前必須沒(méi)有涉及聯(lián)機(jī)備份
?
??? 注:該操作不必等待事務(wù)完成,操作后當(dāng)前事務(wù)仍可以提交或回滾,所有事務(wù)完成后成為只讀。
?
2、查找阻止只讀操作的事務(wù)
?
??? 若發(fā)現(xiàn)表空間停頓很長(zhǎng)的時(shí)間,需要識(shí)別阻止只讀操作的事務(wù)
?
??? SELECT SQL_TEXT, SADDR
????? FROM V$SQLAREA, V$SESSION
?????WHERE V$SQLAREA.ADDRESS = V$SESSION.SQL_ADDRESS
?????? AND SQL_TEXT LIKE 'alter tablespace%'; --查找該SQL的會(huì)話地址(SADDR)
????? FROM V$SQLAREA, V$SESSION
?????WHERE V$SQLAREA.ADDRESS = V$SESSION.SQL_ADDRESS
?????? AND SQL_TEXT LIKE 'alter tablespace%'; --查找該SQL的會(huì)話地址(SADDR)
?
?
??? SELECT SES_ADDR, START_SCNB?
????? FROM V$TRABSACTION?
?????ORDER BY START_SCNB; --找到查找到的SADDR之前SCN的事務(wù),即為阻止事務(wù)
????? FROM V$TRABSACTION?
?????ORDER BY START_SCNB; --找到查找到的SADDR之前SCN的事務(wù),即為阻止事務(wù)
?
??? 在完成READ ONLY操作后,立即對(duì)其備份。以后就不必再備份了。
?
3、使只讀表空間可寫(xiě)
?
??? ALTER TABLESPACE ... READ WRITE;
?
??? 需要滿足的條件是表空間以及該表空間的所有數(shù)據(jù)文件都必須是聯(lián)機(jī)的。
??? 具體可以在DBA_TABLESPACES和DBA_DATA_FILES中查詢其狀態(tài)
?
4、在WORM設(shè)備上創(chuàng)建只讀表空間
?
??? ① 在其他設(shè)備上創(chuàng)建一個(gè)可寫(xiě)的表空間,并創(chuàng)建對(duì)象、插入數(shù)據(jù)
??? ② 修改該表空間以使它只讀
??? ③ 將該表空間的數(shù)據(jù)文件復(fù)制到WROM設(shè)備上
??? ④ 使該表空間脫機(jī)
??? ⑤ 用ALTER TABLESPACE ... RENAME DATAFILE重命名數(shù)據(jù)文件,使其與WORM上的數(shù)據(jù)文件名稱一致
??? ⑥ 修改控制文件
??? ⑦ 使該表空間重新聯(lián)機(jī)
?
5、延遲只讀表空間中數(shù)據(jù)文件的打開(kāi)
?
??? 設(shè)置初始化參數(shù) READ_ONLY_OPEN_DELAYED = TRUE
??? 該設(shè)置會(huì)在需要讀取存儲(chǔ)在表空間中的數(shù)據(jù)時(shí),使表空間的數(shù)據(jù)文件只在第一次被訪問(wèn)。
?
??? 這個(gè)操作會(huì)帶來(lái)的副作用:
?
??? * 打開(kāi)時(shí)檢測(cè)不到缺少的或損壞的只讀文件(訪問(wèn)時(shí)才被發(fā)現(xiàn))
??? * ALTER DATABASE CHECK DATAFILES不檢查只讀文件
??? * ALTER TABLESPACE ONLINE不檢查只讀文件,只在第一次訪問(wèn)上被檢查
??? * V$RECOVER_FILE、V$BACKUP、V$DATAFILE_HEADER不訪問(wèn)只讀文件
??? * V$DATAFILE不訪問(wèn)只讀文件,只讀文件以“0”大小列出
??? * V$RECOVER_LOG不訪問(wèn)只讀文件,需要的用于恢復(fù)的日志沒(méi)有被添加到列表中
??? * ALTER DATABASE NOARCHIVELOG不訪問(wèn)只讀文件,即使有需要恢復(fù)的只讀文件也繼續(xù)進(jìn)行
?
??? 注:RECOVER DATABASE和ALTER DATABASE OPEN RESETLOGS會(huì)訪問(wèn)只讀文件而不管參數(shù)。
?
?
?
四、取消表空間
?
??? 除SYSTEM外的表空間均可被取消
?
??? 表空間取消后無(wú)法恢復(fù),所以最好在撤銷表空間前后都進(jìn)行一次完全備份。
?
?
??? DROP TABLESPACE users INCLUDING CONTENTS; --包括表空間中的段
?
??? DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES; --包括數(shù)據(jù)文件
?
?