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

2023-10-10 21:58

本文主要是介绍临时表空间的管理与受损恢复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      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. 删除受损的临时表空间
  

这篇关于临时表空间的管理与受损恢复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/183351

相关文章

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.