1. 程式人生 > >表空間資料檔案詳解(一)

表空間資料檔案詳解(一)

一.表空間的建立

建立表空間:

Create tablespace felix

Datafile'/u01/app/oracle/oradata/felix/felixtbs.dbf'

Size100m autoextendonnext10m maxsize1024m

Extentmanagementlocaluniformsize128k

Segmentspacemanagementauto;

這個很重要,如何檢視建立的表空間屬性,就用如下的語句:

selecttablespace_name,block_size,contents,extent_management,allocation_type,segment_space_management

from  dba_tablespaces

where tablespace_name='FELIX';

如果需要查看錶空間的擴充套件屬性,需要通過dba_data_files進行檢視:

selecttablespace_name,autoextensible,increment_by,maxbytes

fromdba_data_files

where tablespace_name='FELIX';

--為應用建立使用者

createuser felix identifiedby felix

defaulttablespace felix

temporary

tablespace temp;

#建立使用者的相關資訊則可以通過DBA_USERS 檢視查詢得到:

selectusername,user_id,password,default_tablespace,temporary_tablespace

fromdba_users

whereusername='FELIX'

#進行相應的許可權的授予:

grantconnect,resourceto felix;

revokeunnlimited tablesapce from felix;

alteruser felix quotaunlimitedon

felix;

二.表空間管理技術

(1)資料字典表空間管理技術(DMT):所謂的資料字典管理表空間是指,當建立或者刪除物件時,oracle的表空間分配或回收是通過資料庫中的資料字典來記錄和管理的,用於管理的兩個資料字典分別是:UET$ used extents,已使用的空間)和FET$ free extents,空閒表空間)。

SQL> DESC UET$;

Name      Type   Nullable Default Comments

--------- ------ -------- ------- --------

SEGFILE#  NUMBER                          

SEGBLOCK# NUMBER                          

EXT#      NUMBER                          

TS#       NUMBER                          

FILE#     NUMBER                          

BLOCK#    NUMBER                          

LENGTH    NUMBER                           

SQL> DESC FET$;

Name   Type   Nullable Default Comments

------ ------ -------- ------- --------

TS#    NUMBER                          

FILE#  NUMBER                          

BLOCK# NUMBER                          

LENGTH NUMBER                          

可以清晰的看到檔案號(FILE#,資料塊號(BLOCK#)等資訊來管理空間的分配和回收;

資料字典管理表空間的工作方式;當一個新的段或者段在表空間中請求新的空間時,oracle通過執行一系列的sql語句來完成這個工作,這些工作包括從FET$找到可用的自由空間移動或增減相應的行到UET$中,並在FET$中刪除相應的記錄;當刪除一個段的時候,oracle則移動UET$中相應的行到FET$;這個過程是連續的、序列的,在繁忙的資料庫中,這類操作極可能導致競爭和等待,產生資料字典的爭用;另一方面,當資料字典的表的資訊被修改時,系統同樣要記錄undoredo資訊,頻繁的修改又不可避免的對整個資料庫的效能產生影響;

然而,資料字典管理表空間面臨的另外一個問題就是:空間碎片

(2)本地管理表空間技術(LMT):oracle不再使用資料字典管理而是在每個表空間的資料檔案頭加了一個位圖區域,在其中記錄每個extent的使用情況,每當一個extent被使用,或者被釋放以供重新使用時oracle都會跟新資料檔案頭的這個記錄,反應這個變化;

建立語法如下:

CREATE  TABLESPACEtablespace_name

DATAFILE ‘datafile_path_name’

[EXTENT MANASGEMENT { LOCAL| AUTOALLOCATION | UNIFORM [SIZEINTER [K|M]]}];

由於區間(extent)是oracle建立物件時的最小分配單元,所以表空間的管理實際上就是針對區間的管理;

--通過DBA_TABLESPACES檢視查詢表空間的型別:

select tablespace_name,extent_management,allocation_type

from dba_tablespaces;

DBA_EXTENTS記錄了每個物件分配的區間(EXTENT),哪些物件分配了多少空間以及區間具體位於的檔案等資訊:

SQL>  SELECTEXTENT_ID,BLOCK_ID,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='TS_TEST';

 EXTENT_ID   BLOCK_ID    BLOCKS

---------- ---------- ----------

         0        536          8

         1        544          8

         2        552          8

         3        560          8

         4        568          8

         5        576          8

         6        584          8

         7        592          8

         8        600          8

         9        608          8

       ...        … 

        11        624          8

        12        632          8

        13        640          8

        14       1800          8

        15       1808          8

        16        768        128

        17        896       128

        18       1024        128

        19       1152        128

        20       1280        128

        21       1408        128

        56      7040        128

        57       7168        128

58 rowsselected

轉儲資料塊資訊:

select object_id,

      dbms_rowid.rowid_relative_fno(rowid) file#,

      dbms_rowid.rowid_block_number(rowid) block#

from ts_test

where rownum<=100;

進行dump檢視:

#alter systemdumpdatafile3blockmax1blockmin6;

selectvaluefrom v$diag_info;

[[email protected] ~]$ vi  /u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_3219.trc

*** 2014-03-25 00:53:38.498

Block 1 (file header) not dumped:use dump file header command

Block dump from cache:

Dump of buffer cache at level 4 for tsn=2rdba=12582914

BH (0x6dbf97a8) file#: 3 rdba: 0x00c00002(3/2) class: 13 ba: 0x6db88000

 set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25

 dbwrid: 0 obj: -1 objn: -1 tsn: 2 afn: 3 hint: f

 hash: [0x77fb7be0,0x77fb7be0] lru: [0x6dbf9e80,0x6dbf9760]

 lru-flags: hot_buffer

 obj-flags: object_ckpt_list

 ckptq: [0x6a3ed9a8,0x6a3e4eb8] fileq: [0x6c7e74c8,0x6bfe75f8] objq:[0x6d3e5e08,0x6dbf9788] objaq: [0x6dbf9eb8,0x6dbf9798]

  st:XCURRENT md: NULL tch: 13

 flags: buffer_dirty block_written_once redo_since_read

 LRBA: [0x14.4b5f.0] LSCN: [0x0.14de1c] HSCN: [0x0.14de27] HSUB: [1]

Block dump from disk:

buffer tsn: 2 rdba: 0x00c00002 (3/2)

scn: 0x0000.00145380 seq: 0x02 flg: 0x04tail: 0x53801d02

frmt: 0x02 chkval: 0x1352 type: 0x1d=KTFB Bitmapped FileSpace Header

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x00007FAD09B98200 to0x00007FAD09B9A200

7FAD09B98200 0000A21D 00C00002 0014538004020000  [.........S......]

7FAD09B98210 00001352 00000003 0000000800003700  [R............7..]

7FAD09B98220 00000009 00000280 003FFFFE0000007E  [..........?.~...]

7FAD09B98230 000036FF 00000060 000004DA00145375  [.6..`.......uS..]

7FAD09B98240 00000000 00000000 0000000000000000  [................]

alter session set events 'immediate trace name file_hdrs level 10';

1 select file_id,extent_id,block_id,blocks

  2  from dba_extents

  3*where segment_name='TS_TEST'

  FILE_ID  EXTENT_ID   BLOCK_ID    BLOCKS

---------- ---------- ---------- ----------

        4          0        536          8

        4          1        544          8

        4          2        552         8

        4         13        640          8

        4         14       1800          8

        4         15       1808          8

        4         16        768        128

        4         17        896        128

        4         18       1024        128

        4         19       1152        128

        4         20       1280        128

        4         21       1408        128

        4         22       1536        128

        4         23       1664       128

        4         24       2944        128

        4         25       3072        128

        4         26       3200        128

        4         56       7040        128

        4         57       7168        128

        4         58       7296       128

59 rows selected.

SQL> select block_size,tablespace_name,min_extents,max_extents fromdba_tablespaces;

BLOCK_SIZE TABLESPACE_NAME               MIN_EXTENTS MAX_EXTENTS

---------- ------------------------------ ----------- -----------

      8192 SYSTEM                                   1  2147483645

      8192 SYSAUX                                   1  2147483645

      8192 UNDOTBS1                                 1  2147483645

      8192 TEMP                                     1

      8192 USERS                                    1  2147483645

      8192 EXAMPLE                                  1  2147483645

      8192 STATSPACK                                1  2147483645

      8192 STATSPACKTEMP                            1

      8192 FELIX                                    1  2147483645

9 rows selected

段空間管理技術:

段內則是以block為單位進行空間使用和管理的;

主要段的型別有:

SQL>select distinct(segment_type) fromdba_segments;

SEGMENT_TYPE

------------------------------------

LOBINDEX

INDEX PARTITION

TABLE SUBPARTITION

TABLE PARTITION

NESTED TABLE

ROLLBACK

LOB PARTITION

LOBSEGMENT

INDEX

TABLE

CLUSTER

TYPE2 UNDO

12 rows selected.

(1)      手工段空間管理(manual Segment space management):這種技術(9i之前的做法)是室通過段頭分配的自由列表(pctlist)來管理block的使用,簡單一點就是把自由列表想象成一個數據表,oracle依賴一系列的演算法通過自由列表中加入或移出block來管理段空間;

(2)  自動斷管理方式(autosegment space management):通過點陣圖實現管理

ASSM的巨大優勢是點陣圖組能夠減輕緩衝區忙等待(Bufferbusy wait)的負擔,在9i以前的版本里曾是一個嚴重的問題;並且顯著提高了併發性,因為點陣圖陣列的不同部分可以被同時使用,這樣就消除了尋找剩餘空間的序列化。

ASSM的管理機制,首先前2個數塊為數據檔案3~8個數塊為圖區,接下的第9個塊和第10個塊就是ASSM圖塊

進行dump第9個塊:

Alter database dump datafile 3 block 9;

SQL>alter systemdump datafile 3 block 9;

System altered.

SQL>select value from v$diag_info;

VALUE

------------------------------------------------------------------------------------

TRUE

/u01/app/oracle

/u01/app/oracle/diag/rdbms/felix/felix

/u01/app/oracle/diag/rdbms/felix/felix/trace

/u01/app/oracle/diag/rdbms/felix/felix/alert

/u01/app/oracle/diag/rdbms/felix/felix/incident

/u01/app/oracle/diag/rdbms/felix/felix/cdump

/u01/app/oracle/diag/rdbms/felix/felix/hm

/u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_3050.trc

0

0

11 rows selected.

tail  -300 /u01/app/oracle/diag/rdbms/felix/felix/trace/felix_ora_3050.trc

*** 2014-03-25 02:07:30.355

Block dump from cache:

Dump of buffer cache at level 4 for tsn=2rdba=12582921

Block dump from disk:

buffer tsn: 2 rdba: 0x00c00009 (3/9)

scn: 0x0000.000f2557 seq: 0x01 flg: 0x04tail: 0x25571e01

frmt: 0x02 chkval: 0xc075 type: 0x1e=KTFBBitmapped File Space Bitmap

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x00007FAD0893C600 to0x00007FAD0893E600

7FAD0893C600 0000A21E 00C00009 000F255704010000  [........W%......]

7FAD0893C610 0000C075 00000003 002E808000000000  [u...............]

7FAD0893C620 00000000 0000F800 0000000000000000  [................]

7FAD0893C630 00000000 00000000 0000000000000000  [................]

       Repeat 507 times

7FAD0893E5F0 00000000 00000000 0000000025571E01  [..............W%]

File Space Bitmap Block:

BitMap Control:

RelFno: 3, BeginBlock: 3047552, Flag: 0,First: 0, Free: 63488

0000000000000000 0000000000000000 00000000000000000000000000000000

0000000000000000 00000000000000000000000000000000 0000000000000000

0000000000000000 00000000000000000000000000000000 0000000000000000

查詢segment header,可以使用dba_segment檢視:

SQL> selectsegment_name,header_file,header_file,header_block from dba_segments

 2  where segment_NAME='TS_TEST';

SEGMENT_NAME       HEADER_FILE HEADER_FILE HEADER_BLOCK

------------------- ----------- -----------------------

TS_TEST               4           4         538