临时表空间的管理与受损恢复

      Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是
对于大型的频繁操作,如创建索引,排序等等都需要在临时表空间完成来减少内存的开销。当然对于查询性能要求较高的应尽可能的避免在磁盘
上完成这些操作。本文主要描述的是临时表空间的管理与受损恢复。

一、临时表空间的特性与注意事项
  1.特性
       用户存储临时数据的表空间
       临时数据通常只在一个数据库会话期间内存在的数据,分为两种形式,排序数据和全局临时表
       临时数据不会被写入存储永久对象的普通表空间内,而是存储在临时表空间的临时段中
       临时表空间临时性导致不需要备份该类型的表空间,RMAN也不支持对临时表空间的备份
       对于临时数据的处理,不会生成重做,也不会生成撤销数据
       临时表空间的数据文件不能置为只读、不能重命名
       监时表空间的数据文件的日志方式总是NOLOGGING
       使用临时表空间的主要操作
        CREATE INDEX,ALTER INDEX ...REBUILD,ORDER BY,GROUP BY,DISTINCT,UNION,INTERSECT,MINUS,SORT-MERGER,JOIN,ANALYZE
      
  2.临时表空间使用的注意事项
       a. 每个用户都有一个缺省的临时表空间,对于临时表空间使用较高的系统,建议将临时表空间数据文件分布到不同的磁盘
       b. 对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理
       c. 分配用户单独临时表空间,一般是针对大型产品数据库,OLTP数据库,数据库仓库
       d. 对于小型产品不需要单独制定临时表空间,使用默认临时表空间
       e. 对于临时表空间建议关闭自动扩展功能,避免过度扩展所致的空间压力 
  关于临时表空间的创建与管理请参考:Oracle 表空间与数据文件二、临时表空间的管理
  1. 查看缺省的临时表空间

SQL> select property_name,property_value from database_properties
  2  where property_name like 'DEFAULT%';                               

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ --------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP
DEFAULT_PERMANENT_TABLESPACE   USERS
DEFAULT_TBS_TYPE               SMALLFILE

  2.查看临时表空间的大小及位置    

SQL> select s.name tbsname,t.name,(t.bytes/1024/1024) bytes,status
  2  from v$tablespace s,v$tempfile t
  3  where s.ts# = t.ts#;                                                               

TBSNAME    NAME                                               BYTES   STATUS
---------- --------------------------------------------- ----------   -------
TEMP       /u01/app/oracle/oradata/orcl/temp01.dbf               30   ONLINE            

SQL> select tablespace_name,file_name,bytes/1024/1024 Size_MB from dba_temp_files;      

TABLESPACE FILE_NAME                                        SIZE_MB
---------- --------------------------------------------- ----------
TEMP       /u01/app/oracle/oradata/orcl/temp01.dbf               30                     

SQL> select tablespace_name,logging,allocation_type
  2  from dba_tablespaces where tablespace_name='TEMP';                                 

TABLESPACE LOGGING   ALLOCATIO
---------- --------- ---------
TEMP       NOLOGGING UNIFORM

  3. 临时表文件大小和已使用空间    

SELECT t1."Tablespace" "Tablespace",
       t1."Total (G)" "Total (G)",
       nvl(t2."Used (G)", 0) "Used(G)",
       t1."Total (G)" - nvl(t2."Used (G)", 0) "Free (G)"
FROM   (SELECT tablespace_name "Tablespace",
               to_char((SUM(bytes / 1024 / 1024 / 1024)), '99,999,990.900') "Total (G)"
        FROM   dba_temp_files
        GROUP  BY tablespace_name
        UNION
        SELECT tablespace_name "Tablespace",
               to_char((SUM(bytes / 1024 / 1024 / 1024)), '99,999,990.900') "Total (G)"
        FROM   dba_data_files
        WHERE  tablespace_name LIKE 'TEMP%'
        GROUP  BY tablespace_name) t1,
       (SELECT tablespace, round(SUM(blocks) * 8 / 1024 /1024) "Used (G)"
        FROM   v$sort_usage
        GROUP  BY tablespace) t2
WHERE  t1."Tablespace" = t2.tablespace(+);                                                  

Tablespace                     Total (G)          Used(G)   Free (G)
------------------------------ --------------- ---------- ----------
GOEX_TEMP                               31.999          1     30.999
FIX_TEMP                                 0.098          0       .098
TEMP                                     0.195          0       .195

  4. 查看当前临时表使用空间大小与正在占用临时表空间的sql语句  

-->使用临时段的SQL语句
	SELECT sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
	FROM   v$sort_usage sort, v$session sess, v$sql SQL
	WHERE  sort.SESSION_ADDR = sess.SADDR
	       AND SQL.ADDRESS = sess.SQL_ADDRESS
	ORDER  BY blocks DESC;                                                      

-->下面的查询也可以查询谁正在使用临时段
	col username format a15
	col machine format a15
	col program format a30
	col tablespace format a15
	set linesize 160
	SELECT s.username
	      ,s.sid
	      ,s.serial#
	      ,s.sql_address
	      ,s.machine
	      ,s.program
	      ,su.tablespace
	      ,su.segtype
	      ,su.contents
	FROM   v$session s, v$sort_usage su
	WHERE  s.saddr = su.session_addr;                                           

SELECT 'the ' || NAME || ' temp tablespaces ' || tablespace_name ||
       ' idle ' ||
       round(100 - (s.tot_used_blocks / s.total_blocks) * 100, 3) ||
       '% at ' || to_char(SYSDATE, 'yyyymmddhh24miss')
FROM   (SELECT d.tablespace_name tablespace_name,
               nvl(SUM(used_blocks), 0) tot_used_blocks,
               SUM(blocks) total_blocks
        FROM   v$sort_segment v, dba_temp_files d
        WHERE  d.tablespace_name = v.tablespace_name(+)
        GROUP  BY d.tablespace_name) s,
       v$database;

   3. 修改默认的临时表空间
           alter database default temporary tablespace tablespace_name;
   4. 对于过度使用临时表空间,在允许的情况下,可以杀掉其session
           alter system kill session 'sid,serial#';  
   
三、临时表空间故障
  前面已提到,临时表空间不需要备份,如果对临时表空间备份将收到错误提示  

SQL> alter tablespace temp begin backup;
alter tablespace temp begin backup
*
ERROR at line 1:
ORA-03217: invalid option for alter of TEMPORARY TABLESPACE     

SQL> alter temporary tablespace temp begin backup;
alter temporary tablespace temp begin backup
      *
ERROR at line 1:
ORA-00940: invalid ALTER command

  临时表空间出错的错误提示(位于告警日志中alert_orcl.log)
   Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_dbw0_2230.trc:
   ORA-01186:file 3 failed verification tests
   ORA-01157:cannot identify/lock data file 3 - see DBWR trace file
   ORA-01110:data file 3:'/u01/app/oracle/oradata/orcl/temp01.dbf'
 
四、还原受损的临时表空间
  1. 在session 1中删除临时表空间的数据文件

SQL> show user;
USER is "SYS"
SQL> ho rm /u01/app/oracle/oradata/orcl/temp01.dbf 

SQL> alter system checkpoint;  -->执行检查点进程   

System altered.

  2. 在session 2中执行排序查询,提示临时数据文件错误   

SQL> show user;
USER is "SCOTT"
SQL> set autotrace traceonly;
SQL> select owner,object_name from big_table order by id,owner,object_name;
select owner,object_name from big_table order by id,owner,object_name
                              *
ERROR at line 1:
ORA-01565: error in identifying file '/u01/app/oracle/oradata/orcl/temp01.dbf'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

  3. 在session 1中为临时表空间增加数据文件  

SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf'
  2  size 30m autoextend on next 1m maxsize 2g;                                        

Tablespace altered.

  4. 在session 2中继续执行排序操作,此次执行成功  

SQL> select owner,object_name from big_table order by id,owner,object_name;        

1000000 rows selected.

  5. 查询临时数据文件状态及文件存在性 

SQL> set linesize 160                            --> session 1中查看临时数据文件状态,大小为0,但仍然为online状态
SQL> select s.name tbsname,t.name,(t.bytes/1024/1024) bytes,t.status
  2  from v$tablespace s,v$tempfile t
  3  where s.ts# = t.ts#;                                                                                          

TBSNAME              NAME                                               BYTES STATUS
-------------------- --------------------------------------------- ---------- -------
TEMP                 /u01/app/oracle/oradata/orcl/temp01.dbf                0 ONLINE
TEMP                 /u01/app/oracle/oradata/orcl/temp02.dbf               30 ONLINE                               

SQL> ho ls /u01/app/oracle/oradata/orcl/temp01.dbf
ls: /u01/app/oracle/oradata/orcl/temp01.dbf: No such file or directory

  6. 清除控制文件内记录的不存在的临时文件信息 

SQL> alter tablespace temp drop tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf';   

Tablespace altered.

  7. 基于表空间级别的恢复操作(下面给出主要步骤,不在演示)
       a. 创建一个新的临时表空间
       b. 使用alter database 将用户切换到新的临时表空间,即设置新的默认的临时表空间
       c. 删除受损的临时表空间
  

时间: 2024-08-16 06:05:11

临时表空间的管理与受损恢复的相关文章

详解Oracle的SYSTEM表空间的管理及备份恢复

SYSTEM表空间是Oracle数据库最重要的一个表空间,存放了一些DDL语言产生的信息以及PL/SQL包.视图.函数.过程等,称之为数据字典,因此该表空间也具有其特殊性,下面描述SYSTEM表空间的相关特性及备份与恢复.   一.SYSTEM表空间的管理 1.建议不存放用户数据,避免用户错误导致系统表空间不可用 应当为系统设定缺省的默认表空间来避免用户创建时使用系统表空间 ALTER DATABASE DEFAULT TABLESPACE tablespace_name SQL> col pr

收缩临时表空间

        当排序操作.重建索引等大型操作无法在内存中完成时,临时表空间将为排序提供便利.一般情况下临时表空间为多个用户,多个会话所共 享.不能为会话分批空间配额.临时表空间耗用过度且在不能自动扩展的情形下将收到"ORA-1652:unable to extend temp segment" 错误.下面 描述了过度扩展后如何释放临时表空间. 与之相关的内容参考:         Oracle 表空间与数据文件         临时表空间的管理与受损恢复         Oracle

探索ORACLE_之表空间02_管理

探索ORACLE_之表空间02_管理 表空间创建参考语法图如下连接: http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7003.htm#i2231734   创建表空间的语法是: CREATE [SMALLFILE|BIGFILE] [PERMANENT|TEMPORARY|UNDO] TABLESPACE DATAFILE|TEMPFILE datafile_clause[,datafile_clause] [E

Oracle 10g中用RMAN恢复临时表空间增强

我们知道在Oracle10gR2以前的版本中,如果使用RMAN恢复数据库,临时表空间的临时文件是不会自动恢复的. 这曾经引发了一系列的麻烦,很多DBA在恢复完成之后忘记添加临时文件,经常到应用出错时才能发现. 从Oracle10gR2开始,使用RMAN恢复数据库之后,Oracle会自动重新创建临时文件,由于临时文件是Sparse File,所以创建会非常迅速,通常你不会感觉得到. 以下是我曾经恢复的一段日志,其中记录了Oracle的恢复处理过程: Thu Sep 14 22:52:06 2006

SYSTEM 表空间管理及备份恢复

--============================= -- SYSTEM 表空间管理及备份恢复 --=============================       SYSTEM表空间是Oracle数据库最重要的一个表空间,存放了一些DDL语言产生的信息以及PL/SQL包.视图.函数.过程等,称之为数据字典, 因此该表空间也具有其特殊性,下面描述SYSTEM表空间的相关特性及备份与恢复.        一.SYSTEM表空间的管理     1.建议不存放用户数据,避免用户错误导致

只读表空间和临时表空间的恢复

        如果一个表空间是只读表空间,那么在该表空间上只能进行读操作而不能做DML操作,也就是说在这个表空间上的数据是不会变化的,因此就可以将该表空间的备份从日常的例行备份中取消,而只是在该表空间改为只读表空间之后做一次备份就够了.这不但减少了数据库系统的维护工作量还使系统的负荷减轻.还有操作只读表空间上的数据时不会产生重做操作也不用加锁,这也就提高了系统的效率.      在这里需要指出的是在将一个表空间改为只读表空间之前和之后,最好将数据库的控制文件做备份,因为表空间的状态的变化会写到

ORACLE临时表空间总结

临时表空间概念   临 时表空间用来管理数据库排序操作以及用于存储临时表.中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中 sort_area_size大小不够时,将会把数据放入临时表空间里进行排序.像数据库中一些操作: CREATE INDEX. ANALYZE.SELECT DISTINCT.ORDER BY.GROUP BY. UNION ALL. INTERSECT.MINUS.SORT-MERGE JOINS.HASH JOIN等都可能会用到临时表空间.当

Oracle Temp临时表空间及其故障处理

 Oracle Temp临时表空间及其故障处理  Oracle 11g中Temp临时表空间.文件的新特性  临时表空间是Oracle体系结构中比较特殊的结构.通常情境下,数据库使用者只需要设置对应的临时表空间(到用户),临时段分配等工作都是系统自动完成.当临时数据不需要时,Oracle后台进程SMON也会负责将临时段回收. 在Oracle的备份恢复体系中,临时文件的地位比较低.在进行备份动作时,RMAN都不会进行临时文件恢复.在恢复启动过程中,如果发现临时文件不存在,通常Oracle也会自动将临

Oracle 临时表空间使用注意

oracle|临时表 临时表空间使用注意:1.临时表空间 是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据)每个用户都有一个临时表空间2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理 3.分配用户单独临时表空间,一般是针对 大型产品数据库,OLTP数据库,数据库仓库对于小型产品不需要单独制定临时表空间,使用默认临时表空间