Oracle表空間的管理方式(LMT、DMT)--本地和字典管理

lhrbest發表於2018-04-25

Oracle表空間的管理方式(LMT、DMT)--本地和字典管理






字典管理:oracle 8i(不包括i),只存在一種表空間的管理模式,即字典管理表空間(DMT)。DMT是指oracle的空間分配或回收是通過資料庫中的資料字典表來記錄和管理的。用於管理的兩個資料字典表分別是:UET$(used extents)和FET$(freeextents)。DMT工作方式是:當建立一個新的段或者段在表空間時,oracle通過一系列的SQL語句來完成這個工作且和前面的兩個字典表有關,在繁忙的系統中會造成競爭和等待(另一個DMT會帶來的問題是空間碎片)。

本地管理(Locally Managed TablespaceLMT):在建立表空間時,9iR2版本後成了預設的選項LMT在表空間的資料檔案頭部加入了一個點陣圖區域,在其中記錄每個extent的使用狀況。當extent被使用或者被釋放,oracle會更新頭部的記錄來反映這個變化,不產生回滾資訊。因為僅僅運算元據檔案頭部的幾個資料塊,不用運算元據字典,LMT比DMT要快,尤其是在繁忙的時候更明顯。

需要注意的是,如果使用“CREATE DATABASE”命令建立資料庫,且不顯式的加“EXTENT MANAGEMENT LOCAL”子句時,那麼在建立完資料庫後,其SYSTEM表空間預設為字典管理的表空間。只有SYSTEM表空間為字典管理的表空間時,才可以建立基於字典管理的其它表空間。如果SYSTEM表空間是基於本地管理的,那麼無法建立基於字典管理的表空間。

 

--檢視錶空間使用的管理方式:

SQL> select TABLESPACE_NAME,EXTENT_MANAGEMENT,BLOCK_SIZE,STATUS,CONTENTS,FORCE_LOGGING,BIGFILE from dba_tablespaces;

TABLESPACE_NAME                EXTENT_MAN BLOCK_SIZE STATUS    CONTENTS  FOR BIG

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

SYSTEM                         LOCAL            8192 ONLINE    PERMANENT NO  NO

UNDOTBS1                       LOCAL            8192 ONLINE    UNDO      NO  NO

SYSAUX                         LOCAL            8192 ONLINE    PERMANENT NO  NO

TEMP                           LOCAL            8192 ONLINE    TEMPORARY NO  NO

USERS                          LOCAL            8192 ONLINE    PERMANENT NO  NO

EXAMPLE                        LOCAL            8192 ONLINE    PERMANENT NO  NO

TBS1                           LOCAL            8192 ONLINE    PERMANENT NO  NO

--DMT 和LMT 的相互轉換

--將字典管理的表空間轉換為本地管理

exec dbms_space_admin.tablespace_migrate_to_local('表空間名') --表空間名用大寫

--將本地管理的表空間轉換為字典管理

exec dbms_space_admin.tablespace_migrate_from_local('表空間名')

 

 

【OCP真題1】 which two statements are true about tablespaces?

A. A database can contain multiple undo tablespaces.

B. A database instance stores undo data in the SYSTEM tablespace if no undo tablespace exists.

C. A database instance hangs if the SYSAUX tablespace becomes unavailable.

D. A database can contain only a single temporary tablespace.

E. A database with a locally managed SYSTEM tablespace can have dictionary-managed user tablespaces.

AnswerAB

 

對於C選項,不會hang

對於D選項,一個資料庫可以包含多個臨時表空間

對於E選項,如果系統表空間是基於本地管理的,那麼無法建立基於資料字典管理的表空間。

 

SYS@ora11g >  create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management directory;

 create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management directory

                                                                                                                *

ERROR at line 1:

ORA-25141: invalid EXTENT MANAGEMENT clause

 

 

SYS@ora11g >  create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary;

 create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary

*

ERROR at line 1:

ORA-12913: Cannot create dictionary managed tablespace

 

 

SYS@ora11g >  select extent_management from dba_tablespaces where tablespace_name='SYSTEM';

 

EXTENT_MAN

----------

LOCAL

 

SYS@ora11g > ! oerr ora 12913

12913, 00000, "Cannot create dictionary managed tablespace"

// *Cause: Attemp to create dictionary managed tablespace in database

//         which has system tablespace as locally managed

// *Action: Create a locally managed tablespace.

 

SYS@ora11g >

只有SYSTEM為字典管理的表空間時才能建立字典管理的普通表空間:

[oracle@rhel6lhr ~]$ cat a.txt

db_name=PROD3

db_block_size=8192

db_create_file_dest='/u01/app/oracle/oradata'

control_files='/u01/app/oracle/oradata/PROD3/control01.ctl'

sga_target=300m

[oracle@rhel6lhr ~]$

[oracle@rhel6lhr ~]$

[oracle@rhel6lhr ~]$ mkdir /u01/app/oracle/oradata/PROD3

[oracle@rhel6lhr ~]$

[oracle@rhel6lhr ~]$ sas

 

SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 24 22:41:03 2018

 

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

 

Connected to an idle instance.

 

SYS@orclasm > exit

Disconnected

[oracle@rhel6lhr ~]$ ORACLE_SID=PROD3

[oracle@rhel6lhr ~]$ sas

 

SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 24 22:41:17 2018

 

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

 

Connected to an idle instance.

 

SYS@PROD3 > startup nomount pfile='/home/oracle/a.txt';

ORACLE instance started.

 

Total System Global Area  313159680 bytes

Fixed Size                  2227944 bytes

Variable Size             113246488 bytes

Database Buffers          192937984 bytes

Redo Buffers                4747264 bytes

SYS@PROD3 > create database PROD3 character set al32utf8;

 

Database created.

 

/*

Specify the EXTENT MANAGEMENT LOCAL clause in the CREATE DATABASE statement to create a locally managed SYSTEM tablespace. The COMPATIBLE initialization parameter must be set to 10.0.0 or higher for this statement to be successful. If you do not specify the EXTENT MANAGEMENT LOCAL clause, then by default the database creates a dictionary-managed SYSTEM tablespace. Dictionary-managed tablespaces are deprecated.*/

 

SYS@PROD3 > select open_mode from v$database;

 

OPEN_MODE

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

READ WRITE

 

SYS@PROD3 > create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary;

 

Tablespace created.

 

SYS@PROD3 >

 

SYS@PROD3 > SET LINE 120

SYS@PROD3 >  SELECT  TS.NAME,decode(ts.bitmapped, 0, 'DICTIONARY', 'LOCAL') extent_management FROM SYS.TS$ TS;

 

NAME                                                         EXTENT_MANAGEMENT

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

SYSTEM                                                       DICTIONARY

SYSAUX                                                       LOCAL

SYS_UNDOTS                                                   LOCAL

TEST_DIC                                                     DICTIONARY

 

SYS@PROD3 >

 

 

【OCP真題1】 An online tablespace, TEST_TBS, is full and you realize that no server-managed tablespace threshold alerts were generated for the TEST_TBS tablespace. What could be the reason, if the TEST_TBS tablespace does not include autoextensible data files?  一個名為測試表空間的聯機表空間是滿的,你意識到測試表空間表沒有生成伺服器管理的表空間閾值警報。如果測試表空間不包括自動擴充套件資料檔案,可能是什麼原因?

A. TEST_TBS is a small file tablespace.

B. TEST_TBS is a bigfile tablespace (BFT).

C. TEST_TBS is the default temporary tablespace.

D. TEST_TBS is a dictionary-managed tablespace. TEST_TBS是一個字典管理的表空間。(基於點陣圖的會告警)

Answer: D







解釋說明:表空間是一個邏輯概念:=> oracle 邏輯概念段區塊管理方式:

number one =》 tablespace

number two=> segments

Oracle新建一個物件,產生一個物件,這有啥需要管理的嗎? 使用了一個延時段管理;

所以一般沒人會回答表空間的管理是延遲段管理還是非延遲段管理,而是說區的管理方式,就是分配區的方式;

 

number three A:如何尋找空閒的區域,給新分配的區,安家落戶。

Oracle區的分配的方式分兩種: directory, local 字典、本地管理,字典管理基本被棄用; 那麼Oracle分配區的方式有沒有更細節的呢? 例如分配一個區,區分給他多大?

number three B:衍生出,如何對新生成的區,給它分配多大空間,第一種:預設,auto allocative,系統預設分配;第二種uniform size;

首先解釋說明,區的空間大小如何衡量? 區是由連續的塊組成,最初是8個塊*8192Bytes=64kb ytes/

*** 相當於看人口,舉例,家族遷移;發生戰亂,從北方逃難,來到美麗的江西九江,九江的官員畢竟負責,來住可以,先統計人口,判斷出,有500多號人,按照8個房間,一個房間住2個人的美好場景=32間房間左右,按照16個房間好管理的方式,分配了兩個街道(區),每個街道16個房間(塊);

如果是自動的呢? 官員不負責任,來了500個人,按照每個街道,分配8個房間;需要62個街道分配,分配12次;

但是官府有一套機制,分配到16個街道之後,官府自動增加分配區的大小,分配第16以後,官府決定大方一點,每個街道(區)分配128間房間,(麻煩,減少工作量)這樣最少,也需要分配16個街道*8+ 2-3*128個塊的方式分配===》也就是說,最少需要分配18次;

 

以上說明:僅限於理解,手動統一分配與自動的區別,實際還存在大量誤差,概念可以先理解;

 

number four;以上分配空間都說了空間不夠,分割槽;

                    如果是已經分配了區,但是Insert 一條資料,它去哪裡儲存呢?,塊在哪裡找呢? 段空閒管理方式;

number four A: manual手工,特徵,並不是手動,而是相比較B,顯得笨拙;

特點: 手工段空閒管理,在段的頭部,段是邏輯概念,如何真時記錄資料,歸屬於段的一堆塊中,前三個塊預設,就是管理單位,建立記錄了一個free list的列表,儲存什麼樣的資料? 儲存記錄空閒空間的塊的資訊;需要使用塊時,去空閒列表,讀取空閒塊;併發訪問會導致新增鎖,其它事物等待,這種熱快容易產生,buffer busy waits熱快現象;訪問時序列方式

 

number four B: auto:預設,我們儲存資料,一般是無序的,哪個塊有空閒,就往哪個塊裡面儲存資料,正是因為沒有順序,所以訪問表的資料,需要全表掃描;

自動段空閒塊管理,採用的方式是在段的頭部建立bitmap點陣圖的方式記錄塊是否空閒,支援併發訪問;

 

——————————————————————以上是原理,以下通過檢視驗證查詢---

number one;

 

Aoracle database 11g 預設採用段延遲管理;

SQL> show parameter seg

NAME                                 TYPE        VALUE

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

deferred_segment_creation            boolean     TRUE

--延遲  段  建立=> ture  false;

什麼是延遲管理,如果你建立的物件沒有具體的資料儲存,Oracle將不會給你分配儲存區域,儲存區域的管理是段,不會分配段給你;

 

---建立測試表,只建立表結構,沒有資料

SQL> create table emp1 as select * from emp where 1=2;

---查詢表的儲存,段、區、塊、大小

SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';

no rows selected

--插入資料測試

SQL> insert into emp1 select * from emp where rownum<2;

--再次查詢

SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';

SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENT

EMP1          TABLE              USERS                               .0625        8         1

 

---修改引數,取消延遲段分配管理,建立測試表,查詢結果如下;

---alter system set deferred_segment_creation=false;

EMP2     TABLE              USERS                               .0625        8        1

 

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

number two

空閒區的管理方式:資料字典管理與本地管理

資料字典管理:1.採取兩個基表進行管理,free extent記錄在資料字典表中的fet$、已經使用的記錄在uet$;

                         2.當表插入資料,需要儲存擴大空間存放資料,都需要訪問fet$表,獲取資訊後;

                         3.需要對fet$、以及uet$兩張表進行dml更改操作;

 ===》這就造成了,如果資料庫中,大量的區擴張時,併發去訪問修改以上兩張表,消耗資源,等待分配;

 

本地管理:點陣圖管理:權利下放,從兩張表的許可權放到每一個資料檔案的手上;

           1.每個表空間對每個資料檔案的頭部加入一個點陣圖區,記錄每個區的使用情況,當儲存區發生改變使用或者刪除,會對資料檔案頭部的點陣圖進行修改;

           2.因為如上的方式,回收或者分配,只需要在每個表空間的每個資料檔案的資料檔案頭部進行修改,而且還是修改點陣圖,效率高,並且減少了併發

         

--如何查詢是表空間是點陣圖管理:本地還是資料字典管理呢?

 

SQL> select TABLESPACE_NAME,CONTENTS,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;

TABLESPA CONTENTS  EXTENT_MAN ALLOCATIO SEGMEN

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

SYSTEM   PERMANENT DICTIONARY USER      MANUAL

SYSAUX   PERMANENT LOCAL      SYSTEM    AUTO

UNDOTBS1 UNDO      LOCAL      SYSTEM    MANUAL

TEMPTS1  TEMPORARY LOCAL      UNIFORM   MANUAL

USERS    PERMANENT LOCAL      SYSTEM    MANUAL

TBS_DICT PERMANENT DICTIONARY USER      MANUAL

 

extent_management列:directory代表資料字典,local代表本地點陣圖管理;

directory已經被放棄選擇了,此查詢是因為手工艱苦,控制檔案指令碼修改了:刪除了.EXTENT MANAGEMENT LOCAL  表空間本地管理,造成的效果類似,extent management directory;

.SQL> create tablespace abc datafile '/picclife/app/oracle/abc.dbf' size 10m extent management local/ directory;

 

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

number three:

表空間的管理,區分配多大空間:

首先提取測試環境:scott使用者,預設是users表空間,對應的區管理分配的大小:

ALLOCATION_TYPE=》system 方式,代表系統自動管理,next_extent空值,最小64K/8K=8個塊;

create table t1 as select * from emp;
select segment_name,extent_id,file_id,block_id,blocks from dba_extents where owner='SCOTT'
 and segment_name='T1';
SEGMENT_NAME     EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
--------------- ---------- ---------- ---------- ----------
T1                                          0          6       1648          8  ---雖然表中的資料儲存,沒有佔滿8個塊的區域,但是Oracle最少還是一起分配了一個區8個塊;
insert into t1 select * from t1; --增加資料
//////
480 rows created.測試

從第 十七個塊,開始,每次分配128個資料塊;

--測試環境查詢了一個1G左右的表,是匯入進去的,一個區存在;   blocks 8192個資料塊;
成倍增加;
 
ALLOCATION_TYPE=》uniform  代表extent的分配方式一致:

SQL> select tablespace_name,initial_extent,next_extent,min_extents ,max_extents from dba_tablespaces;

TABLESPA INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS

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

SYSTEM            16384       16384            1         505

SYSAUX            65536                             1  2147483645

TBS_DICT          40960       40960           1         505
ABC                    65536                            1  2147483645
YA                       65536                           1  2147483645
TBSA               1048576     1048576       1  2147483645

TEMPTS1         1048576     1048576           1

SQL> select 1048576/1024/1024 from dual;

1048576/1024/1024 -----------------                 1M

SQL> select 1048576/8192 from dual;  128個塊---

1048576/8192 ------------          128 

------------如上查詢,tempts1是建立資料庫預設選項next_extent對應的是1M大小,128個資料塊,Oracle為每個一個區分配一個固定的128個塊為單位的一個區;

 

SYSTEM=>USER: 代表可以控制next_extent的值:

SYSTEM   PERMANENT DICTIONARY USER      MANUAL

TBS_DICT PERMANENT DICTIONARY USER      MANUAL

--只要區的分配方式是資料字典管理,則區大小的分配就是user模式,代表可以自主分配;

資料字典,區大小分配方式;

SQL>  select 40960/8192 from dual;

40960/8192 ----------                   5           五個塊

SQL> select 40960/1024/1024 from dual;

40960/1024/1024 ---------------        .0390625      ---實際多大,給多大,是否

 

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

number four :

以上說的都是如何尋找空閒的區,用來分配,給一個區分配多大空間;

如今一個現實的問題擺在你面前,直接問你,我愛你你嫁不嫁我,咋整,直接;

我有一條資料,需要儲存,存在哪裡?如何尋找:

來走進塊的空閒區域管理:

段的空閒塊管理:segment free block management;

1.manual

2.auto

塊什麼是空閒? 塊分幾部分: 塊頭,儲存區域,空閒區域:一般空閒區域預留10%的區域;

1.manual=> segment header 段的前三個塊預設塊頭部,建立一個free list列表記錄空閒的塊;

使用空閒列表,獲取空閒塊,併發訪問free list ,其它insert事物處於等待狀態,在segment header block會經常出現buffer busy waits熱快事件,訪問序列,儲存滿了之後,移除列表;

 

2.auto  =》在segment bitmap標識上可用的空閒塊,0空閒1非空閒,支援併發訪問;

 

 

SQL> select TABLESPACE_NAME,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;

TABLESPA SEGMEN -------- ------

SYSTEM   MANUAL

SYSAUX   AUTO

 

SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSTEM'

SYSTEM SYS_LOB0000000474C00021$$ LOBSEGMENT                  1               1

 

SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSAUX'

SYSAUX           BSLN_TIMEGROUPS_PK             INDEX

------以上為查詢:

語言描述:當資料物件插入資料,假設為manual管理方式,pctfree=20,代表,資料塊空間儲存達到80%,資料塊將被移除空閒列表,隨著資料的刪除,當資料塊的使用百分比低於引數:pctused引數的設定時,加入空閒列表;空閒連結串列中,競爭壓力強大;ASSM管理

 

Auto Segment Space Management:

為了解決上述的問題,通過點陣圖有效快速解決儲存擴張和剩餘區塊free block:改善段的儲存管理;

ASSM管理模式下,insert 通過掃描點陣圖查詢可用的Block:

引數:pctfree還需要,但是低於此數值,也不會從點陣圖刪除,而是記錄狀態,可用為後續的update更改操作保留行資料增長預留使用;

PCTUSED引數,將被廢棄,不需要記錄使用百分比;

FREELIST  FREELIST GROUPS將無效;

新的管理方式使用點陣圖的機制對塊進行追蹤,沒個塊的大小,狀態使用了:>75%,50%-75%,25%-50%,<25%,四個狀態代替以前的pctused;

 

ASSM管理最大優勢,點陣圖減輕緩衝區等待,Buffer busy wait熱快的產生;

 



ORA-12913: 無法建立字典管理的表空間

jcq0>show user
USER 為"SYS"
jcq0>create tablespace dictionary_t
  2  datafile 'D:\Oracle\ORADATA\DB_NAMEX\dict.dbf' size 50M
  3  extent management dictionary
  4  default storage(initial 100k next 100k);
create tablespace dictionary_t
*
ERROR 位於第 1 行:
ORA-12913: 無法建立字典管理的表空間 


檢視錯誤解釋


ORA-12913 Cannot create dictionary managed tablespace


Cause: An attempt was made to create a dictionary managed tablespace in a database whose SYSTEM tablespace is locally managed.


Action: Create a locally managed tablespace.


該資訊告訴我們只能在SYSTEM表空間為字典管理時才能用以上語句建立字典管理的表空間


3.峰迴路轉


突然想到不是有個包可以在本地管理的表空間和字典管理的表空間之間遷移麼,之後找到該包


DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL
DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL


看來果然可以,於是馬上動手


jcq0>execute DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('TEST10');
BEGIN DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('TEST10'); END;


*
ERROR 位於第 1 行:
ORA-12914: 無法將表空間移植到字典管理的型別中
ORA-06512: 在"SYS.DBMS_SPACE_ADMIN", line 0
ORA-06512: 在line 1


ORA-12914 Cannot migrate tablespace to dictionary managed type


Cause: An attempt was made to migrate a locally managed tablespace to dictionary managed type when the database has a locally managed SYSTEM tablespace.


Action: Such an operation cannot be issued.


同樣的提示,所以先遷移SYSTEM表空間


jcq0>execute DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('SYSTEM');
BEGIN DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('SYSTEM'); END;


*
ERROR 位於第 1 行:
ORA-03251: 無法在 SYSTEM 表空間上提交此命令
ORA-06512: 在"SYS.DBMS_SPACE_ADMIN", line 0
ORA-06512: 在line 1


ORA-03251 Cannot issue this command on SYSTEM tablespace


Cause: It is not permitted to migrate SYSTEM tablespace from locally managed format to dictionarymanaged format or relocate bitmaps.


Action: Check the tablespace name and procedure name.


4.回到原點


翻到doc對該過程的說明可以得到同樣的解釋


The tablespace must be kept online and read/write during migration. Migration of temporarytablespaces and migration of SYSTEM tablespaces are not supported.


5.結論


 如果你想在SYSTEM為本地管理表空間的資料庫上建立字典管理的表空間,那麼答案是 no way!!!




Oracle的物理結構和邏輯結構的關係

Oracle不會直接操作底層作業系統的資料檔案,而是提供了一箇中間層,這個中間層就是Oracle的邏輯結構,它與作業系統的平臺無關,中間層(邏輯結構)到資料檔案(物理結構)的對映通過DBMS來完成。一個資料庫有一個或多個表空間,一個表空間有一個或多個段,一個段有一個或多個區間組成、一個區間由一個或多個資料庫塊組成、一個資料庫塊由一個或多個作業系統塊組成;一個表空間物理上由一個或多個資料檔案組成,一個資料檔案物理上由一個或多個作業系統塊組成。


表空間的分類

在一個資料庫中表空間的數量沒有嚴格的限制。有幾個表空間是Oracle資料庫必備的,它們是system,temporary,undo,user,oracle 10g以後還有sysaux表空間。

Oracle資料庫的表空間分為兩類:系統表空間和非系統表空間。


表空間的區間管理

表空間的管理其實就是分配可用區間和回收空閒區間的過程,Oracle提供了兩種表空間區間管理的方法,一種是資料字典管理、一種是本地管理。


資料字典管理方式是將每個表空間的使用情況記錄在資料字典表中,當分配或撤銷表空間區段的時,隱含使用SQL語句記錄當前表空間的使用情況,並在撤銷段中記錄以前區段的使用情況,這種操作方式增加了資料字典的頻繁操作,對於一個大型的資料庫系統,這樣的系統效率會非常的低下。


為了解決資料字典管理表空間效率不高的問題,Oracle設計讓每一個表空間自己管理表空間區段的分配,記錄區段的使用情況。在資料檔案頭中有一個區域用於儲存本地管理的表空間的資料檔案的空間資訊,將表空間中資料檔案的可用和已用空間資訊記錄下來。本地管理的方式使用點陣圖在資料檔案頭中記錄資料檔案的已用和可用資訊,點陣圖使用一個資料位表示一個資料塊或者一組資料庫塊的使用情況,而表空間的最小分配單位就是區段extent,一個區段由多個資料庫塊組成,所以當需要在表空間中增加新的物件時,就需要查詢點陣圖,看是否有一段連續的Oracle資料庫空閒。


表空間的建立

表空間的建立語法為:


CREATE [ BIGFILE | SMALLFILE ] [ TEMPORARY ] [ UNDO ] TABLESPACE tablespace name  //

DATAFILE datafile spec | TEMPORARY tempfile spec

[ MINIMUM EXTENT minimum extend size ]  //定義該表空間中最小中最小區段大小,這樣該表空間中的區段大小為最小值的整數倍

[ BLOCKSIZE blockszie ]

[ [ COMPRESS | NOCOMPRESS ] DEFAULT STORAGE (default storage clause) ]

[ LOGGING | NOLOGGING ]   //是否把該表空間中資料的變化記錄在重做日誌檔案中

[ FORCE LOGGING ]  

[ ONLINE | OFFLINE ]  //表空間建立後是否聯機

[ EXTENT MANAGEMENT DICTIONARY | LOCAL [ AUTOALLOCATE | UNIFORM SIZE size ] ]   //表空間的管理方式:資料字典管理或本地管理

[ SEGMENT SPACE MANAGEMENT MANUAL | AUTO ]

[ FLASHBACK ON | OFF ]

示例一:

SQL> create tablespace demotbs
  2  datafile '/u01/app/oracle/oradata/testdb/test01.dbf' size 10m;
Tablespace created.

示例二:

無法建立基於資料字典管理的表空間問題

SQL> create tablespace dic_management_tbs
  2  datafile '/u01/app/oracle/oradata/testdb/test02.dbf' size 10m
  3  extent management dictionary;
create tablespace dic_management_tbs
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace

原因是因為:如果系統表空間是基於本地管理的,則無法建立基於資料字典管理的表空間,看見基於資料字典管理表空間的方式已經成為歷史了。

SQL> select extent_management from dba_tablespaces where tablespace_name='SYSTEM';
EXTENT_MAN
----------
LOCAL








About Me

.............................................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

.............................................................................................................................................

● QQ群號:230161599(滿)、618766405

● 微信群:可加我微信,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友646634621,註明新增緣由

● 於 2018-04-01 06:00 ~ 2018-04-31 24:00 在魔都完成

● 最新修改時間:2018-04-01 06:00 ~ 2018-04-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

.............................................................................................................................................

小麥苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班http://blog.itpub.net/26736162/viewspace-2148098/

.............................................................................................................................................

使用微信客戶端掃描下面的二維碼來關注小麥苗的微信公眾號(xiaomaimiaolhr)及QQ群(DBA寶典),學習最實用的資料庫技術。

小麥苗的微信公眾號小麥苗的DBA寶典QQ群2《DBA筆試面寶典》讀者群小麥苗的微店

   小麥苗的微信公眾號      小麥苗的DBA寶典QQ群2     《DBA筆試面試寶典》讀者群       小麥苗的微店

.............................................................................................................................................

Oracle表空間的管理方式(LMT、DMT)--本地和字典管理
DBA筆試面試講解群
《DBA寶典》讀者群 歡迎與我聯絡



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

相關文章