**************************************************************************************
归档日志空间不足现的问题的现象

软件正在操作,突然点击任何菜单无反应;
重启软后,长时间没反应或直接报数据库连接错误;

以下系统管理员操作
oracle用户登录操作系统,输入以下命令:
[oracle@OASERVER ~]$sqlplus
sql>connect cawy_cas/密码     //回车后出现报错
打开EM时(IE中输入http://10.31.1.200:1158/em),报ORA-00257、ORA-01033等错误;
oracle客户端工具(如:PLSQL Developer等)连接数据库时报ORA-00257、ORA-01033等错误;


**************************************************************************************
说明:因oracle归档日志还在开启,需定期检测归档日志占用空间大小,归归档日志达到一定比例时要及时清理,以防止归档日志

问题导致的oracle服务停止现象,从而影响系统。

1、检测oracle是否可以正常归档
oracle用户登录系统
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql>select * from v$log   

        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
    ---------- ---------- ---------- ---------- ---------- --- ----------------
    FIRST_CHANGE# FIRST_TIME
    ------------- ------------
             1          1        263   52428800          1 NO  CURRENT
          5924771 13-DEC-10

             2          1        261   52428800          1 YES INACTIVE
          5878129 12-DEC-10

             3          1        262   52428800          1 YES INACTIVE
          5899219 13-DEC-10

说明:上面列表可看出ARC列可正常归档,如果全部为NO,oracle将无法进行归档,此时oracle实例会自动关闭。    


2、查看FLASH_RECOVERY_AREA空间中各部分使用情况:

oracle用户登录系统
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql> select * from v$recovery_file_dest;  //查看FLASH_RECOVERY_AREA空间大小
sql>select * from v$flash_recovery_area_usage;  //查看FLASH_RECOVERY_AREA空间使用情况,下面可以看出已使用5.57%

       FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
       ------------ ------------------ ------------------------- ---------------
       CONTROLFILE                   0                         0               0
       ONLINELOG                     0                         0               0
       ARCHIVELOG                 5.57                         0              14
       BACKUPPIECE                   0                         0               0
       IMAGECOPY                     0                         0               0
       FLASHBACKLOG                  0                         0               0
       
       6 rows selected.

注意:当使用比例达到90%以上,就必须及时清理日志,否则oracle服务会随时停止。


**************************************************************************************
恢复oracle归档日志正常归档的方法

1、重构归档日志文件
   
此操作在oracle用户下完成
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql>shutdown immediate;
sql> startup  mount;
 sql>select * from v$log;

        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
    ---------- ---------- ---------- ---------- ---------- --- ----------------
    FIRST_CHANGE# FIRST_TIME
    ------------- ------------
             1          1        263   52428800          1 NO  CURRENT
          5924771 13-DEC-10

             2          1        261   52428800          1 NO INACTIVE
          5878129 12-DEC-10

             3          1        262   52428800          1 NO INACTIVE
          5899219 13-DEC-10

sql>alter database clear unarchived logfile group 1;  //执行此行时可能出错,如有报错直接把 1 修改成 2 或 3 之后

再执行1。
sql>alter database clear unarchived logfile group 2;
sql>alter database clear unarchived logfile group 3;
sql>shutdown immediate;
sql>startup;
说明:此操作之后需用root用户登录系统重启resin服务

增加一日志组
alter database add logfile group 4 ('+data','+fra','/u01/app/oracle/redo403.log')  size 50M;

添加日志文件最后一步 要切换日志 使用一次
切换:
  1* select  GROUP# ,SEQUENCE#,BYTES/1024/1024 ||'M' "log_size" ,STATUS  ,ARCHIVED from v$log
SQL> /

    GROUP#  SEQUENCE# log_size        STATUS           ARC
---------- ---------- --------------- ---------------- ---
         1          7 50M             CURRENT          NO
         2          5 50M             INACTIVE         NO
         3          6 50M             INACTIVE         NO
         4          0 50M             UNUSED           YES


alter system switch logfile ;
SQL> select  GROUP# ,SEQUENCE#,BYTES/1024/1024 ||'M' "log_size" ,STATUS  ,ARCHIVED from v$log
  2  ;

    GROUP#  SEQUENCE# log_size        STATUS           ARC
---------- ---------- --------------- ---------------- ---
         1          7 50M             ACTIVE           NO
         2          5 50M             INACTIVE         NO
         3          6 50M             INACTIVE         NO
         4          8 50M             CURRENT          NO

检查一下日志文件的状态
select GROUP#  ,MEMBER,STATUS from v$logfile order by 1
 
SQL> /

    GROUP# MEMBER                                        STATUS
---------- --------------------------------------------- -------
         1 +FRA/orcl/onlinelog/group_1.257.822001547
         1 /u01/app/oracle/redo103.log
         1 +DATA/orcl/onlinelog/group_1.261.822001539
         2 +FRA/orcl/onlinelog/group_2.258.822001559
         2 /u01/app/oracle/redo203.log
         2 +DATA/orcl/onlinelog/group_2.262.822001551
         3 +DATA/orcl/onlinelog/group_3.263.822001563
         3 /u01/app/oracle/redo303.log
         3 +FRA/orcl/onlinelog/group_3.259.822001571
         4 +FRA/orcl/onlinelog/group_4.260.822010503
         4 /u01/app/oracle/redo403.log

    GROUP# MEMBER                                        STATUS
---------- --------------------------------------------- -------
         4 +DATA/orcl/onlinelog/group_4.267.822010497

12 rows selected.


模拟:一个日志组有3个文件,损坏一个
select GROUP#  ,MEMBER,STATUS from v$logfile order by 1
 
SQL> /

    GROUP# MEMBER                                        STATUS
---------- --------------------------------------------- -------
         1 +FRA/orcl/onlinelog/group_1.257.822001547
         1 /u01/app/oracle/redo103.log
         1 +DATA/orcl/onlinelog/group_1.261.822001539

删除一个: rm -rf  /u01/app/oracle/redo103.log
startup force ---->可以成功!!!----》看警告日志文件
cd /u01/app/oracle/diag/rdbms/orcl/orcl/trace/
vim alert_orcl.log

Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_1450.trc:
ORA-00321: log 1 of thread 1, cannot update log file header
ORA-00312: online log 1 thread 1: '/u01/app/oracle/redo103.log'
Checker run found 1 new persistent data failures

修复一下:
删除坏的,添加好的
alter database drop logfile member '/u01/app/oracle/redo103.log';

alter database add logfile member '/u01/app/oracle/redo103.log' to group 1;

切换一下
alter system switch logfile ;
alter system switch logfile ;
alter system switch logfile ;
  1* select GROUP#  ,MEMBER,STATUS from v$logfile where group#=1
SQL> /

    GROUP# MEMBER                                        STATUS
---------- --------------------------------------------- -------
         1 +DATA/orcl/onlinelog/group_1.261.822001539
         1 +FRA/orcl/onlinelog/group_1.257.822001547
         1 /u01/app/oracle/redo103.log


2、增大闪存空间FLASH_RECOVERY_AREA大小   

此操作在oracle用户下完成
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql>shutdown immediate;
sql>startup mount;
sql>show parameter db_recovery_file_dest; //查看回闪恢复区的大小和存放目标
SQL> show parameter recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      +FRA
db_recovery_file_dest_size           big integer 3882M
alter system set db_recovery_file_dest_size =5G ;
alter system set db_recovery_file_dest='+FRA'; (磁盘组 文件目录)



   sql>alter system set db_recovery_file_dest_size = 10G(缺省是2G,可以根据实际情况调整大小,最大不能超过分区可用空

间大小,否则重启后自动恢复2G)

   sql>alter database open;

   说明:此操作之后需用root用户登录系统重启resin服务
[root@OASERVER /]cd /app/weaver/resin/bin/
[root@OASERVER bin]./stopresin.sh
[root@OASERVER bin]./startresin.sh

===================================================================
*****ORACLE 归档日志打开关闭方法***********
===================================================================
一 设置为归档方式
------------------------
view plaincopy to clipboardprint?
sql> archive log list;   #查看是不是归档方式  
sql> alter system set log_archive_start=true scope=spfile; #启用主动归档  
sql> alter system set log_archive_dest='location=/oracle/ora9/oradata/arch' scope=spfile;  
#设置归档路径  
sql> alter system set log_archive_dest_1='location=/oracle/ora9/oradata/arch1' scope=spfile;  
sql> alter system set log_archive_dest_2='location=/oracle/ora9/oradata/arch2' scope=spfile;  
#如果归档到两个位置,则可以通过上边方法实现  
sql> alter system set log_archive_format='arch_%d_%t_%r_%s.log'  #设置归档日记款式  
sql> shutdown immediate;  
sql> startup mount;    #打开控制文件,不打开数据文件  
sql> alter database archivelog; #将数据库切换为归档模式  
sql> alter database open;   #将数据文件打开  
sql> archive log list;   #查看此时是否处于归档模式  
查询以确定数据库位于archivelog模式中且归档过程正在运行  
sql> select log_mode from v$database;  
sql> select archiver from v$instance;  
 日志切换  
sql> alter system switch logfile;  
 这次日志切换将归档写到两个目标地,  
即第二步的/oracle/ora9/oradata/arch1和/oracle/ora9/oradata/arch1,要是要对目录确认  

在oracle情况中运行如下查询:  
sql> select name from v$archived_log;  
而后在操作系统中确认查询所列出的文件  


二 设置非归档方式
------------------------------------------

view plaincopy to clipboardprint?
sql> archive log list;   #查看是否是归档方式  
sql> alter system set log_archive_start=false scope=spfile; #禁用自动归档  
sql> shutdown immediate;  
sql> startup mount;    #打开控制文件,不打开数据文件  
sql> alter database noarchivelog; #将数据库切换为非归档模式  
sql> alter database open;   #将数据文件打开  
sql> archive log list;   #查看此时便处于非归档模式  
 

三 归档相关命令
---------------------------------------

view plaincopy to clipboardprint?
archive log stop;  
archive log start;  
archive log list;  
 
show parameters;  
show parameters log_archive_start;  
show parameters log_archive_max_process; #归档进程数  
alter system set log_archive_max_process=5; #将归档进程数改为5  
select * from v$bgprocess;    #检查后台进程