【转载,整理】开启归档模式,归档日志已满处理

在ORACLE10g和11g版本,ORACLE默认的日志归档路径为闪回恢复区($ORACLE_BASE/flash_recovery_area)。对于这个路径,ORACLE有一个限制,就是默认只有2G的空间,而且 不只是归档日志 的默认路径,也是 备份文件闪回日志 的默认地址,这样的话归档日志锁使用的空间就达不到2G,在没有设置好这个路径大小的情况下,很多系统都遇到过归档日志满而无法归档导致数据库夯住的问题,可以使用下面的SQL语句去查看归档信息。

一.在数据库开启的情况下

  检测是否已开启归档

SQL> archive log list;

Database log mode              No Archive Mode

Automatic archival            Disabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence    19

Current log sequence          20

SQL>select log_mode from v$database;
如果为ARCHIVELOG则表示已成功归档

  查看,Disabled表示未开启归档

 二. 开启归档模式

  2.1 重新启动挂起状态

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.
SQL
> startup mount ORACLE instance started. --如果安装多个库,会报错,找不到句柄 --exit 再用管理员进入 Total System Global Area 1258291200 bytes Fixed Size 1219160 bytes Variable Size 318768552 bytes Database Buffers 922746880 bytes Redo Buffers 15556608 bytes Database mounted.

  行至此步,真正的问题才出现。mount了无数次始终startup不上,说是监听程序无法监听到你当前的例程了。当然,如果监听程序配置得当,此类问题是不会在这里出现的。既然是监听程序出现问题,那么就从这里入手进行解决。在oracle数据库的安装目录下(路径可能如:oracle\product\10.2.0\db_1\NETWORK\ADMIN)可以找到listener.ora这种参数文件,

 

  2.2 修改启动归档模式

SQL> alter database archivelog;
Database altered.

--打开数据库 SQL
> alter database open; 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

 

  2.3 修改归档日志目录及大小

    查看参数db_recovery_file_dest,存档终点USE_DB_RECOVERY_FILE_DEST默认就是闪回恢复区($ORACLE_BASE/flash_recovery_area),可以通过下面的SQL查看闪回恢复区的信息。

SQL> show parameter db_recover
NAME                        TYPE         VALUE
--------------------------  ----------- ----------------------------
db_recovery_file_dest       string      oracle\flash_recovery_area
db_recovery_file_dest_size  big integer   2G

  默认情况下,归档日志会存放到 闪回恢复区(oracle\flash_recovery_area)内,如果闪回恢复区已经使用到2G,归档日志就有可能无法继续归档,数据库夯住,通常的解决方法是增大闪回恢复区,可以用以下SQL实现。

Oracle 里面有个叫做spfile的东西,就是动态参数文件,里面设置了Oracle 的各种参数。所谓的动态,就是说你可以在不关闭数据库的情况下,更改数据库参数,记录在spfile里面。
语法:alter system set   参数=值  scope=spfile;
注意:ALTER SYSTEM 中 SCOPE=SPFILE/MEMORY/BOTH 的区别:
SCOPE = SPFILE : 此更改写入初始化参数文件,更改将在下次启动时生效。动态参数与静态参数都一样可以。也是静态参数唯一可以使用的方式。
SCOPE = MEMORY : 只在内存上修改,立即生效,但重启后将不再生效,因为并没有写入到初始化参数文件。只适用于动态参数,静态参数则不允许
SCOPE = BOTH : 默认选项,既写入到初始化参数文件,也在内存上修改,立即生效。同样也只适用于动态参数,静态参数则不允许
SQL> alter system set db_recovery_file_dest_size=3G;
系统已更改。

  即使用这种方法解决的当前燃眉之急,虽然闪回恢复区ORACLE会自动管理,如果闪回恢复区空间不足就会清理掉没用的数据,但是如果备份策略不是很完善,数据库非常繁忙的情况下,还有可能遇到这种情况,通常需要修改归档日志的路径,将归档日志放到其他不受限制的路径下来解决这个问题,可通过下面的SQL来修改归档日志的存放路径。

SQL> alter system set log_archive_dest_1='location=oracle\log1\archive_log';
系统已更改。

SQL
> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination oracle\log1\archive_log Oldest online log sequence 30 Next log sequence to archive 32 Current log sequence 32

  实际上从Oracle 10g开始,可以生成多份一样的日志,保存多个位置,以防不测,方法如下:

SQL>alter system set log_archive_dest_2='location=oracle\log2\archive_log';

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            oracle\log1\archive_log
Oldest online log sequence 30
Next log sequence to archive
32
Current log sequence
32

 

   2.4 修改日志文件命名格式:

//设置归档进程数
SQL> alter system set log_archive_max_processes = 5;

归档日志的名字受log_archive_format参数限制,可以通过下面的命令查看。

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;

 

   2.5归档当前重做日志

重做归档
alter system archive log current;

查看归档日志
select name from v$archived_log;
SQL> select name from v$archived_log;

NAME
--------------------------------------------------------------------------------
/oracle/archivelog1/archive_log1_5_927044427.dbf


注:
<
    alter system switch logfile 是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档前的重做日志,若自动归档没有打开,就不归档当前重做日志。)
    alter system archive log current 是归档当前的重做日志文件,不管自动归档有没有打都归档。
    主要的区别在于:
    alter system switch logfile 对单实例数据库或RAC中的当前实例执行日志切换;
    alter system archive log current  会对数据库中的所有实例执行日志切换。
>

    

  2.6重启数据库

shutdown immediate;
startup

  SQL> archive log list;
  Database log mode Archive Mode
  Automatic archival Enabled
  Archive destination /opt/app/oracle/archivelog2/archive_log
  Oldest online log sequence 9
  Next log sequence to archive 11
  Current log sequence 11

已开启归档

 

三.修改为非归档模式

  3.1以 mount状态启动数据库

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL
> startup mount ORACLE instance started. Total System Global Area 1603411968 bytes Fixed Size 2213776 bytes Variable Size 973080688 bytes Database Buffers 620756992 bytes Redo Buffers 7360512 bytes Database mounted.

 

  3.2 归档当前重做日志

  alter system archive log current;

    3.3 以 mount状态启动数据库

  3.4 更改归档模式为非归档模式

SQL> alter database noarchivelog;
Database altered.

SQL> alter database open;
Database altered.

SQL> archive log list;
Database log mode           No Archive Mode
Automatic archival           Disabled
Archive destination           /oracle/archivelog2/archive_log
Oldest online log sequence     9
Current log sequence           11

 

四. 归档日志检查

  4.1 首先看archiv log所在位置

  很有可能,归档日志存放位置不在 闪回恢复区

SQL> show parameter log_archive_dest;

会看到类似下面的结果
NAME                                    TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
log_archive_dest                  string 
log_archive_dest_1              string 
log_archive_dest_10            string

这时候如果value是空的,可以尝试

SQL> archive log list;

  如果已开启归档,则在Value列,可以看到日志路径,不过可能有多个日志副本,请注意

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest             string
log_archive_dest_1             string     location=/oracle/archivelog1/archive_log

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2             string     location=/oracle/archivelog2/archive_log

 

  4.2 使用情况

  -----这里可以看到闪回恢复区里的空间使用情况:

SQL> select * From v$flash_recovery_area_usage;

FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES 
------------ ------------------ ------------------------- --------------- 
CONTROLFILE                .13                        0              1 
ONLINELOG                  2.93                        0              3 
ARCHIVELOG                99.72                      0              122 
BACKUPPIECE                  0                        0              0 
IMAGECOPY                      0                        0              0 
FLASHBACKLOG                0                        0              0

 

  这里只是个案例,假如快满了,使用了超过99%的日志空间

 

  ------注意这一步才是真正查看归档空间的实际使用情况

  --本人没有测试过,后续再验证,参考原文中是这么说的

SQL> select * from v$recovery_file_dest;

NAME                         SPACE_LIMIT   SPACE_USED     SPACE_RECLAIMABLE    NUMBER_OF_FILES
----------- ---------- ----------------- ---- --------------- -------------------
/oracle/flash_recovery_area  2147483648     1804771840     0                     51

 

五. 已满处理

  archive log空间满可能会导致不能远程登录,因此ssh到服务器后,使用sqlplus sys/pass as sysdba登陆oracle。

  这里使用ORACLE自带的备份恢复工具RMAN

  5.1 设置环境变量 ORACLE_SID

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

 SET ORACLE_SID =jssbook

 

 

  5.2 启动RMAN连接数据库

  如果连接本地数据库,则使用

RMAN TARGET /
登录管理员账户

 

  如果远程连接,则使用RMAN TARGET SYS/CHANGE_ON_INSTALL@TESTDB,例如:RMAN TARGET SYS/sysadmin@orcl

  必须在建立连接时指定一个有效的网络服务名(Net Service Name),本地的tnsname.ora文件中必须已经建立了该网络服务名的正确配置

  5.3 查看归档日志状态

 

$ rman target /

Recovery Manager: Release 11.2.0.1.0 - Production on Mon Nov 7 17:26:27 2016 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. connected to target database: jssbook(DBID=1314906249) RMAN> list archivelog all; using target database control file instead of recovery catalog List of Archived Log Copies for database with db_unique_name WETALK ===================================================================== Key Thrd Seq S Low Time ------- ---- ------- - --------- 1 1 5 A 04-NOV-16 Name: /oracle/archivelog1/archive_log1_5_927044427.dbf 2 1 5 A 04-NOV-16 Name: /oracle/archivelog2/archive_log1_5_927044427.dbf

 

 

  5.3 手动删除归档日志

  方法一:

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

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 /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;就行了

 

 

【参考原文】http://blog.itpub.net/26508908/viewspace-1663566/

【参考原文】http://www.linuxidc.com/Linux/2014-02/96188.htm

【参考原文】http://blog.itpub.net/14293828/viewspace-1425794/

 

posted @ 2016-11-07 09:26  NewLife365  阅读(8512)  评论(0编辑  收藏  举报