当前位置: 首页 > 数据库 > oracle >

oracle开启归档,归档配置策略,归档空间满清理方法

一、 查看是否开启归档模式

 

[oracle@db ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Wed Oct 17 07:24:38 2018

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

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

SQL> archive log list #查看是否开启,下文显示未开启

Database log mode       No Archive Mode

Automatic archival       Disabled

Archive destination       USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     15

Current log sequence       17

SQL> 

 

二、归档保留策略
 

CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY
这里不是自动删除归档。而是删除的时候确认归档已经被DATA GUARD、流环境所应用。这个功能的目的是避免删除其他功能所需要的归档日志。
 

     Oracle 11g中对于归档日志的删除,除了遵循RMAN保留策略外,也可以通过RMAN来配置归档日志的删除策略,也就是归档日志何时可以被删除。
归档日志删除策略适用于所有归档位置(使用快速闪回区FRA/不使用FRA)。本文主要描述归档日志删除策略并给出了具体的演示。
 
 
1、关于归档日志删除策略
      也就是哪些归档日志符合删除策略能够被删除,如前所述,归档位置适用于所有归档位置(使用快速闪回区FRA/不使用FRA)
      当启用该策略后,如归档日志存在于FRA中,则Oracle会尽可能根据保留他们,一旦FRA空间告急,则Oracle会根据归档日志删除策略自动删除
      对于不在FRA中的归档日志,需要手动使用delete obsolete或delete archivelog方式来删除日志
      无论归档日志存在于FRA内或外,都可以通过BACKUP ... DELETE INPUT or DELETE ARCHIVELOG方式来删除
      该策略不适用于使用LogMiner方式从主数据库传送到逻辑standby生成的外部归档日志文件,因为这些日志文件不能够在逻辑standy上备份或恢复
  
 
2、配置归档日志删除策略
     使用下面的方式来配置归档日志删除策略
         configure archivelog deletion policy to backed up 2 times to sbt;
         configure archivelog deletion policy to backed up 1 times to device type disk;
         configure archivelog deletion policy to applied on standby;
         configure archivelog deletion policy to shipped on standby;
         configure archivelog deletion policy clear;
    对于Oracle 10g没有该特性,但有一个类似的用于配置归档日志被备份次数,如下;
         configure archivelog backup copies for device type disk to ${archiveretention};
  
  
3、禁用归档日志删除策略
      缺省情况下,该策略被设置为none。也就是说根据RMAN备份保留策略,对于FRA中的归档日志,被备份过一次(到磁盘或磁带)即符合条件被删除
     如果Oracle不再需要当前的归档日志用于保证数据库时点恢复或数据库闪回,则RMAN备份保留策略认为当前日志为obsolete
     在SYSDATE-'DB_FLASHBACK_RETENTION_TARGET'之后创建的归档日志是需要被保留的
 
 
4、启用归档日志删除策略
     一旦启用该策略,则指定的归档日志被备份数量达到设定值后,这些归档日志能够被删除
     BACKUP ARCHIVELOG 会在未超出指定备份数的情况下(比如设置为2)备份归档日志到指定位置,如超出2次,则RMAN会跳过这些备份过2次的归档日志
     对于上述的情形,可以为BACKUP ARCHIVELOG适用force选项来强制备份归档日志
     如果启用该策略且配置为APPLIED ON STANDBY子句,则所有强制standby位置被apply后,这些归档日志会被RMAN删除 
     如果启用该策略且配置为SHIPPED ON STANDBY子句,则所有强制standby位置被成功传送后,这些归档日志会被RMAN删除 


 

三、开启归档模式

 

SQL> shutdown immediate #关闭实例

Database closed.

Database dismounted.

ORACLE instance shut down.

 

SQL> startup mount#启动到mount

ORACLE instance started.

 

Total System Global Area 1286066176 bytes

Fixed Size    2228024 bytes

Variable Size  352321736 bytes

Database Buffers  922746880 bytes

Redo Buffers    8769536 bytes

Database mounted.

SQL> 

 

SQL> alter database archivelog; #开启归档模式

Database altered.

 

SQL> archive log list; #查看归档模式

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination       USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     15

Next log sequence to archive   17

Current log sequence       17

SQL> 

 

SQL> alter database open; #打开数据库

Database altered.

 

 

SQL> show parameter db_recovery

# 查看参数db_recovery_file_dest归档日志目录(默认闪回恢复区)、db_recovery_file_dest_size大小

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string      /u01/app/oracle/fast_recovery_area

db_recovery_file_dest_size           big integer 2G

 

默认情况下,归档日志会存放到USE_DB_RECOVERY_FILE_DEST(闪回恢复区flash_recovery_area)内,如果闪回恢复区已满,归档日志就有可能无法继续归档,通常的解决方法是增大闪回恢复区,可以用以下SQL实现:

 

SQL> alter system set db_recovery_file_dest_size=3G;

 

###################################################################

Oracle里面有个叫做spfile的东西,就是动态参数文件,里面设置了Oracle的各种参数。所谓的动态,就是说你可以在不关闭数据库的情况下,更改数据库参数,记录在spfile里面。

语法:alter system set  参数=值  scope=spfile;

注意:ALTER SYSTEM 中 SCOPE=SPFILE/MEMORY/BOTH 的区别:

SCOPE = SPFILE : 此更改写入初始化参数文件,更改将在下次启动时生效。

SCOPE = MEMORY : 只在内存上修改,立即生效,但重启后将不再生效,因为并没有写入到初始化参数文件。只适用于动态参数,静态参数则不允许。

SCOPE = BOTH :   默认选项,既写入到初始化参数文件,也在内存上修改,立即生效。同样也只适用于动态参数,静态参数则不允许

###################################################################

 

闪回恢复区ORACLE会自动管理,如果空间不足就会清理掉没用的数据。另外,还可以修改归档日志的路径,将归档日志放到其他不受限制的路径下来解决这个问题,即通过下面的SQL来修改归档日志的存放路径:

 

SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/archivelog';

 

SQL> archive log list;

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination       /u01/app/oracle/archivelog

Oldest online log sequence     15

Next log sequence to archive   17

Current log sequence       17

 

从10g开始,可以设置多个归档路径,生成多份一样的日志:

SQL> alter system set log_archive_dest_2 = 'location=/home/oracle/archive_log';

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            /home/oracle/archive_log

Oldest online log sequence     15

Next log sequence to archive   17

Current log sequence           17

 

# 查看归档日志位置

SQL> show parameter log_archive_dest;

 

NAME                                 TYPE        VALUE

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

log_archive_dest                     string

log_archive_dest_1                   string      location=/u01/app/oracle/archivelog

log_archive_dest_10                  string

log_archive_dest_11                  string

log_archive_dest_12                  string

log_archive_dest_13                  string

log_archive_dest_14                  string

log_archive_dest_15                  string

log_archive_dest_16                  string

log_archive_dest_17                  string

 

NAME                                 TYPE        VALUE

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

log_archive_dest_18                  string

log_archive_dest_19                  string

log_archive_dest_2                   string      location=/home/oracle/archive_log

 

 

# 归档日志格式

SQL> show parameter log_archive_format 

 

NAME                                 TYPE        VALUE

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

log_archive_format                   string      %t_%s_%r.dbf

 

SQL> alter system set log_archive_format ="archive_%t_%s_%r.log" scope=spfile;

System altered.

 

# 归档日志进程数

SQL> show parameter log_archive_max_process

 

NAME                                 TYPE        VALUE

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

log_archive_max_processes            integer     4

 

SQL> alter system set log_archive_max_processes = 5;

System altered.

 

SQL> show parameter log_archive_max_process

NAME                                 TYPE        VALUE

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

log_archive_max_processes            integer     5

 

 

 

# 归档当前重做日志

SQL> alter system archive log current;

 

SQL> select name from v$archived_log;

NAME

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

/u01/app/oracle/archivelog1_17_989497127.dbf

/home/oracle/archive_log1_17_989497127.dbf

 

####################################################################################

alter system switch logfile 是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档前的重做日志,若自动归档没有打开,就不归档当前重做日志。)

alter system archive log current 是归档当前的重做日志文件,不管自动归档有没有打都归档。

 

主要的区别在于:

alter system switch logfile 对单实例数据库或RAC中的当前实例执行日志切换;

alter system archive log current  会对数据库中的所有实例执行日志切换。

###################################################################################

 

# 查看闪回恢复区空间使用情况

SQL> set linesize 300

SQL> select * from v$flash_recovery_area_usage;

 

FILE_TYPE     PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

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

CONTROL FILE      0 00

REDO LOG      0 00

ARCHIVED LOG      0 00

BACKUP PIECE      0 00

IMAGE COPY      0 00

FLASHBACK LOG      0 00

FOREIGN ARCHIVED LOG      0 00

 

SQL> col name for a50

SQL> select * from v$recovery_file_dest;

 

NAME   SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES

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

/u01/app/oracle/fast_recovery_area    43222302720  0  0

 

 

 

三、修改为非归档模式

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

 

SQL> startup mount

ORACLE instance started.

 

Total System Global Area 1286066176 bytes

Fixed Size                  2228024 bytes

Variable Size             352321736 bytes

Database Buffers          922746880 bytes

Redo Buffers                8769536 bytes

Database mounted.

 

SQL> alter database noarchivelog;

 

SQL> alter database open;

 

SQL> archive log list;

Database log mode              No Archive Mode

Automatic archival             Disabled

Archive destination            /home/oracle/archive_log

Oldest online log sequence     16

Current log sequence           18

四、归档空间满的处理方法

 

这里列出两个手动删除归档日志的方法:

 

4.1、先手动删除物理的归档日志,然后执行下列命令

 

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

 

说明:SYSDATA-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库。DELETE ARCHIVELOG from TIME 'SYSDATE-7'; 删除从7天前到现在的全部日志,慎用

 

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

 

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

find /mnt/oradb/archivelog -type f -mtime +1 -exec rm {} ;

然后会在RMAN里留下未管理的归档文件,要在RMAN里执行下面2条命令:

crosscheck archivelog all; 

delete expired archivelog all; 

最后再输入一次crosscheck archivelog all;就行了


其他相关介绍:

crosscheck archivelog all和crosscheck backup of区别

crosscheck archivelog all; 验证的是DB的归档日志即log_archive_dest参数指定位置的文件,当手工删除了归档日志以后,Rman备份会检测到日志缺失,从而无法进一步继续执行。所以此时需要手工执行crosscheck过程,之后Rman备份可以恢复正常。

crosscheck backup of archivelog all;验证的是用rman 备份归档日志的备份文件,执行完这个命令后可用delete expired archivelog;删除状态为expired的备份文件


 

1、下面的命令用于校验归档日志的有效性,列出无效的归档日志,以及以何种方式清除归档日志,列出几种常用的:  
crosscheck archivelog all;                                        --->校验日志的可用性
list expired archivelog all;                                      --->列出所有失效的归档日志 
delete archivelog until sequence 16;                              --->删除log sequence为16及16之前的所有归档日志
delete archivelog all completed before 'sysdate-7';               --->删除系统时间7天以前的归档日志,不会删除闪回区有效的归档日志
delete archivelog all completed before 'sysdate - 1';             --->同上,1天以前的
delete archivelog from time 'sysdate-1';                          --->注意这个命令,删除系统时间1天以内到现在的归档日志
delete noprompt archivelog all completed before 'sysdate';        --->该命令清除所有的归档日志
           
2、删除归档脚本
########################################################
#Author : Jianjun Zhang
#DATE   : 2017/03/23 
########################################################
#!/bin/bash
DATE=`date +%Y%m%d%H`
source /home/oracle/.bash_profile
$ORACLE_HOME/bin/rman log=/u01/log/rman_${DATE}.log <<EOF
connect target/
run{
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog all completed before 'sysdate-1'; 
}
exit;
EOF
exit
 
 
注意:在无法清除以前的归档日志的情况,可以先手工删除,然后在执行上面的shell脚本
 
3、定时任务,每小时执行一次
[oracle@rac1 ~]$ crontab -e
01 * * * * sh /u01/archivelog_delete.sh > /u01/log/delete_arch_log20 2>&1 &
------分隔线----------------------------