EXPDP报错:ORA-60019 creating initial extent of size 14 in tablespace of extent size 8

一、原因概述

EXPDP报错:ORA-60019 creating initial extent of size 14 in tablespace of extent size 8

       和SecureFiles新的LOB架构相关。11g之前叫BasicFiles。在11g如果不特别指定,默认是会创建成BasicFiles LOB。但是在12c之后,LOB列在ASSM管理的表空间。默认都会创建成SecureFiles。

        也就是DB_SECUREFILE初始化参数,在11g时,默认为PERMITTED:允许创建SecureFileLOB,而到12c之后,默认为PREFERRED:所有大对象创建为securefiles,除非指定BASICFILE

【引申

               DB_SECUREFILE参数有效值,还有

               ALWAYS :尝试将ASSM表空间上的所有LOB创建为SecureFile LOB,但是仅可将自动段空间管理(ASSM)表空间外的任何LOB创建为BasicFile LOB

               FORCE:强制将所有LOB创建为SecureFileLOB

               NEVER:禁止创建SecureFiles

               IGNORE:禁止创建SecureFiles,并忽略使用SecureFiles选项强制创建BasicFiles而导致的任何错误】

        报错这个环境的版本为 12c,默认都会创建成SecureFiles。而SecureFiles最少需要14个block_size。

    如果导出用户的默认表空间对应的initial_extent <= 14 个block 就会报错。

 

二、具体环境情况

1 当前数据库版本

SELECT * FROM V$VERSION;

 

2 导出时是否创建LOB字段

导出时进行下面语句查询

SELECT * FROM DBA_Tab_Columns t WHERE t.DATA_TYPE LIKE '%LOB%' AND T.OWNER = 'INTERFACE';

EXPDP报错:ORA-60019 creating initial extent of size 14 in tablespace of extent size 8

 

3 查看是否为SecureFiles

导出时进行下面语句查询

SELECT *
  FROM dba_lobs t
 WHERE t.table_name LIKE '%SYS_EXPORT%'
   AND t.owner = 'INTERFACE';

EXPDP报错:ORA-60019 creating initial extent of size 14 in tablespace of extent size 8

4 表空间情况


SELECT t.initial_extent / 1024 init_extent_kb,
       t.initial_extent / 1024 / 8 "?个BLOCK",
       t.block_size / 1024 block_size_kb,
       t.min_extents,
       t.allocation_type,
       t.segment_space_management, --段空间管理:只有auto时才可以创建securefile lobs,导入时创建的SYS_EXPORT开头的表会涉及
       t.*
  FROM dba_tablespaces t
 ORDER BY t.tablespace_name;

EXPDP报错:ORA-60019 creating initial extent of size 14 in tablespace of extent size 8

其中:

allocation_type的值含义
SYSTEM    自动分配,segment为自动管理时,允许不一样size的extent
UNIFROM    自动分配,但是·extent大小一致,为初始值
USER    用户指定

【创建表空间语句:

DROP TABLESPACE TBS_TEST_ZHONGXINBANK INCLUDING CONTENTS and datafiles;
CREATE TABLESPACE TBS_TEST_ZHONGXINBANK
DATAFILE
    '/oracle/oradata/dmpdb/TBS_TEST_ZHONGXINBANK.dbf'
    SIZE 10M
  AUTOEXTEND ON NEXT  10M MAXSIZE UNLIMITED
     LOGGING
    EXTENT MANAGEMENT
        LOCAL
            UNIFORM
                SIZE 64K
/

修改用户默认表空间:

ALTER USER interface  DEFAULT TABLESPACE TBS_TEST_ZHONGXINBANK;

 

 

5 用户默认表空间情况

SELECT * FROM dba_users;

EXPDP报错:ORA-60019 creating initial extent of size 14 in tablespace of extent size 8

 

三、解决方案

 

1 方案1

    调整DB_SECUREFILE初始化参数

    ALTER system set db_securefile='NEVER';

    再进行导出。

    导出完成后,根据DBA的建议,选择是否恢复这个参数。

     ALTER system set db_securefile='PREFERRED';

2 方案2

    因为SYSTEM表空间的段空间管理为MANUAL,并且SYSTEM用户的默认表空间为SYSTEM,如果客户愿意提供SYSTEM用户的使用权限,使用SYSTEM用户进行导出即可。

     expdp system/[email protected] directory=ORABAK content=all schemas=interface,security,trade,ulog,clear dumpfile=all.dmp LOGFILE=expdp_all.log;

 

3 方案3

    专门建一个符合要求的表空间,并将导出用户的默认表空间设置为此表空间,进行导出,导出完成后再改回来,并删除这个表空间。

    需要符合的要求,以下选一即可:

(1)initial_extent的大小设定为>14 * bolck_size

(2)allocation_type参数指定为 AUTOALLOCATE而不是UNIFORM

(3)segment_space_management参数指定为MANUAL

    

   

 

四、引申

     如果导入也有类似问题,并且导入环境的数据库版本是12c及以上,

      最好,建表空间时,将定制表空间的initial_extent的大小设定为>14 * bolck_size,而不是修改初始化参数 db_securefile。

    或者,创建的定制表空间,allocation_type参数指定为 AUTOALLOCATE而不是UNIFORM

    参考如下:

DROP TABLESPACE TBS_TEST_ZHONGXINBANK INCLUDING CONTENTS and datafiles;
CREATE TABLESPACE TBS_TEST_ZHONGXINBANK
DATAFILE
    '/oracle/oradata/dmpdb/TBS_TEST_ZHONGXINBANK.dbf'
    SIZE 10M
  AUTOEXTEND ON NEXT  10M MAXSIZE UNLIMITED
     LOGGING
    EXTENT MANAGEMENT
        LOCAL
            AUTOALLOCATE
/

       或者,创建的定制表空间,segment_space_management参数指定为MANUAL,不建议这么做。

参考如下:

DROP TABLESPACE TBS_TEST_ZHONGXINBANK INCLUDING CONTENTS and datafiles;
CREATE TABLESPACE TBS_TEST_ZHONGXINBANK
DATAFILE
    '/oracle/oradata/dmpdb/TBS_TEST_ZHONGXINBANK.dbf'
    SIZE 10M
  AUTOEXTEND ON NEXT  10M MAXSIZE UNLIMITED
     LOGGING
    EXTENT MANAGEMENT
        LOCAL
            UNIFORM
                SIZE 64K
  SEGMENT SPACE MANAGEMENT MANUAL
/