• Oracle移除表空间的数据文件 ora-00604 ora-01426


    

    项目背景:在之前开发环境数据库管理比較乱,在表空间不足时仅仅是加入数据文件,測试完后数据己删除,但数据库表空间所占的空间不能回收,导致数据库的存储文件夹使用率达到97%以上实际使用仅仅有10%,迫切须要将不用空间进行回收.

    技术背景:Oracle不提供如删除表、视图一样删除数据文件的方法。数据文件是表空间的一部分,所以不能“移走”表空间。Oracle 10G R2開始,能够採用:Alter tablespace tablespace_name drop datafile file_name;来删除一个空数据文件,而且对应的数据字典信息也会清除:

    A.确认oracle版本号(我是以本机(windows)查看数据库版本号,測试环境为AIX操作系统,但数据库版本号一致),版本号满足能够直接删除数据文件

    select * from v$version;

    B.确认移除的数据文件

    a.确定须要移去的数据文件,能够用数据文件最大扩展的大小和对象多少综合评估一下,是否将这个文件进行移除

    扩展大小:

    select file_id,tablespace_name,max(t.block_id)*8192/1024/1024 from dba_extents t
    where tablespace_name = 'FERMATDATA'
    group by file_id,tablespace_name

    对象多少:

    select * from dba_extents t
    where t.file_id =10

    C.将数据文件里己有的对象move到其它表空间

        a.对于segment_type为TABLE的非分区表採用下面语句

    alter table bob_rwa3.db move tablespace ETLDATA;

    批量语句:

    select 'alter table '||t.owner||'.'||t.segment_name||' move tablespace ETLDATA ;' from dba_extents t
    where t.file_id =10
      and t.partition_name is null

        b.对于segment_type为TABLE的分区表採用下面语句(非复合分区)

    alter table BOB_RAY.T_TRANSITION_MATRIX move partition P199001010001 tablespace ETLDATA update global indexes ;

    批量脚本:

    select 'alter table '||t.owner||'.'||t.segment_name||' move partition '||t.partition_name||' tablespace ETLDATA update global indexes ;'
     from dba_extents t
    where t.file_id =10
      and t.partition_name is not null ;


      c.对于segment_type 为TABLE复合分区採用下面语句

    alter table BOB_RAY.LOG_TABLE move subpartition P199001010001_NULL tablespace IRM_DATA;

    批量脚本能够自己关联dba_tab_subpartitions表写出.

     d.对于segment_type为LOBSEGMENT或LOBINDEX能够採用下面语句,由于LOB类型的字段会自己主动生成存储数据和索引两部份(lobsegment,lobindex)

    1.查看找segment_type为lob的segment_name:

    select *  from dba_extents t
    where t.file_id =10
      and t.segment_type like '%LOB%';

    2.查看segment_type为LOB相应的column

    select * from dba_lobs t
    where t.segment_name like '%SYS_LOB0000145648C00003%'

    ;

    3.将segment_type为LOB类型转移到其它表空间,由于move table仅仅转移动非lob字段,所以须要运行下面语句

    alter table BOB_RAY.BIRT_RESOURCE move tablespace ETLDADA lob(CONTENT) store as (tablespace ETLDATA);

    批量脚本关联就可以写出

    由于本项目中数据表空间和索引表空间是分开的,所以这里不涉及索引的相关操作,假设有索引的情况预计与表的情况相似.

    D.确认数据文件是否为空

    a.查看dba_extents 是否有记录(须要没有记录)

    select *  from dba_extents t
    where t.file_id =10;

    b.查看dba_segments是否有记录(须要没有记录)

    select * from dba_segments t
    where t.header_file = 10

    注意:假设dba_segments有回收站的数据,那么在删除表空间数据文件时会报错 ora-00604 ora-01426

    c.删除回收站数据

    purge recyclebin;

    E.删除表空间相应的数据文件

    1.查看数据文件名

    select * from dba_data_files t
    where t.file_id = 10

    ;

    2.删除表空间数据文件

    alter tablespace FERMATDATA drop  datafile 'D:APPORADATARWADBFERMATDATA02.DBF';

    注意:当运行完语句时数据库server用df -g查看空间时没有变化,重新启动数据库后才干看到空间明显回收了

    F.指定表存储在固定的数据文件方法以(扩展)

    alter  table bob_ray.bis_risk_bucket allocate extent( datafie '/oracle/oradata/orcl/appdata.dbf' );

    此语句不会改变表中现有数据的存储,当新insert数据时才生效,

  • 相关阅读:
    勤于思考,善于总结,积极进取,认识自己
    notepad++中cmd运行中文乱码?
    notpad++使用cmd的快捷键设置
    深刻理解Table以及关于table的插件(1)
    单向链表
    apriori算法
    保存一个班级的学生信息
    测试list列表中append和insert的执行速度
    二分查找
    顺序查找法
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7134072.html
Copyright © 2020-2023  润新知