当ORACLE归档日志满后如何正确删除归档日志

当ORACLE 归档日志满了后,将无法正常登入ORACLE,需要删除一部分归档日志才能正常登入ORACLE。

一、首先删除归档日志物理文件,归档日志一般都是位于archive目录下,AIX系统下文件格式为“1_17884_667758186.dbf”,建议操作前先对数据库进行备份,删除时至少保留最近几天的日志用于数据库恢复。

二、把归档日志的物理文件删除后,我们就可以正常登入ORACLE了,但是还没完全把归档日志删除干净,ORACLE的controlfile中仍然记录着这些archivelog的信息,在oracle的OEM管理器中有可视化的日志展现出,当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,接下去我们要做的就是这个工作。

我们利用RMAN进行删除操作,操作步骤如下:(window客户端系统为例)

1.指定数据库实例

C:/Documents and Settings/Administrator>SET ORACLE_SID =orcl

2.连接数据库

C:/Documents and Settings/Administrator>RMAN TARGET SYS/sysadmin@orcl

3.查看归档日志的状态

RMAN> list archivelog all;

4.手工删除归档日志文件

RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

说明:
SYSDATA-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。
同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库
DELETE ARCHIVELOG from TIME 'SYSDATE-7'; 删除从7天前到现在的全部日志,慎用
UNIX/LINUX下也可以通过FIND找到7天前的归档数据,使用EXEC子操作删除
find /oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;
这样做仍然会在RMAN里留下未管理的归档文件
仍需要在RMAN里执行下面2条命令
crosscheck archivelog all;
delete expired archivelog all;
所以还不如上面的方法好用,不过用FIND的好处就是,可以在条件上,和EXEC子项上做很多操作,实现更复杂的功能

5.退出rman

RMAN> exit

附带说明:RMAN 是Oracle数据库软件自带的备份恢复工具,一种是类似于DOS,通过键盘操作的 命令行方式。

通过RMAN连接本地数据库非常简单,以 W indows 平台为例,进入到命令提示符界面:

  • C:/Documents and Settings/junsansi> SET ORACLE_SID =jssbook

    C:/Documents and Settings/junsansi> RMAN TARGET /

    Recovery Manager: Release 10.2.0.1.0 - Production on Tue Mar 17 21:12:17 2009

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    connected to target database: JSSBOOK (DBID=1415261003)

    RMAN>

  如上所示,使用RMAN连接本地数据库之前必须首先设置操作系统环境变量:ORACLE_SID,并指定该值等于目标数据库的实例名。如果本地库只有一个实例并已经设置了ORACLE_SID环境变量,则不需要再指定ORACLE_SID。RMAN会自动连接到默认实例。

  当然,你也可以先启动RMAN,然后再通过CONNECT命令来连接目标数据库,如下所示:

  • C:/Documents and Settings/junsansi> RMAN

    Recovery Manager: Release 10.2.0.1.0 - Production on Tue Mar 17 21:12:36 2009

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    RMAN> connect target /

    connected to target database: JSSBOOK (DBID=1415261003)

  本地连接允许使用操作系统验证,因此上述示例都不需要输入用户名和密码,不过如果本地没有启用操作系统身份验证的话,就必须指定具有相应权限的用户名和密码。

  需要注意,Linux/UNIX 环境下设置操作系统环境变量应使用 export 命令,另外ORACLE_SID必须为大写。例如:

  • [oracle@yans1  ~ ]$  export  ORACLE_SID=test08

    [oracle@yans1  ~ ]$  rman target /

    Recovery Manager: Release 10.2.0.3.0 - Production on Tue Mar 17 16:08:32 2009

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    connected to target database: TEST08 (DBID=3812548755)

    RMAN>

连接远程数据库

  如果要连接的目标数据库是一个远程数据库,那么必须在建立连接时指定一个有效的网络服务名(Net Service Name),本地的tnsname.ora文件中必须已经建立了该网络服务名的正确配置。连接示例如下:

  • C:/Documents and Settings/junsansi> RMAN TARGET SYS/CHANGE_ON_INSTALL@TESTDB

    Recovery Manager: Release 10.2.0.1.0 - Production on Tue Mar 17 16:12:32 2009

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    connected to target database: TESTDB (DBID=2220262593)

    RMAN>
        • oracle更改归档路径

          1.更改归档路径
          在ORACLE10G中,默认的归档路径为$ORACLE_BASE/flash_recovery_area。对于这个路径,
          ORACLE有一个限制,就是默认只能有2G的空间给归档日志使用,可以使用下面两个SQL语句去查看它的限制
          1. select * from v$recovery_file_dest;
          sql >show parameter db_recovery_file_dest(这个更友好直观一些)
          当归档日志数量大于2G时,那么就会由于没有更多的空间去容纳更多的归档日志会报无法继续归档的错误。
          如:
          RA-19809: limit exceeded for recovery files
          ORA-19804: cannot reclaim 10017792 bytes disk space from 2147483648 limit
          ARC0: Error 19809 Creating archive log file to '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2007_04_30/o1_mf_1_220_0_.arc'
          这时我们可以修改它的默认限制,比如说将它增加到5G或更多,也可以将归档路径重新置到别的路径,就不会有这个限制了。
          更改限制语句如下:
          alter system set db_recovery_file_dest_size=5368709102  (这里为5G 5x1024x1024x1024=5G)
          或者直接修改归档的路径即可
          SQL> alter system set log_archive_dest_1='location=/u01/archivelog' scope =both;
          2.更改归档模式
          sql> archive log list;
          sql> shutdown immediate;
          sql> startup mount;
          sql> alter database archivelog;
          sql> alter database open;
          sql> archive log list; ......
           
           
           
          方法二:
          我们都都知道在controlfile中记录着每一个archivelog的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的

          controlfile中仍然记录着这些archivelog的信息,在oracle的OEM管理器中有可视化的日志展现出,当我们手工清除 archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,也就是oracle并不知道这些文件已经不存在了!这时候我们要做手工的清除的话,下面我经过实验,可以尝试这种方法:

          1. 进入rman 

          2. connect target /

          3. crosscheck archivelog all;

          4. delete expired archivelog all;

          这时候我们再去OEM中看就一定看不到,如果你的从来没有做过这个动作的话,我们可以比较从这个动作前的controlfile后动作后的 controlfile的大小!

          ORACLE正确删除归档并回收空间的方法

          ORACLE正确删除归档并回收空间的方法

          一个ORACLE归档日志经常满,表现为/oraarchive 这个文件空间占用100%大家一定抱怨ORACLE为何没有归档维护工具,很多人直接删除了事,错了,ORACLE有,而且很智能,可以正确的删除归档和 FLASHBACK,不过切记,ORACLE归档日志对于ORACLE的数据恢复和备份非常重要,不到万不得已不要删除归档日志。

          删除归档日志的过程

          以ORACLE用户身份登录到数据库服务器主机或通过网络连接

          进入ORACLE数据备份工具

          rman target/

          或rman target/@orcl

          在命令窗口里面执行

          DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

          说明

          SYSDATA-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。

          同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库

          DELETE ARCHIVELOG FROM TIME 'SYSDATE-7';



          UNIX/LINUX下也可以通过FIND找到7天前的归档数据,使用EXEC子操作删除



          find /oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;

          这样做仍然会在RMAN里留下未管理的归档文件

          仍需要在RMAN里执行下面2条命令

          crosscheck archivelog all;

          delete expired archivelog all;

          所以还不如上面的方法好用,不过用FIND的好处就是,可以在条件上,和EXEC子项上做很多操作,实现更复杂的功能

          3.简要介绍一下report obsolete命令



          使用report obsolete命令报告过期备份

          RMAN> report obsolete;

          RMAN retention policy will be applied to the command

          RMAN retention policy is set to redundancy 1

          Report of obsolete backups and copies

          Type                 Key    Completion Time    Filename/Handle

          -------------------- ------ ------------------ --------------------

          Backup Set           125    01-NOV-04

          Backup Piece       125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

          Backup Set           131    04-NOV-04

          Backup Piece       131    04-NOV-04          /data1/oracle/orabak/full_AVATAR2_20041104_131

          ....

          Backup Set           173    06-DEC-04

          Backup Piece       173    06-DEC-04          /data1/oracle/orabak/full_AVATAR2_20041206_173

          Backup Set           179    11-DEC-04

          Backup Piece       179    11-DEC-04          /data1/oracle/orabak/arch544588206.arc

          .....

          Backup Piece       189    17-DEC-04          /data1/oracle/orabak/arch545106606.arc

          Backup Set           190    17-DEC-04

          Backup Piece       190    17-DEC-04          /data1/oracle/orabak/arch545106665.arc

          Backup Set           191    20-DEC-04

          Backup Piece       191    20-DEC-04          /data1/oracle/orabak/arch_AVATAR2_20041220_194

          Archive Log          2973   20-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2985.dbf

          Archive Log          2971   20-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2984.dbf

          .....

          Archive Log          2705   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2717.dbf

          Archive Log          2704   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2716.dbf

          Archive Log          2703   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2715.dbf

          Archive Log          2702   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2714.dbf



          4.使用delete obsolete命令删除过期备份:



          RMAN> delete obsolete;



          RMAN retention policy will be applied to the command

          RMAN retention policy is set to redundancy 1

          using channel ORA_DISK_1

          Deleting the following obsolete backups and copies:

          Type                 Key    Completion Time    Filename/Handle

          -------------------- ------ ------------------ --------------------

          Backup Set           125    01-NOV-04

          Backup Piece       125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

          ....

          Archive Log          2704   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2716.dbf

          Archive Log          2703   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2715.dbf

          Archive Log          2702   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2714.dbf



          Do you really want to delete the above objects (enter YES or NO)? yes

          deleted backup piece

          backup piece handle=/data1/oracle/orabak/full_AVATAR2_20041206_173 recid=173 stamp=544156241

          .....

          deleted archive log

          archive log filename=/opt/oracle/oradata/avatar2/archive/1_2715.dbf recid=2703 stamp=545108268

          deleted archive log

          archive log filename=/opt/oracle/oradata/avatar2/archive/1_2714.dbf recid=2702 stamp=545107659

          Deleted 286 objects





          RMAN> crosscheck archivelog all;



          released channel: ORA_DISK_1

          allocated channel: ORA_DISK_1

          channel ORA_DISK_1: sid=19 devtype=DISK

          specification does not match any archive log in the recovery catalog





          5 在rman中用crosscheck检查归档日志,2个归档日志都是失败的:

          RMAN> crosscheck archivelog all;



          释放的通道: ORA_DISK_1

          分配的通道: ORA_DISK_1

          通道 ORA_DISK_1: sid=14 devtype=DISK

          对归档日志的验证失败

          存档日志文件名 =D:ORACLEORADATATESTARCHIVE1_47.DBF 记录 ID=1 时间戳 =572866

          683

          对归档日志的验证失败

          存档日志文件名 =D:ORACLEORADATATESTARCHIVE11_48.DBF 记录 ID=2 时间戳 =57286

          6931

          已交叉检验的 2 对象



          6 试着同步一下,看行不行,结果不行,crosscheck还是失败:

          RMAN> resync catalog;



          正在启动全部恢复目录的 resync

          完成全部 resync



          RMAN> crosscheck archivelog all;



          释放的通道: ORA_DISK_1

          分配的通道: ORA_DISK_1

          通道 ORA_DISK_1: sid=14 devtype=DISK

          对归档日志的验证失败

          存档日志文件名 =D:ORACLEORADATATESTARCHIVE1_47.DBF 记录 ID=1 时间戳 =572866

          683

          对归档日志的验证失败

          存档日志文件名 =D:ORACLEORADATATESTARCHIVE11_48.DBF 记录 ID=2 时间戳 =57286

          6931

          已交叉检验的 2 对象



          7 用list expired看看是否有失效的archive log,证明没有失效的archive log:

          RMAN> list expired archivelog all;



          说明与恢复目录中的任何存档日志均不匹配



          8 更改语言环境试试,结果再次crosscheck,2个archive log 都成功了:

          RMAN> exit





          恢复管理器完成。



          C:>set nls_lang=american_america.zhs16gbk



          C:>rman catalogrman/rman@safetarget /



          Recovery Manager: Release 9.2.0.1.0 - Production



          Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.



          connected to target database: TEST (DBID=1870953724)

          connected to recovery catalog database



          RMAN> crosscheck archivelog all;



          allocated channel: ORA_DISK_1

          channel ORA_DISK_1: sid=9 devtype=DISK

          validation succeeded for archived log

          archive log filename=D:ORACLEORADATATESTARCHIVE1_47.DBF recid=1 stamp=57286

          6683

          validation succeeded for archived log

          archive log filename=D:ORACLEORADATATESTARCHIVE11_48.DBF recid=2 stamp=5728

          66931

          Crosschecked 2 objects


          ====================================
          oracle隐藏参数字典 x$ksppi x$ksppstvl 
          oracle的隐藏参数字典是 x$ksppi,x$ksppstvl基表中,有关隐含参数说明,可以查询这个基表

          SQL> desc x$ksppi
          名称 是否为空? 类型
          ------    -----
          ADDR      RAW(4)
          INDX      NUMBER
          INST_ID   NUMBER
          KSPPINM   VARCHAR2(64)
          KSPPITY   NUMBER
          KSPPDESC  VARCHAR2(64)
          KSPPIFLG  NUMBER

          SQL>

          SQL> desc x$ksppcv
          名称 是否为空? 类型
          ----------------------------------------- -------- ----------------------------

          ADDR RAW(4)
          INDX NUMBER
          INST_ID NUMBER
          KSPPSTVL VARCHAR2(512)
          KSPPSTDF VARCHAR2(9)
          KSPPSTVF NUMBER
          KSPPSTCMNT VARCHAR2(255)

          SQL>

          比如我现在要查询隐含参数
          _allow_resetlogs_corruption /// 这个参数说明允许数据库在不一致的条件下,进行数据库打开


          查看隐含参数的值,方式是


          SQL> col ksppinm format a30
          SQL> col ksppstvl format a30
          SQL> select ksppinm,ksppstvl from x$ksppcv cv,x$ksppi pi where cv.indx=pi.indx a
          nd pi.ksppinm like '_allow%';

          KSPPINM KSPPSTVL
          ------------------------------ ------------------------------
          _allow_error_simulation FALSE
          _allow_resetlogs_corruption FALSE
          _allow_terminal_recovery_corru FALSE
          ption

          _allow_read_only_corruption FALSE

          SQL>

          这个参数一般在数据库正常无法恢复了,可以用它来强行打开数据库,把数据文件先备份出来,这是
          一个比较好的办法。
        • 1
          点赞
        • 5
          收藏
          觉得还不错? 一键收藏
        • 0
          评论

        “相关推荐”对你有帮助么?

        • 非常没帮助
        • 没帮助
        • 一般
        • 有帮助
        • 非常有帮助
        提交
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值