1.1 在线收缩临时表空间
1.1.1 问题阐述
随着数据库长时间运行,又因初始化数据库时并没有特别关注临时表空间相关的参数(默认
没有限定它的大小),日积月累,临时文件越变越大,严重的时候甚至占用大量的磁盘空
间。如果此时恰好遇到磁盘空间紧缺状态,应回收未用的临时表空间的空间。正常情况下,
因临时文件属于稀疏文件,重启一下数据库,会自动进行清理回收空间。但对于生产库,是
不可能让我们重启数据库的,这是极其愚蠢的办法。因此,引入在线回收缩临时表空间的处
理方法。
1.1.2 关于临时表空间的参数
PS:最好设置TEMP_SPACE_LIMIT参数,限制它的大小增长的上限。
1.1.3 临时表空间的作用
临时表空间用于查询和存放一些缓冲区数据。
临时表空间消耗的主要原因是需要对查询的中间结果进行排序操作(order
by/distinct/union/minus/intersect/create index等)。
重启数据库实例虽然可以释放临时表空间,在不能重启实例情况下,而一直保持问题SQL语
句的执行,temp 表空间会一直增长。
对于临时表空间,DM 数据库会自动释放在执行 SQL 过程中产生的临时段,并将属于此临
时段的簇空间还给临时表空间,然而它的文件在磁盘所占大小并不会因此而缩减。
1.1.4 收缩临时表空间
存储过程 SP_TRUNC_TS_FILE
将临时表空间文件截断到指定的大小,仅能截断文件空闲未使用的部分。
如果在指定 to_size后存在已使用数据页,则实际截断大小会大于 to_size。
SP_TRUNC_TS_FILE (
ts_id int, ‐‐ 表空间ID
file_id int, ‐‐ 文件ID
to_size int ‐‐ 收缩到多少MB。to_size大小换算成页数后,值必须在4096到2G之间。
)
查询临时表空间的临时文件分布情况
SELECT
ts.NAME "表空间" ,
ts.ID "表空间编号" ,
df.id "文件编号" ,
df.max_size "文件最大大小(MB)" ,
df.total_size*df.PAGE_SIZE/1024/1024 "当前文件大小(MB)",
df.free_size *df.PAGE_SIZE/1024/1024 "文件空闲大小(MB)",
df.path "文件路径"
FROM
V$TABLESPACE AS ts,
V$DATAFILE AS df
WHERE
ts.type$=2
and ts.ID = df.GROUP_ID;
调整后:
SQL> alter system set 'TEMP_SPACE_LIMIT'=500 both; -- 限定临时表空间最大大小500MB
SQL> sp_trunc_ts_file(3,0,10); -- 缩小到10MB
1.1.5 个人建议
一般建议将临时表空间的临时文件与普通表空间的数据文件分散存储,同时如果操作系统的物理内存非常充足且很大,
可以shm用内存扮演硬盘(切记:限定大小),即把临时表空间的路径指向内存,加速数据库的排序操作。