Oracle 11g的Deferred Segment Creation
每個Oracle新版本,都會加入一些新特性功能。這些功能或大或小,代表設計者在資料庫管理系統不斷創新和嘗試的實踐方向。在11g中,我們能夠經常發現這些細小的改進。
本篇主要介紹Oracle 11g中推出的“延遲段建立”(Deferred Segment Creation)特性,以及當我們使用這種特性時,需要注意的問題。
1、Deferred 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”,該引數就表示在資料表建立中使用延遲段生成。
2、Segment 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,就可以關閉該功能了。
3、Deferred Segment Creation與exp
延遲塊生成雖然可以起到空間節省作用,但是會引起很多意想不到的問題。其中一個最突出的就是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檔案中。
4、Deferred Segment Creation與EXDPD
EXP/IMP是Oracle早期提供的移植備份工具。從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 Creation是Oracle 11g的一種新特性。新的特性往往帶來一些意想不到的問題,熟悉這些問題和解決之道,能夠讓我們更上一層樓。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-711008/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 11g deferred_segment_creation段延遲建立Oracle
- 【Deferred Segment Creation】Oracle 11g新特性-延期建立段Oracle
- 我嘞個去,11G新特性deferred_segment_creation
- 11GR2的新特性Deferred Segment Creation
- 【延遲段建立】Oracle 11gR2的延遲段建立(deferred segment creation)特性Oracle
- [20131109]deferred segment creation與12c的exp命令.txt
- Oracle Undo SegmentOracle
- [Oracle Script] Rollback Segment UsageOracle
- Oracle Segment AdvisorOracle
- Oracle-Segment space managementOracle
- ORACLE LOB SEGMENT常規管理Oracle
- How to Shrink Undo Segment In Oracle DatabaseOracleDatabase
- oracle addm segment tuningOracle
- oracle 10g physical standby database creationOracle 10gDatabase
- oracle 11g不同會話產生的事務會使用相同的undo segment嗎--undo系列之一Oracle會話
- jQuery 的deferred物件jQuery物件
- oracle 10g logical standby db creationOracle 10g
- Specifying Oracle-Managed Files at Database Creation (76)OracleDatabase
- jQuery DeferredjQuery
- oracle實用sql(8)--segment show spaceOracleSQL
- oracle segment space management and extent management幾則Oracle
- jQuery的Deferred物件概述jQuery物件
- manual database creation for oracle10g on solaris10DatabaseOracle
- oracle concept——data block,extent,segment-01OracleBloC
- oracle實用sql(2)--segment advisorOracleSQL
- Unity的Deferred ShadingUnity
- jQuery的deferred物件詳解jQuery物件
- Oracle佇列鎖enq:TS,Temporary Segment (also TableSpace)Oracle佇列ENQ
- deferred中done和then的區別
- 約束的DEFERRABLE and DEFERRED特性
- Run Repository Creation Utility (RCU) for Oracle Identity Management componentsOracleIDE
- block/extent/segment的理解BloC
- 水煮oracle33---關於oracle中segment、schema和user區別Oracle
- [20190917]oracle引數deferred屬性.txtOracle
- oracle 11g中的 oracle restart特性OracleREST
- Oracle OCP IZ0-053 Q432(Segment Shrink)Oracle
- jQuery中的Deferred詳解和使用jQuery
- Deferred Constraint CheckAI