每个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/ ,如需转载,请注明出处,否则将追究法律责任。