oracle自动拓展表空间问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle自动拓展表空间问题相关的知识,希望对你有一定的参考价值。
比如我执行 create tablespace A datafile '/u01/app/gg.dbf' size 100m autoextend on;
这个autoextend on是自动扩展的意思吧?
问题是我没有指定最大扩展到多少也没有指定如何扩展,系统会如何处理这个表空间的增长呢?
如果你建的是个bigfile的tablespace,则这个tablespace只能有这一个数据文件,它最大可以扩展到4G个db_block_size
详细参考官方文档:Oracle® Database Reference -> Database Limits追问
回答的真好 ,再问一下,
我没有设置一次扩展多少,这个系统会怎么设置?有什么参数吗
看你建表空间时指定的extent management 设置 的是uniform还是autoallocate,如果是uniform每扩展一个extent就按uniform设置的尺寸,如果是设置autoallocate就由oracle决定extents大小,开始时是8个块,segment到一定大小时扩展的extents会变化
参考技术A extents指每次扩展空间的增加量.autoext指允许自动扩展到的表空间总容量
autoextend是YES的话,允许表空间使用量在达到设定值时进行扩展,一般到90%就必须进行扩展表空间了,不可能到达100%再扩展,为OFF的话就表示不允许扩展.追问
扩展到什么时候是个头啊?
追答.
参考技术B 在系统允许内一直增长,系统不允许了执行报错如何排查Oracle表空间不足问题
给业务采集数据的过程中,执行脚本报错,Ora-01652:unable to extend temp segment by 128 in tablespace TEMP。
查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段。
这种问题一般有两种原因:
一是临时表空间空间太小,二是不能自动扩展。
分析过程:
temp表空间主要是用作需要排序的操作。
1.临时表空间 是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据)每个用户都有一个临时表空间。
2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理。
3.分配用户单独临时表空间,一般是针对大型产品数据库,OLTP数据库,数据库仓库对于小型产品不需要单独制定临时表空间,使用默认临时表空间。
正常情况下,一个sql执行之后,返回结果后系统会自动收回分配给这个用户的空间。以便可以把此部分空间再分配给其他用户。
2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理。
3.分配用户单独临时表空间,一般是针对大型产品数据库,OLTP数据库,数据库仓库对于小型产品不需要单独制定临时表空间,使用默认临时表空间。
正常情况下,一个sql执行之后,返回结果后系统会自动收回分配给这个用户的空间。以便可以把此部分空间再分配给其他用户。
查看临时表空间信息:
select * from dba_tablespaces;
select * from dba_temp_files;
select * from v$tempfile
select * from dba_temp_files;
select * from v$tempfile
看一个执行计划的例子:
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost |
| 0 | SELECT STATEMENT | | 9023K| 9130M| | 3579K|
| 1 | SORT ORDER BY | | 9023K| 9130M| 19G| 3579K|
|* 2 | HASH JOIN | | 9023K| 9130M| | 439 |
| 3 | TABLE ACCESS FULL | ENROL_EXAMINEE | 15146 | 310K| | 231 |
|* 4 | TABLE ACCESS BY INDEX ROWID| ENROL_EXAMINEE | 596 | 591K| | 2 |
| 5 | NESTED LOOPS | | 4171 | 4236K| | 170 |
| 6 | TABLE ACCESS FULL | BASE_SPECIALITY | 84 | 2016 | | 2 |
|* 7 | INDEX RANGE SCAN | EXAMINEE_DEFAULTSPEC_INDEX | 202 | | | 1 |
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost |
| 0 | SELECT STATEMENT | | 9023K| 9130M| | 3579K|
| 1 | SORT ORDER BY | | 9023K| 9130M| 19G| 3579K|
|* 2 | HASH JOIN | | 9023K| 9130M| | 439 |
| 3 | TABLE ACCESS FULL | ENROL_EXAMINEE | 15146 | 310K| | 231 |
|* 4 | TABLE ACCESS BY INDEX ROWID| ENROL_EXAMINEE | 596 | 591K| | 2 |
| 5 | NESTED LOOPS | | 4171 | 4236K| | 170 |
| 6 | TABLE ACCESS FULL | BASE_SPECIALITY | 84 | 2016 | | 2 |
|* 7 | INDEX RANGE SCAN | EXAMINEE_DEFAULTSPEC_INDEX | 202 | | | 1 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
---------------------------------------------------
由上面的执行计划可以看出,临时表空间已经扩展到了19G。这会把临时表空间全部吃掉。
如果再进行排序、分组等操作,会更加消耗资源,这时应该从sql语句本身来找问题。
总结,这种报错,90%以上的概率是执行计划太差导致的,重点检查脚本性能
以上是关于oracle自动拓展表空间问题的主要内容,如果未能解决你的问题,请参考以下文章