背景
检查批次任务,04:20的任务执行失败,报临时表空间无法扩展。用网上搜的一个脚本[^1]查看临时表空间使用情况,都是100%。
同时,用v
s
o
r
t
u
s
a
g
e
、
v
sort_usage、v
sortusage、vsort_segment、v$tempseg_usage等视图又查不到占用的会话。
有点蒙圈,后来才发现时查临时表空间使用的脚本错误,顺便把11g下临时表空间的使用梳理了下。
11g新视图dba_temp_free_space
11g开始有专门的视图直接查看临时表空间的剩余情况,不复杂,只有4个字段。有点疑惑的是Allocated_space。
Allocated_Space
表示文件系统中给临时文件真实分配过的大小,也就是实例使用过的最大位置(类似于HWM)。
临时文件是稀疏文件,与普通的数据文件不同,创建时只写元数据,不真实分配大小
从组成上,这个大小由三部分组成:元数据信息(1M)、正在使用的临时段空间、当前没有使用但是曾经使用过的临时段空间。
Free_space
表示当前表空间有多大空间可以使用。包括:当前没有使用但是曾经使用过的临时段空间、稀疏文件中未分配部分。
两个字段体积中有一部分属于共享,是当前没有使用但是曾经使用过的临时段空间部分。
临时表空间的管理
- 分3个步骤:注册、分配、使用; *
临时文件创建后,在文件系统层面注册,只创建了文件元数据,不实际分配空间(稀疏文件,ls下可以看到文件和大小,但df不实际占有空间)
当实际使用时,才分配空间。且分配后的空间不会回收,类似hwm。
dba_temp_free_space试图种体现了这一概念,allocated_space是实际分配的空间;free_space是空闲可用空间。
实验
1、创建表空间
CREATE TEMPORARY TABLESPACE temptest
TEMPFILE '/mnt/disk1/oradata/temptest.dbf' SIZE 500M ;
2、查看dba_temp_free_spac
–查看allocated_space和free_space
–查看文件系统中文件大小,文件大小和创建时的一样, 但硬盘空闲空间没变化
571355768 --创建500M
571355768 --resize 1G
571021624 --临时表插入数据
571346544 --resize 10M
alter database tempfile '/mnt/disk1/oradata/temptest.dbf' resize 1g;
3、用临时表占用临时空间
Create Global Temporary Table temptest
(
start_date DATE,
end_date DATE,
line_no VARCHAR2(20),
class_no VARCHAR2(5),
product_name VARCHAR2(200),
plan_number VARCHAR2(30),
station_name VARCHAR2(30),
thread_no NUMBER(4),
testitem VARCHAR2(100),
mobile_name VARCHAR2(50),
test_cnt NUMBER,
fail_cnt NUMBER,
station_no VARCHAR2(5)
)
On Commit delete rows;
4、查看dba_temp_free_space
–查看allocated_space和free_space
–查看文件系统中文件大小
总结
1、临时表空间剩余空间的查看方法
2、临时表空间分配的过程:注册->分配->根据实际用量占用