zoukankan      html  css  js  c++  java
  • 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等都可能会用到临时表空间。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。

      临时表空间存储大规模排序操作(小规模排序操作会直接在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。

    管理临时表空间

    创建临时表空间

    下面是一个简单的创建临时表空间的例子,具体很多细节可以参考官方文档,这里省略,不做过多介绍。

    http://docs.oracle.com/cd/B10501_01/server.920/a96540/statements_75a.htm

    http://docs.oracle.com/cd/B28359_01/server.111/b28310/tspaces002.htm#ADMIN11366

    CREATE TEMPORARY TABLESPACE TMP 
    TEMPFILE '/u01/gsp/oradata/TMP01.dbf'
    SIZE 8G
    AUTOEXTEND OFF;

    增加数据文件

    当临时表空间太小时,就需要扩展临时表空间(添加数据文件、增大数据文件、设置文件自动扩展);有时候需要将临时数据文件分布到不同的磁盘分区中,提升IO性能,也需要通过删除、增加临时表空间数据文件。

    SQL> ALTER TABLESPACE TEMP
      2  ADD TEMPFILE '/u04/gsp/oradata/temp02.dbf'
      3  SIZE 4G 
      4  AUTOEXTEND ON
      5  NEXT 128M
      6  MAXSIZE 6G;
    Tablespace altered.
    
    
    SQL> ALTER  TABLESPACE TMP ADD TEMPFILE '/u03/eps/oradata/temp02.dbf' SIZE 64G AUTOEXTEND OFF;
    Tablespace altered.

    删除数据文件

    例如,我想删除临时表空间下的某个文件,那么我们有两种方式删除临时表空间的数据文件。

    方法1:

    SQL> ALTER TABLESPACE TEMP DROP TEMPFILE '/u01/app/oracle/oradata/GSP/temp02.dbf';
    Tablespace altered.

    注意:这种删除临时表空间的写法会将对应的物理文件删除。 

    方法2:

    SQL> ALTER DATABASE TEMPFILE '/u01/app/oracle/oradata/GSP/temp02.dbf' DROP INCLUDING DATAFILES; 
    Database altered.

    注意:删除临时表空间的临时数据文件时,不需要指定INCLUDING DATAFILES 选项也会真正删除物理文件,否则需要手工删除物理文件。

    调整文件大小

    如下例子,需要将临时数据文件从1G大小调整为2G

    SQL> ALTER DATABASE TEMPFILE  '/u01/app/oracle/oradata/GSP/temp02.dbf' RESIZE 2G;

    文件脱机联机

    SQL> ALTER DATABASE TEMPFILE '/u01/app/oracle/oradata/GSP/temp02.dbf' OFFLINE;
    Database altered.
    SQL> ALTER DATABASE TEMPFILE  '/u01/app/oracle/oradata/GSP/temp02.dbf' ONLINE;
    Database altered.

    默认临时表空间并不能脱机,否则会报错,如下所示

    SQL> ALTER TABLESPACE TEMP OFFLINE;

    ALTER TABLESPACE TEMP OFFLINE

    *

    ERROR at line 1:

    ORA-03217: invalid option for alter of TEMPORARY TABLESPACE

    设置文件自动扩展

    SQL> ALTER DATABASE TEMPFILE '/u01/app/oracle/oradata/GSP/temp03.dbf' AUTOEXTEND ON NEXT 100M  MAXSIZE UNLIMITED;

    移动重命名文件

    例如,我需要将/u01/app/oracle/oradata/GSP/temp4.dbf这个文件重命名为/u01/app/oracle/oradata/GSP/temp04.dbf

    1: 将临时表空间的临时文件脱机

    SQL> ALTER DATABASE TEMPFILE '/u01/app/oracle/oradata/GSP/temp4.dbf' OFFLINE;

    2:移动或重命名相关的临时文件

    mv /u01/app/oracle/oradata/GSP/temp4.dbf /u01/app/oracle/oradata/GSP/temp04.dbf'

    3: 使用脚本ALTER DATABASE RENAME FILE

    SQL> ALTER DATABASE RENAME FILE  '/u01/app/oracle/oradata/GSP/temp4.dbf' TO  '/u01/app/oracle/oradata/GSP/temp04.dbf';

    4: 将临时表空间的临时文件联机

    SQL> ALTER DATABASE TEMPFILE '/u01/app/oracle/oradata/GSP/temp04.dbf' ONLINE;
    Database altered.

    删除临时表空间

    SQL> DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

    注意:不能删除当前用户的默认表空间,否则会报ORA-12906错误

    SQL> DROP TABLESPACE TMP INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
    DROP TABLESPACE TMP INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS
    *
    ERROR at line 1:
    ORA-12906: cannot drop default temporary tablespace

    如果需要删除某一个默认的临时表空间,则必须先创建一个临时表空间,然后指定新创建的表空间为默认表空间,然后删除原来的临时表空间

    切换临时表空间

    1:查看旧临时表空间信息

    SELECT * FROM V$TEMPFILE

    SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS

    2:创建中转的临时表空间

    3:添加相应的数据文件

    4:切换临时表空间。

    ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TMP;

    5:删除旧的临时表空间数据文件

    DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

    6:如果有必要,重新指定用户临时表空间为新建的临时表空间

    ALTER USER ODS TEMPORARY TABLESPACE TMP;
    ALTER USER EDS TEMPORARY TABLESPACE TMP;
    ALTER USER ETL TEMPORARY TABLESPACE TMP;
    ALTER USER DM TEMPORARY TABLESPACE TMP;
     

    收缩临时表空间

    排序等操作使用的临时段,使用完成后会被标记为空闲,表示可以重用,占用的空间不会立即释放,有时候临时表空间会变得非常大,此时可以通过收缩临时表空间来释放没有使用的空间。收缩临时表空间是ORACLE 11g新增的功能。

    SQL> ALTER TABLESPACE TEMP SHRINK SPACE KEEP 8G;
    SQL> ALTER TABLESPACE TEMP SHRINK TEMPFILE '/u01/app/oracle/oradata/GSP/temp02.dbf'

    临时表空间过大的解决方法

    1.创建中转临时表空间
    create temporary tablespace temp1 tempfile '/oracle/oradata/secooler/temp02.dbf' size 512m reuse autoextend on next 1m maxsize unlimited;

    2.改变缺省临时表空间为刚刚创建的新临时表空间temp1
    alter database default temporary tablespace temp1;

    3.删除原临时表空间
    drop tablespace temp including contents and datafiles;

    4.重建临时表空间
    create temporary tablespace temp tempfile '/oracle/oradata/secooler/temp01.dbf' size 512m reuse autoextend on next 1m maxsize unlimited;

    5.重置缺省临时表空间为新建的temp表空间
    alter database default temporary tablespace temp;

    6.删除中转用临时表空间
    drop tablespace temp1 including contents and datafiles;

    代码层面解决oracle数据库临时表空间不断增长问题


    解决方法

    CLOB clob   = oracle.sql.CLOB.createTemporary(conn, false,oracle.sql.CLOB.DURATION_SESSION);
    用Oracle的CLOB类型保存,由于数据量很大,每一条数据都会声明一个CLOB数据,但是我在将数据入库以后并没有释放这个变量,这就造成了临时表空间的不断增长,解决这个问题只需要在使用完CLOB类型数据以后添加这样一句代码:
    clob.freeTemporary();
    这就可以手动释放掉CLOB占用的空间,临时表空间的使用量就稳定了。

  • 相关阅读:
    WPF DataGrid根据内容设置行颜色
    wpf: DataGridTextColumn 数字格式显示,编辑时取消格式(StringFormat)
    关于wpf,datagrid,双向数据绑定用法解决方案
    AddTransient、AddSingleton、AddScoped 三者都应该在什么场景下使用
    Fetch API 使用 fatch 函数调用 .netcore WebApi接口报错:Failed to fetch
    ASP.NET Core 中使用Session会话
    利用 Google Chart API 生成二维码大小不一致
    Razor Page 文件
    asp.net core 的 razor pages 如何使用ajax调用后台方法
    asp.net core 发布到iis session无法传递的问题
  • 原文地址:https://www.cnblogs.com/wjt-super/p/13254118.html
Copyright © 2011-2022 走看看