一个临时表空间中包含仅持续在会话持续时间短暂的数据。永久模式对象不能驻留在临时表空间中。一个临时文件存储临时表空间的数据。
临时表空间可以改善不适合内存的多个排序操作的并发性。这些表空间还可以提高各种空间管理操作的效率。
共享和本地临时表空间
临时表空间可以是共享的,也可以是本地的。
一个共享的临时表空间共享磁盘上存储的临时文件,使临时空间是所有数据库实例访问。相反,本地临时表空间为每个数据库实例存储单独的非共享临时文件。本地临时表空间对Oracle Real Application Clusters或Oracle Flex Clusters非常有用.
您可以为只读和读/写数据库实例创建本地临时表空间。当许多只读实例访问单个数据库时,本地临时表空间可以提高涉及排序,散列聚合和连接的查询的性能。优点是:
- 通过使用本地而非共享磁盘存储来提高I / O性能
- 避免昂贵的跨实例临时空间管理
- 通过消除磁盘空间元数据管理来提高实例启动性能
共享和本地临时表空间
共享临时表空间 | 本地临时表空间 |
---|---|
创建CREATE TEMPORARY TABLESPACE 声明。 |
创建CREATE LOCAL TEMPORARY TABLESPACE 声明。 注意:本地临时表空间始终是bigfile表空间,但 BIGFILE 创建语句中不需要该关键字。 |
为数据库创建单个临时表空间。 | 为每个数据库实例创建单独的临时表空间。该FOR LEAF 选项仅为只读实例创建表空间。该 FOR ALL 选项为所有实例创建表空间,包括只读和读/写。 |
支持表空间组。 | 不支持表空间组。 |
在控制文件中存储临时文件元数据。 | 存储控制文件中所有实例共有的临时文件元数据,以及SGA中特定于实例的元数据(例如,分配的位图,当前临时文件大小和文件状态)。 |
为每个数据库用户帐户分配一个默认的共享临时表空间。如果数据库包含本地临时表空间,则还会为每个用户帐户分配默认的本地临时存储。
您可以使用CREATE USER
或ALTER USER
语句为用户帐户指定不同的临时表空间。Oracle数据库对未为其指定其他临时表空间的用户使用系统级缺省临时表空间。
创建默认临时表空间
创建数据库时,默认临时存储取决于SYSTEM
表空间是否在本地管理。
下表显示了Oracle数据库在创建数据库时如何选择默认临时表空间。
SYSTEM表空间是否在本地管理? | CREATE DATABASE语句是否指定了默认的临时表空间? | 那么数据库…… |
---|---|---|
是 | 是 | 使用指定的表空间作为默认值。 |
是 | 没有 | 创建临时表空间。 |
没有 | 是 | 使用指定的表空间作为默认值。 |
没有 | 没有 | 使用SYSTEM 默认的临时存储。数据库在警报日志中 写入警告,指出建议使用默认临时表空间。 |
创建数据库后,可以使用该ALTER DATABASE DEFAULT TEMPORARY TABLESPACE
语句更改数据库的默认临时表空间。
访问临时存储
如果用户分配了临时表空间,则数据库首先访问它; 否则,数据库访问默认的临时表空间。数据库访问查询的临时表空间后,它不会切换到另一个表空间。
用户查询可以访问共享或本地临时存储。此外,用户可以为只读实例分配一个默认本地临时表空间,为读/写实例分配不同的默认本地临时表空间。
对于读/写实例,数据库为共享临时表空间提供更高的优先级。对于只读实例,数据库为本地临时表空间提供更高的优先级。如果数据库实例是读/写,则数据库按以下顺序搜索空间:
- 是否为用户分配了共享临时表空间
- 是否为用户分配了本地临时表空间
- 数据库默认的共享临时表空间
- 数据库默认的本地临时表空间
如果前面任何一个问题的答案都是肯定的,那么数据库就会停止搜索并从指定的表空间中分配空间; 否则,从数据库默认本地临时表空间分配空间。
如果数据库实例是只读的,则数据库按以下顺序搜索空间:
- 是否为用户分配了共享临时表空间
- 是否分配数据库默认本地临时表空间
- 是否为用户分配了默认临时表空间
- 是否为分配了数据库默认的临时表空间
如果前面任何问题的答案都是肯定的,那么数据库会停止搜索并从指定的表空间分配空间; 否则,从数据库默认共享临时表空间分配空间。
表空间模式
读/写和只读表空间
每个表空间都处于写入模式,指定是否可以写入。
互斥模式如下:
- 读/写模式
用户可以读写表空间。所有表空间最初都创建为读/写。在SYSTEM
和SYSAUX
表空间和临时表空间将被永久读/写,这意味着它们不能只读制作。 - 只读模式
禁止对表空间中的数据文件执行写操作。只读表空间可以驻留在只读介质上,例如DVD或WORM驱动器。
只读表空间消除了执行数据库的大型静态部分的备份和恢复的需要。只读表空间不会更改,因此不需要重复备份。如果在介质发生故障后恢复数据库,则无需恢复只读表空间。
也可以看看:
- Oracle数据库管理员指南,了解如何将表空间更改为只读或读/写模式
- Oracle Database SQL语言参考,用于
ALTER TABLESPACE
语法和语义 有关恢复的详细信息 ,请参见“Oracle数据库备份和恢复用户指南”
在线和离线表空间
每当数据库打开时,表空间都可以在线(可访问)或脱机(不可访问)。
表空间通常在线,因此用户可以使用其数据。该SYSTEM
表空间和临时表空间不能脱机。
表空间可以自动或手动脱机。例如,您可以使表空间脱机以进行维护或备份和恢复。遇到某些错误时,数据库会自动使表空间脱机,因为数据库写程序(DBW)进程在多次尝试写入数据文件时失败。尝试访问脱机表空间中的表的用户会收到错误。
当表空间脱机时,数据库将执行以下操作:数据库不允许后续DML语句引用脱机表空间中的对象。除Oracle数据库之外的任何实用程序都无法读取或编辑脱机表空间。
- 具有引用该表空间中的数据的已完成语句的活动事务不会在事务级别受到影响。
- 数据库在
SYSTEM
表空间中的延迟还原段中保存与已完成语句对应的撤消数据。当表空间联机时,如果需要,数据库会将撤消数据应用于表空间。
涉及视图
v$rollstat dba_segments v$rollname dba_rollback_segs
1.创建临时表空间
create TEMPORARY TABLESPACE temp1;
create TEMPORARY TABLESPACE temp2;
create TEMPORARY TABLESPACE temp3;
2.创建临时表空间组
alter TABLESPACE temp1 tablespace group tempgrp;
alter TABLESPACE temp2 tablespace group tempgrp;
alter TABLESPACE temp3 tablespace group tempgrp;
--------------------------------------------------------
SQL> select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TEMPGRP TEMP1
TEMPGRP TEMP2
TEMPGRP TEMP3
3.设置默认临时表空间组
与设置单个表空间命令相同
SQL> alter DATABASE DEFAULT TEMPORARY TABLESPACE tempgrp;
Database altered.
4.查看temp表空间
select * from v$tempfile;
5.创建本地临时表空间
为本地临时未见表空间创建读写和只读实例
create local TEMPORARY tablespace for all local_temp_olrac1
tempfile '/u01/app/oracle/oradata/temp_olrac1.dbf' size 100m extent MANAGEMENT
LOCAL UNIFORM SIZE 1m;
只读实例创建临时表空间
create local TEMPORARY tablespace for leaf local_temp_olrac1
tempfile '/u01/app/oracle/oradata/temp_olrac1.dbf' size 100m extent MANAGEMENT
LOCAL UNIFORM SIZE 1m;
6.使本地临时表空间脱机
alter database tempfile '/u01/app/oracle/oradata/temp_olrac2.dbf' offline;
alter database tempfile '/u01/app/oracle/oradata/temp_olrac2.dbf' online;
7.shrink space减小本地临时表空间的大小
alter tablespace local_temp_olrac2 shrink space keep 20m;
8.修改临时表空间为自动扩展
alter tablespace local_temp_olrac2 autoextend on next 20G;
9.声明resize选项调整本地临时文件的大小
alter database tempfile '/u01/app/oracle/oradata/temp_olrac1.dbf' resize 1000m;
10.查看表空间是否为共享
select tablespace_name,shared from dba_tablespaces;
select tablespace_name,shared from dba_temp_files;
select tablespace_name,shared from dba_temp_free_space;
11.删除临时表空间
drop tablespace temp1 including contents and datafiles;