【DBA之路】第1回表空間的做成和擴張

原作者:柴田長(日本Oracle)

目前創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、北海街道網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

第一回,讓我們針對表空間來做一些練習(xí)。

對于每一個練習(xí),我們將總結(jié)出答案和回答的例子,大家可以跟自己的答案來比較一下。

此外,在SQL中使用的目錄結(jié)構(gòu)是基于Linux的。


■練習(xí)1。請創(chuàng)建一個名為[TBS_SMALL]的Small File表空間。這個表空間需要使用三個100MB的數(shù)據(jù)文件來構(gòu)成。

SQL> create tablespace TBS_SMALL datafile '/oracle_datafile1/tbs_small01.dbf' size 100M,
                                          '/oracle_datafile1/tbs_small02.dbf' size 100M,
                                          '/oracle_datafile2/tbs_small03.dbf' size 100M;

可能有些人還是第一次聽到【Small File表空間】這樣的說法。其實,從Oracle Database10g Release 1

開始出現(xiàn)了【Big File表空間】,所以,以前傳統(tǒng)的表空間就被稱為【Small File表空間】了。

在這里希望可以理解,Small File表空間是可以由多個數(shù)據(jù)文件構(gòu)成的。在以前32位的操作系統(tǒng)上,

一個文件的最大限制為2GB ,當(dāng)你想做成一個超過2GB的表空間時,這個功能會非常有效。

當(dāng)然,在進化成64位系統(tǒng)以后,對于這個文件大小2GB的限制,在操作系統(tǒng)層面已經(jīng)不用再做過多考慮,

但是作為Oracle數(shù)據(jù)庫來說,還是要注意數(shù)據(jù)文件大小是有限制的。

Small File表空間中的一個數(shù)據(jù)文件大小的最大值:

[表空間的Block Size] × 4194303(= 2^22 -1)  Block Size=8KB的話,大約是32GB(一個數(shù)據(jù)文件內(nèi)的
數(shù)據(jù)塊號要使用22bit來管理,另外,Block Size的大小也會影響計算結(jié)果)
順便說一句,像上面回答例中的DDL一樣,使用不同文件夾下的數(shù)據(jù)文件來做成一個表空間也是可以的。
但是ASM和BigFile表空間組合使用的情況下,其實并不需要考慮這個問題(以后再找機會介紹)。

■練習(xí)2。通過數(shù)據(jù)字典視圖【DBA_DATA_FILES】來確認TBS_SMALL表空間的大小。
SQL> select tablespace_name, sum(bytes)/1024/1024 "size(MB)" from DBA_DATA_FILES
where tablespace_name = 'TBS_SMALL' group by tablespace_name;
TABLESPACE_NAME                  size(MB)
------------------------------ ----------
TBS_SMALL                             300

Oracle數(shù)據(jù)庫里準備了大量的數(shù)據(jù)字典視圖,可以用來確認數(shù)據(jù)庫內(nèi)部的設(shè)定信息等。
作為DBA來講,不是僅僅執(zhí)行完DDL語句就結(jié)束了,執(zhí)行后的結(jié)果確認也是非常重要的。
練習(xí)2中使用的數(shù)據(jù)字典視圖【DBA_DATA_FILES】,可以用來確認全部數(shù)據(jù)文件的各種信息。
比如各個數(shù)據(jù)文件屬于哪個表空間。
根據(jù)上面的Select語句,就可以看出,TBS_SMALL表空間里的三個數(shù)據(jù)文件大小合計
(300MB = 100MB + 100MB + 100MB)。如果結(jié)果不是300MB,
那么練習(xí)1中表空間做成的時候可能存在誤操作。
關(guān)于數(shù)據(jù)字典視圖中各列所表示的意思,請參考相關(guān)的說明文檔。

■練習(xí)3。向TBS_SMALL表空間中追加新的數(shù)據(jù)文件,使其大小擴大至400MB。
SQL> alter tablespace TBS_SMALL add datafile '/oracle_datafile2/tbs_small04.dbf' size 100M;
很簡單吧?通過向SMALL FILE表空間內(nèi)追加數(shù)據(jù)文件,可以實現(xiàn)將表空間擴大的目的。

■練習(xí)4。把TBS_SMALL表空間的大小擴大至500MB。
SQL> alter tablespace TBS_SMALL add datafile '/oracle_datafile2/tbs_small05.dbf' size 100M;
打算使用跟練習(xí)3一樣的語句的各位,先等一下。
這個語句當(dāng)然是沒問題的,但是當(dāng)我想把表空間擴大至50GB的話,怎么辦呢?
要重復(fù)500次這樣的操作的話,需要花費相當(dāng)多的時間。
做成以后,數(shù)據(jù)文件的維護顯而易見也會成為一個×××煩。
而且,一個SMALL FILE表空間內(nèi)可以包含的數(shù)據(jù)文件個數(shù)的上限是1022個,不能無限的追加下去。
所以,練習(xí)4,我們使用另外一個擴大表空間的辦法,也就是擴大數(shù)據(jù)文件的大小。
SQL> alter database datafile '/oracle_datafile1/tbs_small01.dbf' resize 125M;
SQL> alter database datafile '/oracle_datafile1/tbs_small02.dbf' resize 125M;
SQL> alter database datafile '/oracle_datafile2/tbs_small03.dbf' resize 125M;
SQL> alter database datafile '/oracle_datafile2/tbs_small04.dbf' resize 125M;

當(dāng)然,只把其中第4個文件的大小改為200MB也是可以實現(xiàn)要求的,但是這樣的組成不太整齊不是嗎。
作為一個老資格的DBA,當(dāng)然是所有的數(shù)據(jù)文件大小都一直才會覺得舒服。
其實,這樣做是有理由的。舉個例子,表里的數(shù)據(jù)被均等的分布在各個數(shù)據(jù)文件,
100MB的數(shù)據(jù)文件滿了的時候,只有這個200MB的數(shù)據(jù)文件還有空間了,
這時候,數(shù)據(jù)文件的寫入就全部集中于這個文件上了。
當(dāng)目錄【/oracle_datafile】和【/oracle_datafile2】在不同的磁盤上的時候,
對于特定的磁盤的寫入就會很集中,則會產(chǎn)生性能下降的可能。
另外,從各個磁盤上讀取的數(shù)據(jù)量也有可能會發(fā)生偏移。
所以,這次我們對存在的4個數(shù)據(jù)文件都做了同樣大小的擴大。

通過這項練習(xí),希望大家體會到的有2點。
第一點,雖然是對表空間進行變更時,但是使用的語句不是【alter tablespace】
而是【alter database】來進行數(shù)據(jù)文件大小的變更。
第二點,數(shù)據(jù)文件的數(shù)量越多,維護起來就越難。
尤其是在使用裸設(shè)備放置數(shù)據(jù)文件的時候,是很難擴大數(shù)據(jù)文件的大小的。
所以隨著表空間大小的擴大,需要被管理的裸設(shè)備以及數(shù)據(jù)文件數(shù)都會增加。
此外,也許有人有過這樣的經(jīng)驗,由于新追加的數(shù)據(jù)文件都是空的,
所以在追加數(shù)據(jù)文件后還要通過對數(shù)據(jù)做一次導(dǎo)出然后再做一次導(dǎo)入來避免問題。
(不過這個問題在ASM上已經(jīng)可以得到解決)

完成擴大數(shù)據(jù)文件的操作后,可以使用下面的Select語句來進行查詢,使用rollup的話,會很方便。
SQL> select tablespace_name, file_name, sum(bytes)/1024/1024 "size(MB)" from DBA_DATA_FILES
      where tablespace_name = 'TBS_SMALL'
      group by tablespace_name, rollup(file_name);
TABLESPACE_NAME                FILE_NAME                                          size(MB)
------------------------------ ------------------------------------------------ ----------
TBS_SMALL                      /oracle_datafile1/tbs_small01.dbf                       125
TBS_SMALL                      /oracle_datafile1/tbs_small02.dbf                       125
TBS_SMALL                      /oracle_datafile2/tbs_small03.dbf                       125
TBS_SMALL                      /oracle_datafile2/tbs_small04.dbf                       125
TBS_SMALL                                                                              500

■練習(xí)5。做一個名為【TBS_BIG】的Big File表空間。表空間的大小設(shè)置為300MB。
SQL> create bigfile tablespace TBS_BIG datafile '/oracle_datafile1/tbs_big01.dbf' size 100M,
                                               '/oracle_datafile1/tbs_big02.dbf' size 100M,
                                               '/oracle_datafile2/tbs_big03.dbf' size 100M;
上面的語句,會執(zhí)行失敗。錯誤代碼ORA-32774。
發(fā)生錯誤的原因,是因為BIGFILE表空間里只允許指定一個數(shù)據(jù)文件。
這樣的話,對于多個數(shù)據(jù)文件的管理上的工作量就會少很多。
但是,可以包含多個數(shù)據(jù)文件的SMALLFILE表空間不是可以做擴大的嗎?BIGFILE是什么樣的呢?
首先看一下Big File表空間中的數(shù)據(jù)文件大小的最大值:
[表空間的Block Size] × 4294967295 (= 2^32 -1)  Block Size=8KB的話,大約是32TB。
BigFile表空間的數(shù)據(jù)文件大小的最大值是SmallFile表空間中一個數(shù)據(jù)文件大小的最大值的1000倍。
這是因為BigFile表空間里只限定使用一個數(shù)據(jù)文件,而SmallFIle表空間里為了識別多個數(shù)據(jù)文件
而使用的10bit可以用來存放數(shù)據(jù)塊號了(22bit+10bit=32bit)。
不過,由于SmallFile表空間中可以有1022個數(shù)據(jù)文件,因此表空間的最大大小,都是32TB左右。
那么使用BigFile表空間又有什么好處呢。
在這里,新的數(shù)據(jù)庫限制要登場了。
那就是,一個數(shù)據(jù)庫內(nèi)數(shù)據(jù)文件的最大個數(shù)(通常情況下為64000個)。
因為存在這個限制,所以可以考慮使用BigFile表空間來大幅增加數(shù)據(jù)庫的容量。
說明有點長了,練習(xí)5的答案在這里:
SQL> create bigfile tablespace TBS_BIG datafile '/oracle_datafile1/tbs_big.dbf' size 300M;

■練習(xí)6。通過數(shù)據(jù)字典視圖DBA_TABLESPACES來確認表空間TBS_BIG是BIGFILE表空間
SQL> select tablespace_name,bigfile from dba_tablespaces
where tablespace_name in ('TBS_SMALL','TBS_BIG')

TABLESPACE_NAME                BIGFILE
------------------------------ ----------------
TBS_BIG                        YES
TBS_SMALL                      NO

這里再多說一點。練習(xí)1中執(zhí)行的create tablespace命令,實際上在做成表空間的時候命令
是create smallfile tablespace。認為不指定smallfile的時候會默認做成smallfile表空間的人一定會有,
但實際上默認表空間的類型是依存于默認表空間類型的。確認默認表空間類型的SQL如下:
SQL> -- Checking Default Tablespace Type
 col property_value for a32
 select PROPERTY_NAME, PROPERTY_VALUE
   from DATABASE_PROPERTIES
   where PROPERTY_NAME = 'DEFAULT_TBS_TYPE';

SQL> -- Setting Default Tablespace Type [BIGFILE]
 alter database set default BIGFILE tablespace;

SQL> -- Setting Default Tablespace Type [SMALLFILE]
 alter database set default SMALLFILE tablespace;
 
■練習(xí)7。用任意方法把表空間TBS_BIG的大小擴大為500MB。
SQL> alter database datafile '/oracle_datafile1/tbs_big.dbf' resize 500M;
用的是跟練習(xí)4一樣的方法的話,當(dāng)然是不會有錯的。
不過這也是作者盡量考慮到各個方面而想出來的問題,大家沒有產(chǎn)生懷疑嗎?
是的,我期待的完美回答其實是下面這樣的:
SQL> alter tablespace TBS_BIG resize 500M;

希望大家可以產(chǎn)生一種“Bigfile表空間的話,管理起來會比較容易”的感覺。
smallfile表空間的話的擴大,需要使用alter database并且指定數(shù)據(jù)文件名的方式來實施。
而bigfile表空間的話的擴大,不用考慮數(shù)據(jù)文件名,直接使用alter tablespace這樣直觀的命令來做,
這樣不需要再通過數(shù)據(jù)字典視圖去確認數(shù)據(jù)文件的名稱了。

通過上面的聯(lián)系,我們已經(jīng)學(xué)會生成表空間的方法了。create tablespace語句,除了這里介紹的,
其實還可以指定很多其他選項。但是大多數(shù)場合,這些選項不指定(使用默認值)也是沒問題的。
為了詳細理解,段和區(qū)的構(gòu)造也是需要去好好把握的。這里就不做過多的延伸了。
SMALLFILE表空間和BIGFILE表空間的區(qū)別,還是要通過手冊去好好研究。
想成為一個DBA的話,一定要去讀一讀這些手冊。

下回,我們來說說【表和表空間的關(guān)系】。


網(wǎng)頁名稱:【DBA之路】第1回表空間的做成和擴張
新聞來源:http://muchs.cn/article44/ihidhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站搜索引擎優(yōu)化、品牌網(wǎng)站建設(shè)網(wǎng)站策劃、用戶體驗、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作