ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle 11g的Deferred Segment Creation

Oracle 11g的Deferred Segment Creation

原创 Linux操作系统 作者:realkid4 时间:2011-11-15 21:38:23 2 删除 编辑

 

每个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博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-711008/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    8041169