1. 程式人生 > 其它 >Oracle日誌 歸檔模式管理

Oracle日誌 歸檔模式管理

一、檢視當前歸檔模式

archive log list;  

二、歸檔/不歸檔切換

shutdown immediate;          -- 或shutdown normal
startup mount;
alter database archivelog;   -- 或NOARCHIVELOG
alter database open;

三、開啟自動歸檔

alter system archive log start;

四、檢視預設的存檔位置

show parameter db_reco;

五、歸檔程序ARCn

重做日誌寫程序(LGWR)負責將redo-buffer中的資料順序的寫入redolog中———讀記憶體寫外存


歸檔程序(ARCn)負責把切換後的redolog複製到歸檔日誌檔案。————讀外存寫外存

顯然,LGWR的讀寫效率要比ARCn高得多,而在經常發生DML操作的資料庫中,可能發生由於歸檔慢而重做日誌寫入速度快所造成的資料庫被暫時停止執行的情況,此時資料庫就是等待ARCn將當前的重做日誌資料寫入歸檔日誌。

解決方案:增加歸檔程序的數量(log_archive_max_processes)

SQL> show parameter log_archive_max_processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ log_archive_max_processes integer 4
SQL> alter system set log_archive_max_processes=5;

六、自定義存檔路徑

執行命令show parameter log_archive_dest;

可以檢視到多條記錄,這些記錄都是用於存放使用者自定義路徑的“預定義變數”。當有一個變數被設定後,就不會再歸檔至預設路徑。當多個變數被設定,會同時歸檔至各個指定路徑下(

安全性)。

SQL> show parameter log_archive_dest;
NAME                        TYPE        VALUE
------------------------------------ -----------
log_archive_dest            string                    -- 這個引數從10g開始已經被廢棄!!
log_archive_dest_1          string
 ......
log_archive_dest_8          string
log_archive_dest_9          string
log_archive_dest_10         string

SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/archive/arch1';      
SQL> alter system set log_archive_dest_8='location=/u01/app/oracle/archive/arch8';
SQL> alter system switch logfile    -- 手動強制歸檔

執行如上程式碼,結果會發現在arch1和arch8目錄下都會生成歸檔檔案。

那麼如果不想再歸檔至arch8目錄了該怎麼辦?

每一個log_archive_dest_x引數都有一個對應的state引數,如下所示,可以執行命令alter system set log_archive_dest_state_8='defer';使其失效。

SQL> show parameter log_archive_dest;  

NAME                             TYPE    VALUE
----------------------------------------------------------------------
log_archive_dest_state_1       string   enable
log_archive_dest_state_2       string   enable
   ... ...
log_archive_dest_state_7       string   enable
log_archive_dest_state_8       string   enable
log_archive_dest_state_9       string   enable

七、查詢成功歸檔日誌檔案組的最低數(安全性)

在第六步“自定義存檔位置”的基礎上,進一步提升歸檔安全性。

log_archive_min_succeed_dest:限定Oracle必須保證成功的歸檔檔案組的數量;

比如之前定義了兩個歸檔路徑,如果該值設定為2,則限定Oracle必須保證該兩個路徑中的歸檔必須成功完整。

注:自定義的歸檔路徑數量 > log_archive_min_succeed_dest的值

SQL> alter system set log_archive_min_succeed_dest=2;
alter system set log_archive_min_succeed_dest=2

ORA-02097: parameter cannot be modified because specified value is invalid
ORA-16020: fewer destinations available than specified by LOG_ARCHIVE_MIN_SUCCEED_DEST

報錯原因:當前僅有一個預設歸檔路徑,最低數要求卻設定為了2!
解決方法:再新增一個歸檔路徑,重新設定該值。

八、一些日誌統計指令碼

1. 估算系統每秒產生的日誌量和每天產生的日質量(待梳理驗證)

declare
  ac          number;
  sec_redo    number;
  day_redo    number;
  sec_redo_90 number;
  day_redo_90 number;
  str         varchar(100);
begin
  select count(*) into ac from v$database where log_mode = 'NOARCHIVELOG';
  if ac = 1 then
    dbms_output.put_line('The database is running on NOARCHIVELOG mode,No archivelog !!!');
  else
    str := '';
    for i in (select destination
                from v$archive_dest
               where status = 'VALID'
                 and destination is not null) loop
      str := str || ',' || i.destination;
    end loop;
    dbms_output.put_line('Archive dest is' || substr(str, 2));
    select trunc(sum((blocks * block_size) / 1024) /
                 ((max(first_time) - min(first_time)) * 24 * 3600)),
           trunc(sum((blocks * block_size) / 1024 / 1024) /
                 ((max(first_time) - min(first_time))))
      into sec_redo, day_redo
      from v$archived_log;
    dbms_output.put_line('每秒產生日誌的頻率:' || sec_redo || '(KB)');
    dbms_output.put_line('每天產生日誌的頻率:' || day_redo || '(MB)');
    dbms_output.put_line('最近3個月的統計資料:');
    select trunc(sum((blocks * block_size) / 1024) /
                 ((max(first_time) - min(first_time)) * 24 * 3600)),
           trunc(sum((blocks * block_size) / 1024 / 1024) /
                 ((max(first_time) - min(first_time))))
      into sec_redo_90, day_redo_90
      from v$archived_log
     where first_time > SYSDATE - 91;
    dbms_output.put_line('每秒產生日誌的頻率:' || sec_redo_90 || '(KB)');
    dbms_output.put_line('每天產生日誌的頻率:' || sec_redo_90 || '(MB)');
  end if;
end;
View Code

2. 統計歸檔日誌的每日生成量

SQL> select lpad(to_char(first_time,'yyyymmdd'),12) "Date",
     trunc(sum(blocks*block_size)/1024/1024) "size(MB)",
     count(*) "count"
     from v$archived_log
     where first_time>SYSDATE-31
     group by lpad(to_char(first_time,'yyyymmdd'),12)
     order by 1 desc;

Date                                            size(MB)      count
------------------------------------------------ ---------- ----------
    20211102                                    113          5
    20211101                                    236          9
    20211031                                    285         11
    20211030                                    309         11
    20211029                                    238         10
    20211028                                    279         16
    20211027                                    257         10