(17)管好临时表空间

浏览:
字体:
发布时间:2013-12-15 22:19:03
来源:

临时表空间的管理是个不大不小的事,如果你不理它,你会发现它好像忽然间就上几十G了,而且还在增长,弄得磁盘空间很紧张。而且你扩容后,还是会发现使用率经常是100%.所以有必要说一下这种表空间的一些事情。 从几方面说: 一. 临时表空间的用途 二. 常出现的问题及处理方法 三. 一些建议及好用的特性,如临时表空间组

(一)临时表空间的用途 临时表空间主要用于排序和缓存临时的数据。下面列几个常用的. 1. 排序、分组 order by or group by 2. distinct 3. 集合运算 union & intersect & minus 4. Analyze操作 5. 还一种是发生异常时,也会放入临时表空间,让其暴涨。 上面这些,大部份都是比较大型的操作,在内存在完成不了,所以会放到临时表空间中。而临时表空间比较特殊,它使用的临时段在被分配使用后,并不能被其它用户或查询重用,此空间不再被回收,造成只能不断的使用新空间。而上面列得情况中,像排序之类是经常性的,所以空间占用涨得很快。不过它在数据库关闭重启后是能自动释放的。但哪能经常重启库,所以不实用。

(二)常出现的问题及处理方法 1. 现在的临时表空间不够了,而自动扩展没有开。会报ORA-1652 unable to extend temp segment 这里有个小问题,有人可能会问,我已经开得很大了,怎么还不够呢? 原因是,很多时候一个临时表空间不是一个sql再用,而是用多个,其中一个大的点了99%,另一个sql执行就会报这个错了。 已经报ORA-1652的情况下,11g以前的方法是,扩容原来的表空间或联机删除并重新创建临时表,11g以后能用收缩表空间的方式来做。 方法一: 扩容
a. 查出现有临时表信息 select t.bytes/1024/1024 as "total(MB)", t.* from dba_temp_files t ; b. 重置大小 alter database tempfile 'C:/ORACLE/ORADATA/XCLDB/TEMP01.DBF'resize 2G;

方法二: 删除并重新创建临时表空间 a. 查出现有临时表信息 select t.bytes/1024/1024 as "total(MB)",
t.user_bytes/1024/1024 as "used(MB)",
t.* from dba_temp_files t;
b. 创建一个新的临时表空间 create temporary tablespace TMP02_USR empfile 'C:/ORACLE/ORADATA/XCLDB/TMP02_USR .DBF' size 10m reuse autoextend on next 1m maxsize unlimited; c. 将用户的临时表空间换为这个新的 alter user 用户名 temporary tablespace TMP02_USR; --如果你使用的系统默认的临时表空间,则要用下面的命令更换表空间 alter database default temporary tablespace TMP02_USR; d.连文件删除原来的临时表空间 drop tablespace 表空间名 including contents and datafiles cascade constraints; 小技巧: 如果原来的这个临时表空间还有用户在使用,是删除不了的,这时可以通过下面SQL查出来还有谁在使用:
SELECT se.username, se.SID, se.serial#, se.sql_address, se.machine, se.program, su.TABLESPACE,
su.segtype, su.CONTENTS FROM v$session se, v$sort_usage su
WHERE se.saddr = su.session_addr
  and tablespace= '原来的临时表空间名';再用 alter system kill session 'sid,serial@inst#';去kill掉,再执行drop即可。

再附上删除某一个数据文件的命令在这:
alter database tempfile '文件全路径" drop;
e. 再通过 dba_users 检查下是否成功了。
select username,temporary_tablespace from dba_users;

方法三: 收缩表空间 -- 将其收缩到100m大小
alter tablespace 临时表空间名 shrink space keep 100m; --也可以回收表空间所有的空间 alter tablespace 临时表空间名 shrink space;

查看结果: select * from dba_temp_free_space; 2. 临时表空间开了自动扩展,无限制的扩展,造成资源紧张。 关掉自动扩展是个解决方法,但这也有个问题,如果关了自动扩展,那多大合适,会不会出上不够用得情况? 这个其实也只能靠估算业务高峰期的峰值来算。我也没想到很合理的算法。而这个估算不合理或突然碰到暴涨 的情况,关掉自动扩展也会很被动,会报错。 所以建议的是平常要盯紧点,在估计磁盘空间还有足够的情况下 可以打开,但磁盘资源相对比较紧张了,则可以关掉这个选项。

(三) 一些建议及好用的特性,如临时表空间组 建议1. 查出消耗资源比较大的sql语句然后对其进行优化,这是治本的方法。
 select se.username,
       se.sid,
       su.extents,
       su.blocks*to_number(rtrim(p.value))as space,
       tablespace,
       segtype,
       sql_text
from v$sort_usage su,v$parameter p,v$session se,v$sql s
where p.name='db_block_size'
and su.session_addr=se.saddr
and s.hash_value=su.sqlhash
and s.address=su.sqladdr
order by se.username,se.sid;

建议2 平时注意监控,在新建临时表空间时,如果估计磁盘空间还有足够的情况下可以打开自动扩展,但磁盘资源相对比较紧张了,则可以关掉这个选项

建议3. 不要所有用户都用系统默认的临时表空间,应当分开。 建议4. 使用临时表空间组,能比较好的解决问题。 表空间组能在空间不足时,向里面删除和添加临时表空间文件。还能让用户的不同session使用不同的表空间文件,实际上就是实现了IO的负载均衡。所以这个推荐使用。 先做个例子:

a. 生成临时表空间组
 create temporary tablespace  TMPG1_01 tempfile 'C:/ORACLE/ORADATA/XCLDB/ TMPG1_01 .DBF' size 10m tablespace group tmp_grp1;
 create temporary tablespace  TMPG1_02 tempfile 'C:/ORACLE/ORADATA/XCLDB/ TMPG1_02 .DBF' size 10m tablespace group tmp_grp1;
 create temporary tablespace  TMPG1_03 tempfile 'C:/ORACLE/ORADATA/XCLDB/ TMPG1_03 .DBF' size 10m tablespace group tmp_grp1;b. 查询是否成功了 select * from dba_tablespace_groups; c. 指定用户使用此表空间组 alter user demo temporary tablespace TMP_GRP1; d. 查看是否alter成功 select username,temporary_tablespace from dba_users; 临时表空间组也可以删除组成员,命令是一样的: drop tablespace TMPG1_01 including contents and datafiles cascade constraints;

临时表空间管理就写得这了。好多。

>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();