天天看點

開啟歸檔模式,歸檔日志已滿處理方法

在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 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';

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';

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

Total System Global Area 1603411968 bytes

Fixed Size            2213776 bytes

Variable Size          973080688 bytes

Database Buffers      620756992 bytes

Redo Buffers            7360512 bytes

  3.2 歸檔目前重做日志

  alter system archive log current;

    3.3 以 mount狀态啟動資料庫

  3.4 更改歸檔模式為非歸檔模式

SQL> alter database noarchivelog;

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是空的,可以嘗試

  如果已開啟歸檔,則在Value列,可以看到日志路徑,不過可能有多個日志副本,請注意

NAME                     TYPE     VALUE

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

log_archive_dest             string

log_archive_dest_1             string     location=/oracle/archivelog1/archive_log

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/

本文轉自xiaocao1314051CTO部落格,原文連結:http://blog.51cto.com/xiaocao13140/1936877 ,如需轉載請自行聯系原作者