ORALCE 临时表空间
一 临时表空间概念
临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。
像数据库中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。
当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。
临时表空间存储大规模排序操作(小规模排序操作会直接在RAM里完成,大规模排序才需要磁盘排序Disk Sort)和散列操作的中间结果,它跟永久表空间不同的地方在于它由临时数据文件(temporary files)组成的,而不是永久数据文件(datafiles)。临时表空间不会存储永久类型的对象,所以它不会也不需要备份。另外,对临时数据文件的操作不产生redo日志,不过会生成undo日志。
创建临时表空间或临时表空间添加临时数据文件时,即使临时数据文件很大,添加过程也相当快。这是因为ORACLE的临时数据文件是一类特殊的数据文件:稀疏文件(Sparse File),当临时表空间文件创建时,它只会写入文件头部和最后块信息(only writes to the header and last block of the file)。它的空间是延后分配的.这就是你创建临时表空间或给临时表空间添加数据文件飞快的原因。
另外,临时表空间是NOLOGGING模式以及它不保存永久类型对象,因此即使数据库损毁,做Recovery也不需要恢复Temporary Tablespace。
二 临时表空间信息
1 查看系统默认临时表空间(database_properties)
SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
2 查看用户临时表空间(dba_users)
SELECT USERNAME, default_tablespace,TEMPORARY_TABLESPACE FROM DBA_USERS where username='CHEN';
3 查看临时表空间详细信息(v$tempfile,dba_temp_files)
SELECT FILE# AS FILE_NUMBER
,NAME AS NAME
,CREATION_TIME AS CREATION_TIME
,BLOCK_SIZE AS BLOCK_SIZE
,BYTES/1024/1024/1024 AS "FILE_SIZE(G)"
,CREATE_BYTES/1024/1024/1024 AS "INIT_SIZE(G)"
,STATUS AS STATUS
,ENABLED AS ENABLED
FROM V$TEMPFILE;
SELECT TABLESPACE_NAME AS TABLESPACE_NAME
,FILE_NAME AS FILE_NAME
,BLOCKS AS BLOCKS
,STATUS AS STATUS
,AUTOEXTENSIBLE AS AUTOEXTENSIBLE
,BYTES/1024/1024/1024 AS "FILE_SIZE(G)"
,DECODE(MAXBYTES, 0, BYTES/1024/1024/1024,
MAXBYTES/1024/1024/1024)
AS "MAX_SIZE(G)"
,INCREMENT_BY AS "INCREMENT_BY"
,USER_BYTES/1024/1024/1024 AS "USEFUL_SIZE"
FROM DBA_TEMP_FILES;
select a.tablespace_name,
a.file_name,
a.status,
b.status as bstatus,
a.autoextensible,
a.increment_by,
a.bytes / 1024 / 1024 / 1024 || 'G' as file_size,
decode(a.maxbytes,
0,
a.bytes / 1024 / 1024 / 1024 || 'G',
maxbytes / 1024 / 1024 / 1024 || 'G') as max_size,
a.USER_BYTES / 1024 / 1024 / 1024 || 'G' AS "USEFUL_SIZE"
from dba_temp_files a, v$tempfile b
where a.file_name = b.name;
其中使用decode函数的原因:
当临时表空间不是自动增长时,maxbytes=bytes
当临时表空间是自动增长时,maxbytes=maxbytes
三 管理临时表空间
1创建临时表空间
create temporary tablespace chen_temp tempfile '/data/oradata/cts/chen_temp01.dbf' size 100M autoextend off;
2增加数据文件
当临时表空间太小时,就需要扩展临时表空间(添加数据文件、增大数据文件、设置文件自动扩展);有时候需要将临时数据文件分布到不同的磁盘分区中,提升IO性能,也需要通过删除、增加临时表空间数据文件。
方法一:
alter tablespace chen_temp add tempfile '/data/oradata/cts/chen_temp02.dbf' size 50m autoextend on next 10M maxsize 100M;
方法二:
alter tablespace chen_temp add tempfile '/data/oradata/cts/chen_temp03.dbf' size 50M autoextend off;
3 调整文件大小
如下例子,需要将临时数据文件从50M大小调整为60M
alter database tempfile '/data/oradata/cts/chen_temp03.dbf' resize 60M;
4 设置文件自动扩展,取消自动增长
alter database tempfile '/data/oradata/cts/chen_temp03.dbf' autoextend on next 10M maxsize unlimited;
alter database tempfile '/data/oradata/cts/chen_temp03.dbf' autoextend off;
5收缩临时表空间
排序等操作使用的临时段,使用完成后会被标记为空闲,表示可以重用,占用的空间不会立即释放,有时候临时表空间会变得非常大,此时可以通过收缩临时表空间来释放没有使用的空间。收缩临时表空间是ORACLE 11g新增的功能。
alter tablespace chen_temp shrink space keep 200M;
alter tablespace chen_temp shrink tempfile '/data/oradata/cts/chen_temp03.dbf';
6切换临时表空间
1 切换系统默认临时表空间
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
alter database default temporary tablespace chen_temp;
2 切换用户默认来临时表空间
select username,temporary_tablespace from dba_users where username='CHEN';
alter user chen temporary tablespace chen_temp;
7移动重命名文件
例如,我需要将/data/oradata/cts/chen_temp03.dbf这个文件移动并重命名为/data/oradata/cts/chen/chen_temp003.dbf
1: 将临时表空间的临时文件脱机
alter database tempfile '/data/oradata/cts/chen_temp03.dbf' offline;
2:移动或重命名相关的临时文件
mv /data/oradata/cts/chen_temp03.dbf /data/oradata/cts/chen/chen_temp003.dbf
3: 使用脚本ALTER DATABASE RENAME FILE
alter database rename file '/data/oradata/cts/chen_temp03.dbf' to '/data/oradata/cts/chen/chen_temp003.dbf';
4: 将临时表空间的临时文件联机
alter database tempfile '/data/oradata/cts/chen/chen_temp003.dbf' online;
8监控临时表空间
1:查看临时表空间使用情况
SELECT TU.TABLESPACE_NAME AS "TABLESPACE_NAME",
TT.TOTAL - TU.USED AS "FREE(G)",
TT.TOTAL AS "TOTAL(G)",
ROUND(NVL(TU.USED, 0) / TT.TOTAL * 100, 3) AS "USED(%)",
ROUND(NVL(TT.TOTAL - TU.USED, 0) * 100 / TT.TOTAL, 3) AS "FREE(%)"
FROM (SELECT TABLESPACE_NAME,
SUM(BYTES_USED) / 1024 / 1024 / 1024 USED
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) TU ,
(SELECT TABLESPACE_NAME,
SUM(BYTES) / 1024 / 1024 / 1024 AS TOTAL
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) TT
WHERE TU.TABLESPACE_NAME = TT.TABLESPACE_NAME;
SELECT ROUND((F.BYTES_FREE + F.BYTES_USED)/1024/1024/1024, 2) AS "TOTAL(GB)",
ROUND(((F.BYTES_FREE + F.BYTES_USED) - NVL(P.BYTES_USED, 0))/1024/1024/1024,2) AS "FREE(GB)",
D.FILE_NAME AS "TEMP_FILE",
ROUND(NVL(P.BYTES_USED, 0)/1024/1024/1024, 2) AS "USED(GB)" ,
ROUND((F.BYTES_USED + F.BYTES_FREE)/1024/1024/1024, 2) AS "TOTAL(GB)",
ROUND(((F.BYTES_USED + F.BYTES_FREE) - NVL(P.BYTES_USED, 0))/1024/1024/1024, 2) AS "FREE(GB)" ,
ROUND(NVL(P.BYTES_USED, 0)/1024/1024/1024, 2) AS "USED(GB)"
FROM SYS.V_$TEMP_SPACE_HEADER F ,DBA_TEMP_FILES D ,SYS.V_$TEMP_EXTENT_POOL P
WHERE F.TABLESPACE_NAME(+) = D.TABLESPACE_NAME
AND F.FILE_ID(+) = D.FILE_ID
AND P.FILE_ID(+) = D.FILE_ID;
2:查看临时表空间对应的临时文件的使用情况
SELECT TABLESPACE_NAME AS TABLESPACE_NAME ,
BYTES_USED/1024/1024/1024 AS TABLESAPCE_USED ,
BYTES_FREE/1024/1024/1024 AS TABLESAPCE_FREE
FROM V$TEMP_SPACE_HEADER
ORDER BY 1 DESC;
3 查找消耗临时表空间资源比较多的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;
9删除临时表空间及数据文件
(1)删除数据文件
方法1:
alter tablespace chen_temp drop tempfile '/data/oradata/cts/chen_temp01.dbf';
注意:这种删除临时表空间的写法会将对应的物理文件删除。
方法2:
alter database tempfile '/data/oradata/cts/chen_temp02.dbf' drop including datafiles;
注意:删除临时表空间的临时数据文件时,需要指定INCLUDING DATAFILES 选项才能真正删除物理文件,否则需要手工删除物理文件。
(2)删除临时表空间
drop tablespace chen_temp including contents and datafiles cascade constraints;
注意:
1 执行上面语句很长时间没没有结束,查询SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP';
发现有大量的会话在使用这个空间,所有无法删除。
解决办法:重启数据库alter system checkpoint;
Shutdown immediate
Startup
在查询SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP';已经没有会话;
再次执行drop tablespace chen_temp including contents and datafiles cascade constraints;成功。
2 Drop table cascade constraints 是不影响到存储于object里的row data,只是删除了相应的约束条件。
3 不能删除当前用户的默认表空间,否则会报ORA-12906错误。
如果需要删除某一个默认的临时表空间,则必须先创建一个临时表空间,然后指定新创建的表空间为默认表空间,然后删除原来的临时表空间。
四 临时表空间组
Oracle 10g之前,同一用户的多个会话只可以使用同一个临时表空间,因为在给定的时间只有一个临时表空间默认给用户,为了解决这个潜在的瓶颈,Oracle支持临时表空间组即包含多个临时表空间的集合。临时表空间组逻辑上就相当于一个临时表空间。
临进表空间组是ORACLE 10g引入的一个新特性,它是一个逻辑概念,不需要显示的创建和删除。只要把一个临时表空间分配到一个组中,临时表空间组就自动创建,所有的临时表空间从临时表空间组中移除就自动删除。
一个临时表空间组必须由至少一个临时表空间组成,并且无明确的最大数量限制。
create temporary tablespace chen_temp1 tempfile '/data/oradata/cts/chen_temp01.dbf' size 10M;
create temporary tablespace chen_temp2 tempfile '/data/oradata/cts/chen_temp02.dbf' size 10M;
create temporary tablespace chen_temp3 tempfile '/data/oradata/cts/chen_temp03.dbf' size 10M;
添加chen_temp1,chen_temp2,chen_temp3到临时表空间组tempgrp中
alter tablespace chen_temp1 tablespace group tempgrp;
alter tablespace chen_temp2 tablespace group tempgrp;
alter tablespace chen_temp3 tablespace group tempgrp;
启用临时表空间组
alter database default temporary tablespace tempgrp;
select * from dba_tablespace_groups;
此时数据库所有用户的默认临时表空间为tempgrp
SELECT USERNAME, default_tablespace,TEMPORARY_TABLESPACE FROM DBA_USERS where username='CHEN';
也可以指定已经创建好的临时表空间的临时表空间组
alter tablespace chen_temp1 tablespace group tempgrp;
删除临时表空间组
必须先删除成员
alter tablespace chen_temp1 tablespace group '';
alter tablespace chen_temp2 tablespace group '';
select * from dba_tablespace_groups;
当表空间组是数据库默认表空间时,最后一个成员删除报错:ORA-10919:Defualt temporary tablespace group must be have at least one tablespace
此时再删除最后一个成员,临时表空间组自动消失
alter tablespace chen_temp3 tablespace group '';
select * from dba_tablespace_groups;
删除临时表空间
SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP1';
SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP2';
SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP3';
drop tablespace chen_temp1 including contents and datafiles cascade constraints;
drop tablespace chen_temp2 including contents and datafiles cascade constraints;
drop tablespace chen_temp3 including contents and datafiles cascade constraints;
参考:
http://www.cnblogs.com/david-zhang-index/archive/2012/04/11/2442726.html
http://www.cnblogs.com/kerrycode/p/4006840.html
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29785807/viewspace-1579312/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29785807/viewspace-1579312/