Oracle可以將聯機日誌文件保存到多個不同的位置,將聯機日誌轉換爲歸檔日誌的過程稱之爲歸檔。相應的日誌被稱爲歸檔日誌。
(1)非歸檔模式和歸檔模式的切換方法:
1.非歸檔到歸檔模式
a.一致性關閉數據庫(shutdown [immediate | transactional |normal])
b.啓動到mount階段(startup mount)
c.切換到歸檔模式(alter database archivelog [manual])
d.切換到open階段(alter database open)
e.對數據做一個完整備份(full backup)
2.歸檔模式切換到非歸檔模式
a.一致性關閉數據庫(shutdown [immediate | transactional |normal])
b.啓動到mount階段(startup mount)
c.切換到歸檔模式(alter database noarchivelog )
d.切換到open階段(alter database open)
e.對數據做一個完整備份(full backup)
(2)歸檔進程的調整
通過設置LOG_ARCHIVE_MAX_PROCESSES 參數,可以指定數據庫規定所需初始化的進程數,缺省的歸檔進程數爲2,一般情況下不需要修改該參數,Oracle會根據歸檔情況自動啓動額外的歸檔進程。也可以動態的增加或減少歸檔進程數,比如有些業務在月底需要進行大量歸檔,平時則歸檔較少,對此可以動態修改,修改方法如下:
ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3;
(3)歸檔位置的配置方法
在ORACLE10g和11g版本,ORACLE默認的日誌歸檔路徑爲閃回恢復區($ORACLE_BASE/flash_recovery_area)。對於這個路徑,ORACLE有一個限制,就是默認只有2G的空間,而且不只是歸檔日誌的默認路徑,也是備份文件和閃回日誌的默認地址,這樣的話歸檔日誌所使用的空間就達不到2G,在沒有設置好這個路徑大小的情況下,很多系統都遇到過歸檔日誌滿而無法歸檔導致數據庫夯住的問題,可以使用下面的SQL語句去查看歸檔信息。
SQL> ARCHIVE LOG LIST; --查看日誌是否處於歸檔狀態
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 24
Next log sequence to archive 26
Current log sequence 26
查看歸檔路徑是否已經設置
查看歸檔路徑是否已設置,爲空值表示未設置。
SHOW PARAMETER ARCHIVE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
log_archive_config string
log_archive_dest string
log_archive_dest_1 string
log_archive_dest_10 string
log_archive_dest_2 string
log_archive_dest_3 string
log_archive_dest_4 string
log_archive_dest_5 string
log_archive_dest_6 string
log_archive_dest_7 string
設置歸檔路徑位置的配置方法
a.歸檔到本機且小於等於兩個歸檔位置
設置LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST參數
alter system set log_archive_dest = '/u01/app/oracle/archivelog1' scope = spfile;
alter system set log_archive_duplex_dest = '/u01/app/oracle/archivelog2' scope = spfile;
b.歸檔到本機或遠程主機
設置LOG_ARCHIVE_DEST_n 參數
alter system set log_archive_dest_1 = 'LOCATION=/u01/app/oracle/archivelog3';
alter system set log_archive_dest_2 = 'SERVICE=standby1';
對於遠程歸檔位置,SERVICE選項需要指定遠程數據庫的網絡服務名(在tnsnames.ora文件中配置)
LOG_ARCHIVE_DEST_n的兩個常用選項
MANADATORY | OPTIONAL:
MANADATORY表示歸檔必須成功複製到目的路徑之後,聯機重做日誌才能被複用,OPTIONAL正好相反
REOPEN:
指定歸檔失敗後指定間隔多少時間重試歸檔,缺省的爲300秒。
示例:
log_archive_dest_1 = 'LOCATION=/u01/app/oracle/archivelog3 manadatory reopen = 600'
c.兩種歸檔方法異同(前者log_archive_dest、log_archive_duplex_dest ,後者log_archive_dest_n)
前者最多配置兩個歸檔位置,後者可以配置多個歸檔位置;
兩者互不兼容,要麼使用前者,要麼使用後者;
使用後者歸檔到本地時需要增加LOCATION選項,備份到遠程主機需要使用SERVICE選項;
但上述兩種方式未指定路徑時,歸檔日誌位於db_recovery_file_dest 缺省爲$ORACLE_BASE/flash_recovey_area
d.歸檔日誌命名格式
設置LOG_ARCHIVE_FORMAT參數,Unix下的缺省設置爲LOG_ARCHIVE_FORMAT=%t_%s_%r.dbf
%s: 日誌序列號:
%S: 日誌序列號(帶有前導)
%t: 重做線程編號.
%T: 重做線程編號(帶有前導)
%a: 活動ID號
%d: 數據庫ID號
%r RESETLOGS的ID值.
alter system set log_archive_format = 'arch_%t_%s_%r.arc';
e.控制歸檔的可用性(使用參數log_archive_dest_state_n)
alter system set log_archive_dest_state_1 = enable | defer
enable -->缺省狀態,可以在該歸檔位置進行歸檔
defer -->禁用該歸檔位置
歸檔路徑配置及查看歸檔進程,歸檔位置狀態案例如下:
查看日誌是否處於歸檔狀態
SQL> ARCHIVE LOG LIST;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 24
Next log sequence to archive 26
Current log sequence 26
查看歸檔進程是否已啓動
SQL> ho ps -ef | grep ora_arc
oracle 4062 1 0 11:43 ? 00:00:00 ora_arc0_orcl
oracle 4064 1 0 11:43 ? 00:00:00 ora_arc1_orcl
查看歸檔路徑是否已設置,爲空值表示未設置
SQL> SHOW PARAMETER ARCHIVE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
log_archive_config string
log_archive_dest string
log_archive_dest_1 string
log_archive_dest_10 string
log_archive_dest_2 string
log_archive_dest_3 string
log_archive_dest_4 string
log_archive_dest_5 string
設置歸檔路徑(2個)
SQL> alter system set log_archive_dest = '/u01/app/oracle/archivelog1' scope = spfile;
System altered.
SQL> alter system set log_archive_duplex_dest= '/u01/app/oracle/archivelog2' scope=spfile;
System altered.
SQL> alter system set log_archive_format = 'arch_%t_%s_%r.arc' scope = spfile;
靜態參數,需要重新啓動數據庫才生效,設定完畢後需要重新啓動實例。
啓動實例後,手動切換一個日誌,查看歸檔日誌的信息
alter system switch logfile;
在指定的文件夾archivelog1查看產生的歸檔日誌
SQL> ho ls -l /u01/app/oracle/archivelog1
total 18224
-rw------- 1 oracle oinstall 18636800 Jul 25 20:39 arch_1_25_724652763.arc
創建新的歸檔路徑
SQL> ho mkdir /u01/app/oracle/archivelog3
重新配置歸檔路徑的位置
SQL> alter system set log_archive_dest_1 = 'location=/u01/app/oracle/archivelog3' scope = spfile;
關閉實例
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
啓動實例後,收到錯誤提示表明兩種歸檔方式不兼容
SQL> startup
ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST or LOG_ARCHIVE_DUPLEX_DEST
正確的處理辦法,應當先將一種歸檔方式路徑置空,此處是將log_archive_dest置空
SQL> alter system set log_archive_dest = '' scope = spfile;
System altered.
此處是將log_archive_duplex_dest置空
SQL> alter system set log_archive_duplex_dest = '' scope = spfile;
System altered.
接下來再設定log_archive_dest_1
SQL> alter system set log_archive_dest_1 = 'location=/u01/app/oracle/archivelog3' scope = spfile;
System altered.
設定完畢後需要重新啓動實例,此時系統能正常啓動。
查看歸檔目的地的相關狀態信息
set line 300
col dest_name format a20
col destination format a30
select dest_name,status,archiver,destination,log_sequence,reopen_secs,transmit_mode,process from v$archive_dest where status='VALID';
歸檔日誌相關視圖
v$archived_log -->從控制文件中獲得歸檔的相關信息
v$archive_dest -->歸檔路徑及狀態
v$log_history -->控制文件中日誌的歷史信息
v$database -->查看數據庫是否處於歸檔狀態
v$archive_processes -->歸檔相關的後臺進程信息
set line 500
col name format a80
Select name,sequence#,registrar,standby_dest,archived,status from v$archived_log;
(4)查看每天歸檔日誌的大小和個數等情況
set line 200 pagesize 9999 long 5000
column thread# format 999999 heading 'Thread#'
column day format a10 heading 'Day/Time'
column H00 format 999 heading '00'
column H01 format 999 heading '01'
column H02 format 999 heading '02'
column H03 format 999 heading '03'
column H04 format 999 heading '04'
column H05 format 999 heading '05'
column H06 format 999 heading '06'
column H07 format 999 heading '07'
column H08 format 999 heading '08'
column H09 format 999 heading '09'
column H10 format 999 heading '10'
column H11 format 999 heading '11'
column H12 format 999 heading '12'
column H13 format 999 heading '13'
column H14 format 999 heading '14'
column H15 format 999 heading '15'
column H16 format 999 heading '16'
column H17 format 999 heading '17'
column H18 format 999 heading '18'
column H19 format 999 heading '19'
column H20 format 999 heading '20'
column H21 format 999 heading '21'
column H22 format 999 heading '22'
column H23 format 999 heading '23'
column total format 999,999 heading 'Total'
select thread#,to_char (first_time, 'YYYY-MM-DD') day,
sum (decode (to_char (first_time, 'HH24'), '00', 1, 0)) H00,
sum (decode (to_char (first_time, 'HH24'), '01', 1, 0)) H01,
sum (decode (to_char (first_time, 'HH24'), '02', 1, 0)) H02,
sum (decode (to_char (first_time, 'HH24'), '03', 1, 0)) H03,
sum (decode (to_char (first_time, 'HH24'), '04', 1, 0)) H04,
sum (decode (to_char (first_time, 'HH24'), '05', 1, 0)) H05,
sum (decode (to_char (first_time, 'HH24'), '06', 1, 0)) H06,
sum (decode (to_char (first_time, 'HH24'), '07', 1, 0)) H07,
sum (decode (to_char (first_time, 'HH24'), '08', 1, 0)) H08,
sum (decode (to_char (first_time, 'HH24'), '09', 1, 0)) H09,
sum (decode (to_char (first_time, 'HH24'), '10', 1, 0)) H10,
sum (decode (to_char (first_time, 'HH24'), '11', 1, 0)) H11,
sum (decode (to_char (first_time, 'HH24'), '12', 1, 0)) H12,
sum (decode (to_char (first_time, 'HH24'), '13', 1, 0)) H13,
sum (decode (to_char (first_time, 'HH24'), '14', 1, 0)) H14,
sum (decode (to_char (first_time, 'HH24'), '15', 1, 0)) H15,
sum (decode (to_char (first_time, 'HH24'), '16', 1, 0)) H16,
sum (decode (to_char (first_time, 'HH24'), '17', 1, 0)) H17,
sum (decode (to_char (first_time, 'HH24'), '18', 1, 0)) H18,
sum (decode (to_char (first_time, 'HH24'), '19', 1, 0)) H19,
sum (decode (to_char (first_time, 'HH24'), '20', 1, 0)) H20,
sum (decode (to_char (first_time, 'HH24'), '21', 1, 0)) H21,
sum (decode (to_char (first_time, 'HH24'), '22', 1, 0)) H22,
sum (decode (to_char (first_time, 'HH24'), '23', 1, 0)) H23,
count (*) total
from v$log_history a
where first_time >= sysdate - 30
group by thread#,to_char (first_time, 'YYYY-MM-DD')
order by thread#,to_char (first_time, 'YYYY-MM-DD');
(5)查看備份集中的日誌文件信息
select bs.recid bs_key,
decode (backup_type,'L', 'Archived Redo Logs','D', 'Datafile Full Backup','I', 'Incremental Backup') backup_type,
device_type,
decode (bs.controlfile_included, 'NO', '-', bs.controlfile_included) controlfile_included,
nvl (sp.spfile_included, '-') spfile_included,
bs.incremental_level,
bs.pieces,
to_char (bs.start_time, 'YYYY-MM-DD HH24:MI:SS') start_time,
to_char (bs.completion_time, 'YYYY-MM-DD HH24:MI:SS') completion_time,
bs.elapsed_seconds,
bp.tag,
bs.block_size,
bs.keep,
to_char (bs.keep_until, 'YYYY-MM-DD HH24:MI:SS') keep_until,
bs.keep_options
from v$backup_set bs,
(select distinct set_stamp,
set_count,
tag,
device_type
from v$backup_piece
where status in ('A', 'X')) bp,
(select distinct set_stamp, set_count, 'YES' spfile_included
from v$backup_spfile) sp
where bs.set_stamp = bp.set_stamp
and bs.set_count = bp.set_count
and bs.set_stamp = sp.set_stamp(+)
and bs.set_count = sp.set_count(+)
and sysdate - bs.start_time <= 30
order by bs.recid;
(6)歸檔日誌的刪除
查看歸檔日誌列表
list archivelog all;
列出所有失效的歸檔日誌
list expired archivelog all;
校驗日誌的可用性
crosscheck archivelog all;
刪除log sequence20480之前的所有歸檔日誌
delete noprompt archivelog until sequence 20480;
刪除一天前的所有歸檔日誌文件
delete noprompt archivelog all completed before 'sysdate-2';
刪除系統時間7天以前的歸檔日誌
delete noprompt archivelog all completed before 'sysdate-7';
刪除所有的歸檔日誌
delete noprompt archivelog all;
(7)data guard環境下歸檔日誌刪除可能出現的問題和解決方法
如果是dg 主備,在主庫上定期刪除歸檔會報如下錯誤:
RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
第一,查看主庫和備庫現在應用日誌的情況,得到應用的日誌序列號
查看主庫應用日誌信息:
SYS@testdb> select GROUP# ,THREAD# , SEQUENCE# from v$log;
GROUP# THREAD# SEQUENCE#
---------- ---------- ----------
1 1 20507
2 1 20508
3 1 20509
5 1 20510
6 1 20511
查看備庫的應用情況:
select THREAD# , SEQUENCE#,APPLIED from v$archived_log;
第二,修改主庫的rman配置參數:
默認的參數如下:
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
修改爲:
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;
第三:執行刪除歸檔文件命令:
校驗日誌的可用性
crosscheck archivelog all;
刪除log sequence33535之前的所有歸檔日誌;
序列號可以由上面查詢到的數據減去8到10個左右
delete noprompt archivelog until sequence 33535;
如果加上force參數,不需要前面的第一二步驟的設置即可執行刪除歸檔的操作。
delete force noprompt archivelog until sequence 33535;
或者指定線程號進行歸檔日誌的刪除
delete force noprompt archivelog until sequence 33535thread 1;