一、原因概述
和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';
3 查看是否为SecureFiles
导出时进行下面语句查询
SELECT *
FROM dba_lobs t
WHERE t.table_name LIKE '%SYS_EXPORT%'
AND t.owner = 'INTERFACE';
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;
其中:
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;
三、解决方案
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/oracle@dmpdb 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(到数据字典时,这个值为SYSTEM)而不是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
/