Oracle數據庫開啓歸檔日誌和補充日誌

Oracle數據庫開啓歸檔日誌和補充日誌

項目中要對Oracle的redo.log進行解析,實現數據同步,由於項目運行機制,需要開啓歸檔日誌和補充日誌。

重做日誌的概念

重做日誌文件通過記錄數據的所有改變情況對系統或介質故障提供恢復機制。
1)重做日誌文件以組的形式存在
2)一個oracle數據庫至少需要兩組,每組至少有一文件
3)在一組裏的每一重做日誌文件叫做成員
相關文章介紹的很詳細:重做日誌官方文檔介紹

歸檔日誌

歸檔日誌(Archive Log)是非活動的重做日誌備份.通過使用歸檔日誌,可以保留所有重做歷史記錄,當數據庫處於ARCHIVELOG模式並進行日誌切換式,後臺進程ARCH會將重做日誌的內容保存到歸檔日誌中.當數據庫出現介質失敗時,使用數據文件備份,歸檔日誌和重做日誌可以完全恢復數據庫。

ARCHIVELOG模式

當ORACLE數據庫運行在ARCHIVELOG模式時,所有的事務重做日誌都將保存.這意味着對數據庫進行的所有事務都留有一個備份,儘管重做日誌以循環方式工作,但在一個重做日誌被覆蓋前均將爲其建立一個副本.在重做日誌文件複製完成之前,ORACLE數據庫將停止一切新的操作,在舊的事務記錄完成之前ORACLE不對其進行覆蓋.有了所有事務的副本,數據庫就可以從所有類型的失敗中恢復,包括用戶錯誤或磁盤崩潰.這是一種最安全的數據庫工作方式。

啓動歸檔日誌

  1. 登錄sysdba賬戶,本例子中的Oracle是綁定的服務器,直接在對應服務器上用下面的命令登錄:
sqlplus / as sysdba
  1. 查看歸檔信息
SQL> archive log list
//輸出結果
Database log mode           No Archive Mode
Automatic archival           Disabled
Archive destination           USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     244
Current log sequence           246

No Archive Mode表示當前數據庫未開啓歸檔模式
3. 設置歸檔目錄
oracle默認使用閃回恢復區DB_RECOVERY_FILE_DEST作爲歸檔路徑,但是閃回恢復區在安裝過程中有限制其大小,如果閃回恢復區滿了,歸檔日誌會因爲無法寫入而導致數據庫阻塞。解決辦法是可以通過增加閃回區大小或者修改歸檔日誌的路徑。修改log_archive_dest_1參數即可修改歸檔日誌路徑(pfile/spfile中參數db_recovery_file_dest指定的目錄將無效),從Oracle 10g開始,可以生成多份一樣的日誌,保存多個位置,加強安全性,多個位置通過設置不同的log_archive_dest_{n}參數實現,archive log list輸出中的Archive destination路徑只顯示最新修改的路徑。

SQL> show parameter log_archive_dest_1
//輸出結果
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1		     string	 
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
log_archive_dest_18		     string
log_archive_dest_19		     string

我這裏是修改歸檔路徑爲/oradata/archivelog

SQL> alter system set log_archive_dest_1='location=/oradata/archivelog' scope=spfile;
//輸出結果
System altered.

該修改重啓後生效
4. 修改歸檔日誌格式

SQL> alter system set log_archive_format='ARC%S_%R.%T_%D.dbf' scope=spfile;
//輸出結果
System altered.

修改後歸檔日誌的命名樣式爲:ARC0000002549_0993570162.0001_e7cda172.dbf;該修改重啓後生效
5. 開啓歸檔日誌
需要在mount狀態下開始數據庫歸檔,重啓至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          989857904 bytes
Database Buffers      603979776 bytes
Redo Buffers            7360512 bytes
Database mounted.

開啓數據庫歸檔:

SQL> alter database archivelog;
//輸出結果
Database altered.

查看歸檔結果:

SQL> archive log list
//輸出結果
Database log mode           Archive Mode
Automatic archival           Enabled
Archive destination           /u01/app/oracle/archive_log
Oldest online log sequence     244
Next log sequence to archive   246
Current log sequence           246

開啓強制歸檔:

ALTER DATABASE FORCE LOGGING;

打開數據庫:

SQL> alter database open;

Database altered.

6.確認數據庫爲歸檔模式

SQL> select log_mode from v$database;
//輸出結果
LOG_MODE
------------
ARCHIVELOG

SQL> select archiver from v$instance;

ARCHIVE
-------
STARTED

7.強制日誌切換,確認是否開啓歸檔成功
先查看當前歸檔日誌視圖和歸檔日誌路徑:

SQL> select name from v$archived_log;
//輸出結果
no rows selected
[oracle@zml-rhel6 archive_log]$ ll
//輸出結果
total 0

如結果所示,沒有歸檔日誌,下面執行強制日誌切換:

SQL> alter system switch logfile;
//輸出結果
System altered.

再次查看視圖

SQL> select name from v$archived_log;
//輸出結果
NAME
--------------------------------------------------------------------------------
/oradata/archivelog/ARC0000002429_0993570162.0001_e7cda172.dbf

有歸檔日誌產生,驗證歸檔日誌開啓成功

歸檔日誌的清理

歸檔日誌非常佔用物理空間,應定時清理,歸檔日誌的清理分爲兩部分:
1.物理刪除歸檔日誌
該方式是利用linux的腳本和crontab定時任務來查找n天前的日誌進行刪除,首先編寫日誌刪除腳本:

[oracle@i-F44CBDC1 shell]$ vim deleteArchiveLog.sh
//輸入如下指令,意爲刪除5天前的所有文件
find /oradata/archivelog -mtime +5 -name "*.*" -exec rm -Rf {} \;

保存腳本後,根據實際情況賦予權限或組別,然後操作crontab,本例子均在oracle用戶下創建定時任務:

[root@i-F44CBDC1 ~]# crontab -e
//輸入如下指令,意爲每天0點35分執行刪除歸檔日誌腳本,並將腳本的執行記錄輸出到log文件中
35 0 * * * sh /usr/local/shell/deleteArchiveLog.sh >>/var/local/deletearchivelog.log

保存後,定時任務會到時間執行腳本。
2. 雖然物理刪除了歸檔日誌文件,但是控制文件中依然會有這些日誌的記錄,下面需要在控制文件中清理這些歸檔日誌,利用RMAN進行清理。

//rman登錄
rman target/

查看過期日誌:

RMAN> list expired archivelog all;
//輸出結果
specification does not match any archived log in the repository

信息中顯示沒有過期日誌,這是因爲需要先檢查歸檔日誌的有效性,再進行刪除:

RMAN> crosscheck archivelog all;
//輸出結果
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=70 device type=DISK
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002448_0993570162.0001_e7cda172.dbf RECID=415 STAMP=1026952512
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002449_0993570162.0001_e7cda172.dbf RECID=416 STAMP=1026952520
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002450_0993570162.0001_e7cda172.dbf RECID=417 STAMP=1026952542
validation succeeded for archived log

再次查看過期的歸檔日誌,rm刪除的文件便被標記爲了過期日誌:

RMAN> list expired archivelog all;
//輸出結果
List of Archived Log Copies for database with db_unique_name ORCLWHS
=====================================================================

Key     Thrd Seq     S Low Time 
------- ---- ------- - ---------
      1    606     X 04-JUN-18
        Name: /oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf
      1    607     X 04-JUN-18
        Name: /oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf
      1    608     X 04-JUN-18
        Name: /oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf

刪除過期的歸檔日誌:

RMAN> delete expired archivelog all;
//輸出結果
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=446 device type=DISK
List of Archived Log Copies for database with db_unique_name ORCLWHS
=====================================================================

Key     Thrd Seq     S Low Time 
------- ---- ------- - ---------
       1    606     X 04-JUN-18
        Name: /oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf
      1    607     X 04-JUN-18
        Name: /oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf
      1    608     X 04-JUN-18
        Name: /oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf
//詢問是否要刪除上述文件,輸入YES
Do you really want to delete the above objects (enter YES or NO)? yes
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf RECID=1 STAMP=977949943
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf RECID=2 STAMP=977954446
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf RECID=3 STAMP=977954551
Deleted 3 EXPIRED objects

再次查詢過期的歸檔日誌:

RMAN> list expired archivelog all; 
//輸出結果
specification does not match any archived log in the repository

我們可以將上述流程封裝爲shell腳本,用定時任務執行,首先創建腳本:

[oracle@i-F44CBDC1 shell]$ vim clearArchiveLog.sh
//輸入如下內容
PATH=$PATH:$HOME/bin

export PATH
export NLS_LANG=AMERICAN_AMERICA.zhs16gbk
export ORACLE_SID=zjfwjyptdb
export ORACLE_BASE=/oracle/app
export ORACLE_HOME=/oracle/app/database/ora11g
export SQLPATH=/home/oracle/scripts
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib:
export PATH=$ORACLE_HOME/bin:/usr/bin:/usr/ccs/bin:/etc:/bin:/usr/openwin/bin:\
/usr/local/bin:/usr/X11R6/bin:/oracle/crs/bin:$PATH
umask 022

$ORACLE_HOME/bin/rman target / log=/home/oracle/del_arch$(date +%Y-%m-%d).log <<EOF
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog all completed before 'sysdate - 5';
exit;
EOF

保存腳本,然後創建定時任務:

[oracle@i-F44CBDC1 shell]$ crontab -e
//輸入如下內容,意爲0點40執行clearArchiveLog.sh,並將執行信息輸出到archivelogrmanlog.log文件中

40 0 * * * sh /usr/local/shell/clearArchiveLog.sh >>/var/local/archivelogrmanlog.log

保存退出,這樣就可以定時清理控制文件中的歸檔日誌記錄了。
參考文章:https://www.cnblogs.com/ZeroTiny/p/9135247.html

補充日誌

附加日誌(supplemental log)可以指示數據庫在日誌中添加額外信息到日誌流中,用以支持基於日誌的工具,可以在數據庫和表上設置。本文只介紹數據庫級別的設置,而數據庫級的設置,又分兩類:最小附加日誌和標識鍵日誌,可通過以下命令查看補充日誌開啓情況:

select supplemental_log_data_min min,supplemental_log_data_pk pk,supplemental_log_data_ui ui,supplemental_log_data_fk fk,supplemental_log_data_all allc from v$database;

查詢結果如下:
在這裏插入圖片描述
NO爲未開啓,YES爲已開啓。

  1. 最小附加日誌(minimal supplemental logging):
    啓用最小日誌可以確保LogMiner(或其他任何基於LogMiner的產品)可以支持行鏈接、簇表、索引組織表等。
    DATA選項啓用最小附加日誌。
    命令爲:
alter database add supplemental log data;
  1. 標識鍵日誌(identification key logging):
    DATA(primary key,unique,foreign key,all) columns選項啓用最小日誌及列數據日誌,可根據需求開啓主鍵,唯一,外鍵,全字段。
    在源庫日誌爲變化來源同步其他數據庫的情況下,比如邏輯備用數據庫,受影響的數據行必須以列數據標識(而不是rowid),必須啓用此種附加日誌。
    命令爲:
alter database add supplemental log data(primary key,unique,foreign key,all) columns;

在缺省情況下,Oracle不啓用以上任何附加日誌。當使用all,primary,unique或foreign附加日誌時最小補全日誌默認開啓(即檢查結果爲IMPLICIT)。 在刪除所有導致IMPLICIT最小化附加日誌的附加日誌後,最小化附加日誌變爲NO。
參考文章:http://blog.itpub.net/31397003/viewspace-2142791/

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