Oracle 11g的Deferred Segment Creation

realkid4發表於2011-11-15

 

每個Oracle新版本,都會加入一些新特性功能。這些功能或大或小,代表設計者在資料庫管理系統不斷創新和嘗試的實踐方向。在11g中,我們能夠經常發現這些細小的改進。

 

本篇主要介紹Oracle 11g中推出的“延遲段建立”(Deferred Segment Creation)特性,以及當我們使用這種特性時,需要注意的問題。

 

1Deferred Segment Creation

 

Oracle中,“表(Tablespace)、段(Segment)、分割槽(Extent)和塊(Block)”是邏輯儲存結構的四個層次。對資料表而言,通常是由一個或者多個段物件(分割槽表)Segment組成。也就是說,在資料表建立的時刻,Oracle會建立一個資料段Segment物件與之對應。

 

Segment建立之後,Oracle空間管理機制會根據需要分配至少一個extent作為初始化。每個分割槽大小要根據不同Tablespace的配置。但是在11g之前,資料表的建立同時,就發生了空間Segment分配的過程。

 

但是在Oracle 11g中,引入了Deferred Segment Creation特性。

 

 

SQL> conn scott/tiger@ora11g;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as scott

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE     11.2.0.1.0       Production

 

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 – Production

 

 

此時,我們建立資料表T,並且建立索引Index物件。檢查資料字典,對應的資料庫物件也都已經確定建立。

 

 

SQL> create table t (id number);

Table created

 

SQL> create index idx_t_id on t(id);

Index created

 

 

但是,對應的段segment物件,卻沒有建立出來。

 

 

SQL> select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='T';

 

SEGMENT_NAME              BYTES     BLOCKS    EXTENTS

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

 

SQL> select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='IDX_T_ID';

 

SEGMENT_NAME              BYTES     BLOCKS    EXTENTS

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

 

 

這就是在Oracle 11g中引入的延遲段生成。一個資料表,如果剛剛建立出來的時候沒有資料加入。Oracle是不會為這個物件建立相應的段結構,也就不會分配對應的空間。

 

使用dbms_metadata抽取出資料表的DDL語句,可以發現端倪。

 

 

CREATE TABLE "SCOTT"."T"

   ( "ID" NUMBER

   ) SEGMENT CREATION DEFERRED

  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  TABLESPACE "USERS" ;

 

 

使用DDL語句抽取功能,可以獲取到建立資料表的所有語句引數,包括預設引數。其中,我們發現了一個在過去版本中沒有引數“SEGMENT CREATION DEFERRED”,該引數就表示在資料表建立中使用延遲段生成。

 

2Segment Creation

 

那麼,在什麼時點上Oracle才會建立物件呢?只要插入一條資料到資料表中,無論是否commit,都會伴隨著Oracle對資料表段的建立操作。

 

 

SQL> insert into t values (1);

1 row inserted

 

SQL> commit;

Commit complete

 

 

SQL> select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='T';

 

SEGMENT_NAME              BYTES     BLOCKS    EXTENTS

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

T                         65536          8          1

 

SQL>  select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='IDX_T_ID';

 

SEGMENT_NAME              BYTES     BLOCKS    EXTENTS

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

IDX_T_ID                  65536          8          1

 

 

Oracle推出Deferred Segment Creation的出發點很單純,就是出於物件空間節省的目的。如果一個空表從來就沒有使用過,建立segment物件,分配空間是“不合算”的,所以提出推遲段建立的時間點。

 

該功能的啟用在Oracle中是存在控制引數的。

 

 

SQL> show parameter deferred_segment_creation

 

NAME                                 TYPE        VALUE

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

deferred_segment_creation            boolean     TRUE

 

 

如果不希望使用該功能(畢竟儲存空間越來越廉價),可以修改該引數為false,就可以關閉該功能了。

 

3Deferred Segment Creationexp

 

延遲塊生成雖然可以起到空間節省作用,但是會引起很多意想不到的問題。其中一個最突出的就是Exp匯出時物件缺失問題。

 

Exp/Imp是很傳統的Oracle資料庫轉移備份工具。雖然在10之後出現資料泵進行替代,但是還是有很廣泛的使用者群。下面我們來實驗下Exp故障。

 

 

SQL> create table m (id number);

Table created

 

SQL> create index idx_m_id on m(id);

Index created

 

SQL> select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='M';

 

SEGMENT_NAME              BYTES     BLOCKS    EXTENTS

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

 

 

由於延遲段生成,雖然資料表M建立,但是沒有相應Segment結構生成。此時,我們使用EXP匯出DUMP檔案。

 

 

D:\>set nls_lang=american_america.al32utf8

D:\>exp system/oracle@ora11g file=D:\test.dmp indexes=y rows=n compress=y constr

aints=y wner=scott

 

Export: Release 10.2.0.1.0 - Production on Tue Nov 15 16:48:18 2011

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

 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Produc

tion

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

Export done in AL32UTF8 character set and AL16UTF16 NCHAR character set

Note: table data (rows) will not be exported

 

About to export specified users ...

.(篇幅原因,省略……

. about to export SCOTT's tables via Conventional Path ...

. . exporting table                           DEPT

. . exporting table                            EMP

. . exporting table                       SALGRADE

. . exporting table                              T

. exporting synonyms

. (篇幅原因,有省略……

Export terminated successfully without warnings.

 

 

Log中可以看出,匯出的資料表中並沒有資料表M。那麼,在匯入的結構和資料中,也自然沒有M資料表。

 

這就是很大的問題!筆者猜測,EXP工作的原理是根據Segment結構去獲取資料表資訊。由於M表沒有段結構,自然也就不能抽取到DUMP檔案中。

 

4Deferred Segment CreationEXDPD

 

EXP/IMPOracle早期提供的移植備份工具。從10g開始,Oracle提供了更為先進的資料泵(Data Dump)工具組。那麼,資料泵是否在延遲塊生成問題上出錯呢?我們進行如下實驗:

 

 

oracle@bspdev ~]$ expdp scott/tiger dumpfile=scott.dmp schemas=scott

 

Export: Release 11.2.0.1.0 - Production on Tue Nov 15 16:04:10 2011

 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

Starting "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/******** dumpfile=scott.dmp schemas=scott

Estimate in progress using BLOCKS method...

(篇幅原因,有省略……

Total estimation using BLOCKS method: 192 KB

Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

. . exported "SCOTT"."DEPT"                              5.937 KB       4 rows

. . exported "SCOTT"."EMP"                               8.570 KB      14 rows

. . exported "SCOTT"."SALGRADE"                          5.867 KB       5 rows

. . exported "SCOTT"."BONUS"                                 0 KB       0 rows

. . exported "SCOTT"."T"                                     0 KB       0 rows

Master table "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded

******************************************************************************

Dump file set for SCOTT.SYS_EXPORT_SCHEMA_01 is:

  /u01/app/admin/ora11g/dpdump/scott.dmp

Job "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully completed at 16:06:27

 

 

同樣沒有M表,說明資料泵使用下同樣存在匯出物件錯誤。

 

5、解決匯出問題

 

針對由於Deferred Segment Creation帶來的匯出工具故障,從網路上的資訊,主要有三種觀點。

 

ü        匯入前插入資料

 

Deferred Segment Creation特性上看,只要對資料表有插入insert的操作,無論是否提交,都會建立物件Segment。那麼,只需要用指令碼插入資料,就可以解決問題。

 

缺點:由於資料表各種約束的存在,可能難以做到快速資料插入回滾。

 

ü        禁用掉Deferred Segment Creation

 

很多人感覺Deferred Segment Creation是一種多餘的特性,弊大於利。所以可以在引數檔案System級別禁用掉該引數。

 

ü        強制分配空間

 

最後一種是普遍使用的一種策略,原理是:既然Oracle不會為一些資料表分配空間,就強制的進行空間分配即可。

 

---強制分配空間;

SQL> alter table m allocate extent;

Table altered

 

SQL> select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='M';

 

SEGMENT_NAME              BYTES     BLOCKS    EXTENTS

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

M                        131072         16          2

 

 

此時,再使用exp匯出,就可以了。

 

 

D:\>exp system/oracle@ora11g file=D:\test.dmp indexes=y rows=n compress=y constr

aints=y wner=scott

 

Export: Release 10.2.0.1.0 - Production on Tue Nov 15 16:51:31 2011

 

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

 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Produc

tion

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

Export done in AL32UTF8 character set and AL16UTF16 NCHAR character set

Note: table data (rows) will not be exported

(篇幅原因,省略……

. exporting cluster definitions

. about to export SCOTT's tables via Conventional Path ...

. . exporting table                           DEPT

. . exporting table                            EMP

. . exporting table                              M

. . exporting table                       SALGRADE

. . exporting table                              T

. exporting synonyms

. exporting views

. (篇幅原因,省略……

Export terminated successfully without warnings.

 

 

 

6、結論

 

Deferred Segment CreationOracle 11g的一種新特性。新的特性往往帶來一些意想不到的問題,熟悉這些問題和解決之道,能夠讓我們更上一層樓。

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

相關文章