解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
昨天开发人员跟我说,执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段。这种问题一般有两种原因:一是临时表空间空间太小,二是不能自动扩展。
2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理。
3.分配用户单独临时表空间,一般是针对 大型产品数据库,OLTP数据库,数据库仓库对于小型产品不需要单独制定临时表空间,使用默认临时表空间。
正常情况下,一个sql执行之后,返回结果后系统会自动收回分配给这个用户的空间。以便可以把此部分空间再分配给其他用户。
select * from dba_temp_files;
select * from v$tempfile
a.ISUPCOLLEGELINE, a.ISMAYJOINRETRIAL, a.JOINRETRIALGIST, a.JOINRETRIALBAK, a.TEMPERSIGN,
a.RECRUITSTUDENTTYPE, a.MATRICULATEGIST, a.ISNOTICEEXAMINEE, a.AFTERHANDLEDEP, a.TUITION,
a.KSBH, a.BH, a.XXB, a.BMDDM, a.BMDMC,
a.BMH, a.XM, a.XMPY, a.ZJLX, a.ZJLXMC,
a.ZJHM, a.CSRQ, a.MZM, a.MZ, a.XBM,
a.XB, a.HFM, a.HF, a.ZZMMM, a.ZZMM,
a.HKSZSSM, a.HKSZSSMC, a.HKSZDXXDZ, a.CSDSSM, a.CSDSSMC,
a.CSDXXDZ, a.XXGZDW, a.TXDZ, a.YZBM, a.LXDH,
a.DZXX, a.BYNY, a.XLM, a.XL, a.XWM,
a.XW, a.KSLYM, a.KSLY, a.KSFSM, a.KSFS,
a.BKLBM, a.BKLB, a.DASZDWSSM, a.DASZDWSSMC, a.DASZDW,
a.DASZDWDZ, a.DASZDWYZBM, a.XXGZJL, a.BYXX, a.BYXX1,
a.BYXX2, a.BYXX3, a.BYXX4, a.JL, a.JTCY,
a.BYDW, a.BYDWM, a.BYZYDM, a.BYZYMC, '0'||a.DWDM DWDM,
a.DWMC, a.TJDWDM, a.TJDWMC, a.ZYDM, a.ZYMC,
a.YXSM, a.YXSMC, a.YJFXM, a.YJFX, a.DSXM,
a.ZZLLM, a.ZZLLMC, a.WGYM, a.WGYMC, a.YWK1M,
a.YWK1MC, a.YWK2M, a.YWK2MC, a.YWK3M, a.YWK3MC,
a.XYJRM, a.XYJR, a.JFBZ, a.ZXBZ, a.BMSJ,
a.BYXXBZ, a.SFZH, a.BYND, a.KSDW, a.DWSZSSM,
a.DWSZSSMC, a.ZZLL, a.WGY, a.YWK1, a.YWK2,
a.YWK3, a.ZF, (NVL(a.fscj,0)) FSCJ, a.LQLBM, a.LQLB,
a.DXWPDW, a.PG, a.PGBZ, a.BZ, a.WDDWLM,
a.WDDWL, a.JFLY, a.LQQK, a.BLDW, a.NRXNY,
a.LQND, a.BZ1, a.BZ2, a.KCH, a.KCDD,
a.ZWH,a.ZPPATH, a.XH, a.BKZYM, a.BKZY,
a.XVH,a.DY6FLAG, a.BXYWK1MC, a.BXYWK2MC, a.BXYWK3MC,
a.QKBZ1, a.QKBZ2, a.QKBZ3, a.QKBZ4, a.QKBZ5,
a.SSMZLQ, a.KSQK, a.JGM, a.JGS, a.JGSX,
a.NLDM, a.NL, a.DXZYM, a.DXZY, a.HKSZDSX,
a.DQDM, a.YDWYB, a.BRTXZ, a.GZDWZ, a.YDWLM,
a.DWLB, a.BRYB, a.BRDH, a.JTDWM, a.GL,
a.TSLB, a.TSLBM, a.XXFSM, a.XXFS, a.LQZYM,
LQZY, ZPCJ, DSXHMH1, DSXHMH2, DSXHMH3,
a.DSXHMH4, a.SZSSM, a.ZXJH, a.ZXJHBZ, a.BLZGNX,
BLZG, BLZG1, BLZBZ, JS1MC, JS1CJ,
a.JS2MC, a.JS2CJ, a.SSMZ, a.SSMZBZ, a.DXWPSSM,
a.DXWPSS, a.LQXSM, a.LQXSMC, a.LQDSM, a.LQDSXM,
a.LQYJFXM, a.LQYJFXMC, a.HANDLERESULT, a.XLZSBH, a.XWZSBH,
a.LQYJFXID, a.XXXS,nvl2(a.reexam , ROUND(GYZF),(zf * ( 1- 0.3))) GYZF,a.GYFS, a.GYCS,
b.reexam ,a.SPECIALITYNO,a.SPECIALITYNAME,
(
SELECT STUDENTTYPE FROM CODE_STUDENTTYPE
WHERE STUDENTTYPECODE=A.recruitstudenttype ) STUDENTTYPE,
(SELECT collegename FROM ENROL_COLLEGEINFO) FSDWMC,
(SELECT collegecode FROM ENROL_COLLEGEINFO) FSDWDM,
(CASE WHEN a.handleresult='已录取' THEN '1' ELSE '0' END ) nlq,'' HKSZDM
FROM
( SELECT X.*, Y.SPECIALITYNO,Y.SPECIALITYNAME FROM ENROL_EXAMINEE X, BASE_SPECIALITY Y WHERE X.DEFAULTRECRUITSPEC=Y.SPECSTANDCODE AND x.CONTROLDEPARTMENT IS NOT NULL ) A
,(SELECT taskid,reexam FROM ENROL_EXAMINEE) b WHERE a.taskid=b.taskid
ORDER BY A.KSBH ASC
SQL> set serveroutput on
SQL> exec show_space('ENROL_EXAMINEE','AUTO');
Total Blocks............................2432
Total Bytes.............................19922944
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................11
Last Used Ext BlockId...................301576
Last Used Block.........................128
----------------------------------------------------------------------------------------------------
| 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 |
--------------------------------------------------------------------------------
---------------------------------------------------
2 - access("SYS_ALIAS_1"."TASKID"="ENROL_EXAMINEE"."TASKID")
4 - filter("SYS_ALIAS_1"."CONTROLDEPARTMENT" IS NOT NULL)
7 - access("SYS_ALIAS_1"."DEFAULTRECRUITSPEC"="Y"."SPECSTANDCODE")
--------------------------------------------------------------------------------
filter("SYS_ALIAS_1"."DEFAULTRECRUITSPEC" IS NOT NULL)
Note: cpu costing is off
那个sql语句基表大约有15000,而且涉及将近100个字段,最后还有一个非常耗费资源的排序操作。去掉那个order by 查看记录的返回数。
发现返回的记录数为26950729。这对我们数据库的硬件配置来说是一个很大数量级的数据,而且字段有非常多,所以占用既定的temp表空间的之后还不停的扩展,如果没有设置自动扩展,必然导致无法分配temp段。所以那个问题的产生就是必然的啦。现在追究为什么基表只有15000多条,而查询结构却是26950729条,所以怀疑是sql语句中存在cartesian,于是开始从业务需求来分析这个语句,果然是将最后一个(SELECT taskid,reexam FROM ENROL_EXAMINEE) b 中的基表应该是enrol_task而不是enrol_examinee,因为会产生两个表同个taskid来连接,而每个taskid下有很多学生,这就导致产生了一个庞大的cartesian乘积。最终导致对26950729条记录的排序而使临时表空间用尽。(此时没有自动扩展)将b结果集中ENROL_EXAMINEE用ENROL_TASK来替换,即使还有一个排序,结果也会在很短的时间内返回。
1、sql语句完成之后,需要检查记录的准确性。
2、尽量不要在视图中进行order by ,这是一个非常耗费资源的操作。
ORA-01652:unable to extend temp segment by num in tablespace name
产生原因:ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象。
解决方法:我们知道由于ORACLE将表空间作为逻辑结构-单元,而表空间的物理结构是数据文件,数据文件在磁盘上物理地创建,表空间的所有对象也存在于磁盘上,为了给表空间增加空间,就必须增加数据文件。先查看一下指定表空间的可用空间,使用视图SYS.DBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小:
SQL>Select file_id,block_id,blocks,bytes from sys.dba_free_space where tablespace_name=’’;
返回的信息可初步确定可用空间的最大块,看一下它是否小于错误信息中提到的尺寸,再查看一下缺省的表空间参数:
SQL>SELECT INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASE FROM SYS.DBA_TABLESPACES WHERE TABLESPACE_NAME=name;
通过下面的SQL命令修改临时段表空间的缺省存储值:
SQL>ALTER TABLESPACE name DEFAULT STORAGE (INITIAL XXX NEXT YYY);
适当增大缺省值的大小有可能解决出现的错误问题,也可以通过修改用户的临时表空间大小来解决这个问题:
SQL>ALTER USER username TEMPORARY TABLESPACE new_tablespace_name;
使用ALTER TABLESPACE命令,一但完成,所增加的空间就可使用,无需退出数据库或使表空间脱机,但要注意,一旦添加了数据文件,就不能再删除它,若要删除,就要删除表空间。
一个报错例子如下:
ORA-1652:unable to extend temp segment by 207381 in tablespace TEMPSPACE
相应的英文如下:
Cause: Failed to allocate extent for temp segment in tablespace
Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace or create the object in another tablespace.
补充:
重建Temp表空间
- startup --启动数据库
- create temporary tablespace TEMP2 TEMPFILE '/home2/oracle/oradata/sysmon/temp02.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --创建中转临时表空间
- alter database default temporary tablespace temp2; --改变缺省临时表空间 为刚刚创建的新临时表空间temp2
- drop tablespace temp including contents and datafiles;--删除原来临时表空间
- create temporary tablespace TEMP TEMPFILE '/home2/oracle/oradata/sysmon/temp01.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --重新创建临时表空间
- alter database default temporary tablespace temp; --重置缺省临时表空间为新建的temp表空间
- drop tablespace temp2 including contents and datafiles;--删除中转用临时表空间
- alter user roll temporary tablespace temp; --重新指定用户表空间为重建的临时表空间
解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程的更多相关文章
- 如何在oracle中缩小临时表空间?ORA-01652无法在表空间中扩展temp
查询临时表空间有多大: SQL> SELECT tablespace_name, file_name, bytes FROM dba_temp_files WHERE tablespace_na ...
- ora-01652无法通过128(在temp表空间中)扩展temp段
有两种错误:1.数据表空间不足 2.临时表空间不足 有两种原因:一是临时表空间空间太小,二是不能自动扩展. 分析过程: 既然是temp表空间有问题,那当然就要从temp表空间说起啦.首先要说明的 ...
- Oracle 临时表空间 temp表空间切换
一.TEMP表空间 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当oracle里需要用到sort的时候,PGA中sort_ar ...
- ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法
ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53) 今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...
- 解决ora-01652无法通过128(在表空间temp中)扩展temp段
问题描述: 今天建索引的时候报:ora-01652无法通过128(在表空间temp中)扩展temp段 1.查看表空间是自动增长,且建表空间时是没有设表空间最大值的. 2.查看了一下表空间剩余多少竟然只 ...
- ora-01652无法通过128(在表空间temp中)扩展temp段
今天提交请求后,提示ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段.最后通过ALTER DATABASE TEMPFILE '/*/*/db/apps_st/d ...
- ORA-01652:无法通过128(在表空间TEMP中)扩展temp段
在Oracle数据库中进行order by or group by.索引的创建和重创建.distinct操作.union & intersect & minus sort-merge ...
- ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段(EXP-00056: 遇到 ORACLE 错误 1652 ORA-01652: unable to extend temp segment by 128 in tablespace TEMP)
数据库报 ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段 两种解决方式: 第一种) sql>select * from v$tempfile; 发现tem ...
- ORA-01652: 无法通过 128 (在表空间 HIS_TABLESPACE_TEMP 中) 扩展 temp 段
前言:采用jmeter进行压力测试,大概向oracle 添加了140W条数据. 结果系统涉及到该表的业务都异常卡.访问阿里巴巴的那个druid monitor,因为系统中集成了,查看sql监控中的sq ...
随机推荐
- python基础02 基本数据类型
摘要:简单的数据类型以及赋值 变量不需要声明 python的变量不需要声明,你可以直接输入: >>>a = 10 那么你的内存里就有了一个变量a, 它的值是10,它的类型是integ ...
- Linux内核补丁批量自动下载工具
Linux kernel官网cgit工具不支持按变更代码进行补丁搜索,想到个办法就是把补丁都抓下来,这样可以在本地搜索.花了2个小时写了个小工具,话不多说,直接看效果: E:\docs\TOOLS\p ...
- requirejs 打包 添加版本号收集资料 待测试
https://www.npmjs.org/package/rjs-optimhttps://www.npmjs.org/package/grunt-requirejs-md5指定js版本号 但不是M ...
- Object-C 1.0 第三章:面向对象编程基础知识(OOP)
1. 间接(indirection) 1.1 变量和间接(使用变量来代替一些数字) 1.2 使用文件名的间接 const 表示一个变量不允许 ...
- Python微信-- 分享接口(分享到朋友圈、朋友、空间)
生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...
- Android应用-听听
听听是一款记歌词音乐播放器android应用. 功能特点:1.搜索网络歌词.2.本地音乐分类播放.3.离线保存网络歌词.4.页面整洁干净,风格清新. 下载APP 屏幕截图:
- 【系统篇】从int 3探索Windows应用程序调试原理
探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...
- PHP 小数点保留两位【转】
最近在做统计这一块内容,接触关于数字的数据比较多, 用到了三个函数来是 数字保留小数后 N 位: 接下来简单的介绍一下三个函数: 1.number_format echo number_format( ...
- dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)
dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...
- 使用THINKPHP中的控制器和模块查询数据库
1,自定义一个UserController的控制器,导入tp的控制器与模块执行相应的操作. ----var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值. ...