Oracle歸檔日誌空間不足引發的問題及解決方法


**************************************************************************************
歸檔日誌空間不足現的問題的現象

軟件正在操作,突然點擊任何菜單無反應;
重啓軟後,長時間沒反應或直接報數據庫連接錯誤;

以下系統管理員操作
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;    #檢查後臺進程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章