oracle的邏輯結構

jane_pop發表於2014-09-09
oracle的邏輯元件包括:資料庫database->表空間tablespace->段segment->區extent->資料塊block
(1)表空間是資料庫中最大的邏輯單位,一個oracle資料庫至少包含一個表空間,就是名為SYSTEM的系統表空間。每個表空間是由一個或多個資料檔案組成的,一個資料檔案只能與一個表空間相關聯,表空間的大小等於構成這個表空間的所有資料檔案的大小之和。
透過DBCA建立的oracle10g/oracle11g資料庫預設包含如下表空間SYSTEM,SYSAUX,TEMP,UNDOTBS1,USERS,EXAMPLE。
SYSTEM是系統表空間,存放系統的最基本的資訊,如果SYSTEM表空間壞掉,oracle將無法啟動。
SYSAUX是從10g中引入的,作為SYSTEM的輔助表空間,用以減少SYSTEM表空間的負荷。以前其他表空間中的一些元件,現在放到SYSAUX表空間中了。
TEMP是臨時表空間,當排序不能在分配的空間中完成時,就會使用磁碟排序的方式,即在oracle例項中的臨時表空間中進行。
UNDOTBS1是撤銷表空間,是UNDO型別的表空間,儲存使用者進行DML操作中,修改前的資料。
USERS是資料庫預設的永久表空間。
EXAMPLE是資料庫測試用例所涉及的表的所屬表空間。
(2)是構成表空間的邏輯結構,段是由一組區組成的。
按照段所儲存資料的特徵,將段分為若干種型別,主要有資料段,索引段,回退段和臨時段。
透過dba_segments檢視資料庫中的段:
SYS@orcl 06-SEP-14>col segment_name for a15
SYS@orcl 06-SEP-14>col tablespace_name for a15
SYS@orcl 06-SEP-14>set pause on
SYS@orcl 06-SEP-14>select segment_name,segment_type,tablespace_name
  2  from dba_segments;


SEGMENT_NAME    SEGMENT_TYPE       TABLESPACE_NAME
--------------- ------------------ ---------------
CON$            TABLE              SYSTEM
UNDO$           TABLE              SYSTEM
PROXY_ROLE_DATA TABLE              SYSTEM
$
FILE$           TABLE              SYSTEM
PROXY_DATA$     TABLE              SYSTEM
BOOTSTRAP$      TABLE              SYSTEM
OBJ$            TABLE              SYSTEM
OBJERROR$       TABLE              SYSTEM
OBJAUTH$        TABLE              SYSTEM


(3)是oracle資料庫分配資料的單位,區為段分配空間,它由連續的資料塊組成。
當段中的所有空間已完全使用時,系統自動為該段分配一個新區,區不能跨越資料檔案存在,只能存在一個資料檔案中。
可以透過dba_extents來檢視:
SYS@orcl 06-SEP-14>select segment_name,tablespace_name,blocks from dba_extents;
SEGMENT_NAME    TABLESPACE_NAME     BLOCKS
--------------- --------------- ----------
SYSTEM          SYSTEM                   8
SYSTEM          SYSTEM                   8
SYSTEM          SYSTEM                   8
SYSTEM          SYSTEM                   8
SYSTEM          SYSTEM                   8
SYSTEM          SYSTEM                   8
SYS_LOB00000523 SYSTEM                   8
23C00005$$
SYS_LOB00000135 SYSTEM                   8
07C00003$$


(4)資料塊是oracle伺服器所能讀取或寫入的最小儲存單位。
oracle以資料塊為單位管理資料檔案的儲存空間,oracle的資料塊由操作體統的資料塊組成。
檢視當前資料庫中的資料塊大小:
SYS@orcl 06-SEP-14>show parameter db_block_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192


下面我們講講建立表空間的命令:
當我們建立表空間的時候,需要指定datafile來指明這個表空間所對應的資料檔案,如下:
create tablespace data01 datafile 
'/u01/app/datafile/data01a.dbf' size 10m,
'/u01/app/datafile/data01b.dbf' size 10m;
資料檔案預設最多包含4194304個資料塊(2的22次方),資料塊預設為8192(8k),那麼資料檔案最大即為4194304*8k=32GB。
那麼如果我們需要建立一個大小大於32GB的表空間該怎麼辦呢?
這裡存在一個特殊語法,我們可以使用create bigfile tablespace命令來建立,但是需要注意的是,指定bigfile的表空間只能包含一個資料檔案,否則將會出現如下錯誤:
SYS@orcl 06-SEP-14>create bigfile tablespace data01
  2  datafile '/u01/app/datafile/data01a.dbf' size 33g,
  3  '/u01/app/datafile/data01b.dbf' size 33g;
create bigfile tablespace data01
*
ERROR at line 1:
ORA-32774: more than one file was specified for bigfile tablespace DATA
正確寫法如下:
SYS@orcl 06-SEP-14>create bigfile tablespace data01
  2  datafile '/u01/app/datafile/data01.dbf' size 33g;


Tablespace created.


檢視錶空間中有哪些是屬於bigfile的:
SYS@orcl 06-SEP-14>select tablespace_name,bigfile from dba_tablespaces;


TABLESPACE_NAME      BIG
-------------------- ---
SYSTEM                       NO
SYSAUX                       NO
UNDOTBS1                  NO
TEMP                           NO
USERS                         NO
EXAMPLE                     NO
TEST                           NO
HH                              NO
GOODS                       NO 
DATA01                     YES


10 rows selected.


預設的表空間為smallfile型別,bigfile的表空間只能包含一個資料檔案,該資料檔案可以
包含4294967296(2的32次方)個資料塊。


下面說說建立表空間的詳細語句:
create tablespace xxx                            表空間名稱
datafile '/xxx/../xxx.dbf'                         資料檔案路徑和名稱
size xxxm                                            資料檔案初始大小
autoextend on                                      資料檔案是否自動增長
next 10m                                             資料檔案每次自動增長大小
maxsize 2048m                                    資料檔案最大檔案大小
可以指定unlimited(小檔案型別資料檔案8k塊大小為32GB)
extent management local                       表空間區分配採用本地表空間管理
uniform size 128k                                 設定區分配的大小統一為128k
如果不指定大小,則為1M,也可以設定為autoallocate,則設定extent大小由
系統自動分配
segment space management auto            設定段中BLOCK的空間管理為auto


檢視資料檔案自動擴充套件特性和最大擴充套件大小:
SYS@orcl 06-SEP-14>col file_name for a40
SYS@orcl 06-SEP-14>select file_name,autoextensible,maxbytes/1024/1024/1024
  2  from dba_data_files;


FILE_NAME                                AUT MAXBYTES/1024/1024/1024
---------------------------------------- --- -----------------------
/datafile/users01.dbf                    YES              31.9999847
/datafile/undotbs01.dbf                YES              31.9999847
/datafile/sysaux01.dbf                  YES              31.9999847
/datafile/system01.dbf                  YES              31.9999847
/datafile/example01.dbf                YES              31.9999847
/u01/app/datafile/test01.dbf          YES              31.9999847
/datafile/hh01.dbf                        YES              31.9999847
/u01/app/datafile/goods01.dbf      YES              31.9999847


8 rows selected.


下面講講表空間的管理方式:
表空間的管理方式有兩種:
區的管理(extent),區的管理主要用於表空間上區的分配和回收,區的管理分為兩種方式:
a)資料字典空間管理dictionary managed tablespace
透過管理兩個主要的資料字典表:UET$(Used EXtents)和FET$(Free EXtents)來實現區的分配和管理,在oracle9i以後已淘汰。
缺點:併發訪問爭用(大量訪問UET$,FET$),產生大量的redo undo,空間碎片多。
b)本地表空間管理local managed tablespace 
在每個資料檔案頭部加入點陣圖區域,透過點陣圖的值(0或1)來實現區的分配和管理。
extent management local(9i以後預設方式)
具體空間分配方式:
1.autoallocate                      allocation_type=system
2.uniform                            allocation_type=uniform
建立表空間不指定區管理方式,預設為本地管理,空間分配選擇system。
可以用以下命令檢視錶空間的區管理方式以及空間分配方式:
SYS@orcl 06-SEP-14>col tablespace_name for a20
SYS@orcl 06-SEP-14>select tablespace_name,extent_management,allocation_type 
  2  from dba_tablespaces;


TABLESPACE_NAME      EXTENT_MAN ALLOCATIO
-------------------- ---------- ---------
SYSTEM                        LOCAL      SYSTEM
SYSAUX                        LOCAL      SYSTEM
UNDOTBS1                   LOCAL      SYSTEM
TEMP                           LOCAL      UNIFORM
USERS                         LOCAL      SYSTEM
EXAMPLE                     LOCAL      SYSTEM
TEST                           LOCAL      SYSTEM
HH                              LOCAL      SYSTEM
GOODS                       LOCAL      SYSTEM


9 rows selected.


下面講講段的管理sgement,段的管理主要用於段中國資料塊的分配和回收,段中塊的管理方式有兩種:
MSSM(Manual Segment Space Management)           不推薦使用
ASSM(Auto System Space Management)                 預設值


MSSM透過在段的段頭部分分配自由列表freelist來管理block
透過兩個引數pctfree pctused來管理block如何進出freelist
pctfree值表示預留多少block空間用於更新(百分比)
pctused值表示低於這個值(百分比),block會重新加入到freelist上,可以允許插入資料插入操作。


ASSM透過在每個段的段頭部分分配點陣圖bitmap來管理block,透過點陣圖中的值來判斷資料塊是否可用,
不需要freelist,不需要pctused。
ASSM能有效提高段的管理效率。


可用如下命令檢視段空間的管理方式:
SYS@orcl 06-SEP-14>select tablespace_name,segment_space_management
  2  from dba_tablespaces;


TABLESPACE_NAME      SEGMEN
-------------------- ------
SYSTEM                      MANUAL
SYSAUX                      AUTO
UNDOTBS1                  MANUAL
TEMP                          MANUAL
USERS                        AUTO
EXAMPLE                    AUTO
TEST                          AUTO
HH                             AUTO
GOODS                      AUTO


9 rows selected.


當我們刪除表空間的時候可以使用including contents and datafiles來同時刪除表空間上的表和資料檔案。
drop tablespace data01 including contents and datafiles;


可以為表空間增加資料檔案:
SYS@orcl 06-SEP-14>alter tablespace data01
  2  add  datafile '/u01/app/datafile/data01b.dbf' size 10m;


Tablespace altered.


檢視資料檔案的編號和檔名稱:
SYS@orcl 06-SEP-14>select file#,name from v$datafile;




         FILE# NAME
---------- ----------------------------------------
         1 /datafile/system01.dbf
         2 /datafile/sysaux01.dbf
         3 /datafile/undotbs01.dbf
         4 /datafile/users01.dbf
         5 /datafile/example01.dbf
         6 /u01/app/datafile/test01.dbf
         7 /datafile/hh01.dbf
         8 /u01/app/datafile/goods01.dbf
         9 /u01/app/datafile/data01a.dbf
        10 /u01/app/datafile/data01b.dbf


10 rows selected.


修改資料檔案的大小,可以指定資料檔案的名稱,也可以指定資料檔案的編號
可以擴大檔案,也可以縮小檔案
擴大檔案不能超過單一檔案大小限制,縮小檔案不能小於當前使用空間。




SYS@orcl 06-SEP-14>alter database 
  2  datafile '/u01/app/datafile/data01b.dbf' resize 20m;


Database altered.


SYS@orcl 06-SEP-14>alter database datafile 10 resize 20m;


Database altered.
SYS@orcl 06-SEP-14>select file_id,file_name,bytes/1024/1024||'MB'
  2  from dba_data_files;




   FILE_ID FILE_NAME                                BYTES/1024/1024||'MB'
---------- ---------------------------------------- ------------------------------------------
         4 /datafile/users01.dbf                    5MB
         3 /datafile/undotbs01.dbf                  60MB
         2 /datafile/sysaux01.dbf                   540MB
         1 /datafile/system01.dbf                   690MB
         5 /datafile/example01.dbf                  100MB
         6 /u01/app/datafile/test01.dbf             100MB
         7 /datafile/hh01.dbf                       10MB
         8 /u01/app/datafile/goods01.dbf            50MB
         9 /u01/app/datafile/data01a.dbf            10MB
        10 /u01/app/datafile/data01b.dbf            20MB


10 rows selected.


現在我們建立了一個使用者data01,其表空間是data01,以data01登入,建立一張表tab1:
DATA01@orcl 06-SEP-14>create table tab1(id int) tablespace data01;


Table created.


然後我們為這張表分配區:
DATA01@orcl 06-SEP-14>alter table tab1 allocate extent
  2  (size 1m datafile '/u01/app/datafile/data01a.dbf');


Table altered.


DATA01@orcl 06-SEP-14>alter table tab1 allocate extent
  2  (size 1m datafile '/u01/app/datafile/data01b.dbf');


Table altered.


可以用如下命令檢視錶tab1的區具體分配在哪些資料檔案上:
SYS@orcl 06-SEP-14>select distinct file_id,name from dba_extents e,v$datafile d
  2  where e.owner='DATA01' and e.segment_name='TAB1'
  3  and e.file_id=d.file#;




   FILE_ID NAME
---------- ----------------------------------------
         9 /u01/app/datafile/data01a.dbf
        10 /u01/app/datafile/data01b.dbf
















來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29800581/viewspace-1266241/,如需轉載,請註明出處,否則將追究法律責任。

相關文章