有个应用联系我说他们在进行业务数据导入的时候提示表空间不足,于是他们问我该表空间是自动扩展的,为什么还会提示空间不足呢?
对于这个问题我自己也有2个疑问,
第一个是自动扩展为什么还会提示空间不足呢?
第二个是autoextend on 默认的next值是多少?
我做了以下的试验,USERS表空间下有1个数据文件,在对其开启了自动扩展以后,我们查看它的DDL语句发现NEXT值为8192,也就是说一次会扩展1个块8K的大小.
对于上面提到的问题,我还注意到maxsize值为10M,也就是说该文件虽说开启了自动扩展,但最大只能使用至10M,这也就是为什么会提示空间不足的真正原因,被maxsize值限制了,这个值默认是unlimited,这个10M可能是在创建表空间时指定的,所以第一个问题解答了。
SYS@em12c>set long 99999999
SYS@em12c>select dbms_metadata.get_ddl('TABLESPACE','&tbsname') from dual;
Enter value for tbsname: USERS
old 1: select dbms_metadata.get_ddl('TABLESPACE','&tbsname') from dual
new 1: select dbms_metadata.get_ddl('TABLESPACE','USERS') from dual
DBMS_METADATA.GET_DDL('TABLESPACE','USERS')
--------------------------------------------------------------------------------
CREATE TABLESPACE "USERS" DATAFILE
'/oracle/oradata/em12c/users01.dbf' SIZE 5242880
AUTOEXTEND ON NEXT 8192 MAXSIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
第二个问题,autoextend on 默认的next值是多少?上面5M的数据文件next值为8k,我们再看看其它数据文件的情况呢?
我测试环境下这个大小2G的数据文件next值为20M,另一个大小32G的数据文件next值为50M,这个值根据数据文件大小自动调整的吗?
DBMS_METADATA.GET_DDL('TABLESPACE','MGMT_ECM_DEPOT_TS')
--------------------------------------------------------------------------------
CREATE TABLESPACE "MGMT_ECM_DEPOT_TS" DATAFILE
'/oracle/oradata/em12c/mgmt_ecm_depot1.dbf' SIZE 20971520
AUTOEXTEND ON NEXT 20971520 MAXSIZE 32767M
...
DBMS_METADATA.GET_DDL('TABLESPACE','MGMT_TABLESPACE')
--------------------------------------------------------------------------------
CREATE TABLESPACE "MGMT_TABLESPACE" DATAFILE
'/oracle/oradata/em12c/mgmt.dbf' SIZE 209715200
AUTOEXTEND ON NEXT 52428800 MAXSIZE 32767M
...
我将这个数据文件用数据填充至2G大小,看看next是否变化,在不变插入数据时,可以看到很多等待事件是由于init file造成的,
说明在数据文件扩展很频繁时,过小的next size是很影响性能的。所以当我们看到很多等待在Data file init write事件的时候,
也说明autoextend on next值设置过小了。
*** 2016-10-12 12:14:13.221
WAIT #140465064598264: nam='Data file init write' ela= 4595 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653221043
WAIT #140465064598264: nam='Data file init write' ela= 4936 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653226491
WAIT #140465064598264: nam='Data file init write' ela= 7302 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653234144
WAIT #140465064598264: nam='Data file init write' ela= 3459 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653238035
WAIT #140465064598264: nam='Data file init write' ela= 4133 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653515536
WAIT #140465064598264: nam='Data file init write' ela= 4447 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653520532
WAIT #140465064598264: nam='Data file init write' ela= 3786 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653524725
WAIT #140465064598264: nam='Data file init write' ela= 3239 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653528313
WAIT #140465064598264: nam='Data file init write' ela= 8088 count=1 intr=256 timeout=4294967295 obj#=-1 tim=1476245653536716
--这里可以看到数据文件已经自动扩展到4G大小了,但是next值一直是8k,没有变化。
Name Type Managment Files Size(M) Used(M) Free(M) used(%)
------------------------------ --------- ---------- ---------- ---------- ---------- ---------- ----------
USERS PERMANENT LOCAL 1 3617.1 3585 32.1 99.11
SYS@em12c>select dbms_metadata.get_ddl('TABLESPACE','&tbsname') from dual;
Enter value for tbsname: USERS
old 1: select dbms_metadata.get_ddl('TABLESPACE','&tbsname') from dual
new 1: select dbms_metadata.get_ddl('TABLESPACE','USERS') from dual
DBMS_METADATA.GET_DDL('TABLESPACE','USERS')
--------------------------------------------------------------------------------
CREATE TABLESPACE "USERS" DATAFILE
'/oracle/oradata/em12c/users01.dbf' SIZE 5242880
AUTOEXTEND ON NEXT 8192 MAXSIZE 15360M
...
后续当数据文件扩展至8G大小时next值一直是8k,没有变化。
我又在ASM下和Exadata平台下进行了一个简单的测试,发现在ASM平台下autoextend on next默认值是10M,而在我的Exadata X4的ASM平台下发现autoextend on next默认值是100M,看来这是oracle针对不同平台作了优化。
所以我认为第二个问题的答案是不同的平台,autoextend on next默认值是不同的,ASM平台下已经做了优化。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26753337/viewspace-2126175/
,如需转载,请注明出处,否则将追究法律责任。