archive log檔案大小與redo log檔案大小關係探究

bitifi發表於2016-04-27
     首先我們來看下什麼是archive log file,oracle 11g 的concept中是這樣定義的:When you enable archiving of the online redo logs, Oracle Database copies the online redo log files to another location before they are overwritten. These copied files are referred to as archived redo log files. 那麼根據這個定義,archive log file就是redo log file的拷貝,既然是拷貝,在排除壓縮的情況下,兩種檔案的大小應該是一致的。但是我們在真實環境中看到的archive log file就是redo log file卻不是一樣大,真實情況是archive log file比redo log file小,極端情況下,甚至會小非常多。
     引起
archive log file就是redo log file大小不一致的原因大致有如下幾種:
           一、人為操作型別
                 1、SQL>alter system switch logfile;
                 2、SQL>alter system archive log current;
                 3、RMAN>backup archive log all;
                 4、RMAN>backup database plus archivelog;

           二、引數設定型別
                 archive_lag_target:日誌切換的強制時間間隔,即只要到達該引數設定的時間間隔,無論redo 檔案是否寫滿,都會進行日誌切換。
           三、oracle bug型別
                 BUG 9272059、BUG 10354739、BUG 12317474、BUG 5450861、BUG 7016254
      下面對archive log file就是redo log file大小不一致的原因進行分析,首先,如果redo log file中是以空白結尾,那麼,archive log file中會將末尾的空白去除,這就樣就會出現archive log比redo log file小,具體小多少,就根據歸檔時redo log file末尾的空白大小決定。這種情形常見於前面提到的認為操作型別和引數設定型別。因為在進行強制切換日誌的時候,redo log file是沒有被寫滿的,檔案的末尾必然存在空白。
      另外,日誌切換並不是發生redo log file 100%滿的時候,這是由於oracle的內部演算法決定的,這樣做的主要目的是處於效能的考慮。
所以redo log file始終不會被100%的寫滿,在進行歸檔的時候,末尾的空白會被丟棄,所以就導致了archive log file小於redo log file。影響redo log切換時間的因素有:LOG_BUFFER_SIZE引數設定、系統負載、log file size、logfile 空間分配演算法。
CUP_COUNT值會影響logfile空間分配演算法,所以,如果出現日誌頻繁切換且歸檔日誌遠小於redo log file的情況,請檢查CUP_COUNT是否符合系統的實際情況。
       再次,如果是RAC環境,如果各節點的負載不一致,為了保證資料庫的可恢復性,空閒節點會進行一些的日誌切換,主要是為了增進redo 日誌的FIRST_CHANGE#,空閒節點產生的歸檔日誌大小會與redo file大小有較大差距。下面進行驗證:
 
  1. --檢視redo file大小
  2. SQL> select thread#,group#,bytes/1024/1024 "size" from v$log order by 1,2;

  3.    THREAD# GROUP# size
  4. ---------- ---------- ----------
  5.      1 1 50
  6.      1 2 50
  7.      2 3 50
  8.      2 4 50
  9.   --在節點1上建立測試表
  10.  SQL> create table darren(id number,item varchar2(2));
  11.  
  12.  --檢視當前的歸檔情況和redo log的FRIST_CHANGE#
  13.  SQL> select thread#,name,blocks*block_size/1024/1024 "size" from v$archived_log order by 1,2;

  14.    THREAD#                             NAME                                          size
  15. ---------- ---------------------------------------------------------------------- ----------
  16.      1          +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_10.268.861729569 1.4453125
  17.      1          +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_11.270.861730475 49.9980469
  18.      1          +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_12.271.861730509 49.9980469
  19.      1          +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_13.272.861730545 49.9980469
  20.      1          +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_14.274.861730573 49.9980469
  21.      1          +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_15.275.861730601 49.9980469
  22.      1          +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_16.276.861788401 35.8242188
  23.      2          +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_2.269.861729571 2.37207031
  24.      2          +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_3.273.861730551 .008300781
  25.      2          +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_4.277.861788403 .567871094

  26.  SQL> select GROUP#,THREAD#,SEQUENCE#,STATUS,FIRST_CHANGE# from v$log order by 2;

  27.     GROUP#     THREAD#  SEQUENCE#       STATUS     FIRST_CHANGE#
  28.  ---------- ---------- ---------- ---------------- -------------
  29.      1            1        17          CURRENT        794878
  30.      2            1        16          INACTIVE       700672
  31.      3            2        5           CURRENT        794876
  32.      4            2        4           INACTIVE       517670
  33. --在節點1上進行事務,由於是測試環境,節點2上完全沒事務,是空閒例項
  34. begin
  35.   for i in 1..500000 loop
  36.    insert into darren values(1,'aa');
  37.    commit;
  38.   end loop;
  39. end;
  40.  --檢視歸檔情況和redo log 的FRIST_CHANGE#
  41. SQL> select thread#,name,blocks*block_size/1024/1024 "size" from v$archived_log order by 1,2;

  42.    THREAD#                             NAME                                          size
  43. ---------- ---------------------------------------------------------------------- ----------
  44.      1       +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_10.268.861729569     1.4453125
  45.      1       +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_11.270.861730475     49.9980469
  46.      1       +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_12.271.861730509     49.9980469
  47.      1       +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_13.272.861730545     49.9980469
  48.      1       +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_14.274.861730573     49.9980469
  49.      1       +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_15.275.861730601     49.9980469
  50.      1       +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_16.276.861788401     35.8242188
  51.      1       +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_17.278.861791005     49.9980469
  52.      1       +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_18.279.861791039     49.9980469
  53.      1       +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_19.281.861791071     49.9980469
  54.      1       +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_20.282.861791091     49.9980469
  55.      1       +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_21.283.861791119     49.9980469
  56.      2       +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_2.269.861729571     2.37207031
  57.      2       +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_3.273.861730551     .008300781
  58.      2       +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_4.277.861788403     .567871094
  59.      2       +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_5.280.861791047     .791503906
  60.      2       +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_6.284.861791125     .000976563
  61.   (thread_1_seq_17至thread_1_seq_21為insert過程中節點1產生的歸檔,大小都接近redo file大小,thread_2_seq_5和thread_2_seq_6為節點2產生的歸檔,遠小於redo file大小)
  62.  
  63.  SQL> select GROUP#,THREAD#,SEQUENCE#,STATUS,FIRST_CHANGE# from v$log order by 2;

  64.     GROUP#      THREAD#   SEQUENCE#      STATUS      FIRST_CHANGE#
  65.    ---------- ---------- ---------- ---------------- -------------
  66.        1           1         21          ACTIVE         1206256
  67.        2           1         22          CURRENT        1308608
  68.        3           2         7           CURRENT        1338258
  69.        4           2         6           INACTIVE       1014874
  70.    (可以看到,節點2的FIRST_CHANGE#也跟進了,這裡還超過了節點1的)     
    再考慮一種極端情況,如果節點2已經down了,那麼,節點2的歸檔將會由節點1進行代為執行,同樣會推進節點2的redo log的FIRST_CHANGE#,繼續上面的實驗:  
  1. --關閉節點2
  2. SQL> shutdown immediate
  3. Database closed.
  4. Database dismounted.
  5. ORACLE instance shut down.

  6. --繼續在節點1插入資料
  7. begin
  8.   for i in 1..500000 loop
  9.    insert into darren values(1,'aa');
  10.    commit;
  11.   end loop;
  12. end;

  13. --檢視歸檔情況和redo log 的FRIST_CHANGE#
  14. SQL> select thread#,ARCHIVAL_THREAD#,name,blocks*block_size/1024/1024 "size" from v$archived_log order by 1,2;

  15.    THREAD# ARCHIVAL_THREAD#                               NAME                                        size
  16. ---------- ---------------- ---------------------------------------------------------------------- ----------
  17.     1           1            +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_10.268.861729569     1.4453125
  18.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_18.279.861791039     49.9980469
  19.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_27.291.861795885     49.9980469
  20.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_26.290.861795861     49.9980469
  21.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_25.289.861795837     49.9980469
  22.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_24.287.861795815     49.9980469
  23.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_23.286.861795789     49.9980469
  24.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_22.285.861795765     49.9980469
  25.     1           1            +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_11.270.861730475     49.9980469
  26.     1           1            +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_12.271.861730509     49.9980469
  27.     1           1            +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_13.272.861730545     49.9980469
  28.     1           1            +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_14.274.861730573     49.9980469
  29.     1           1            +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_15.275.861730601     49.9980469
  30.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_16.276.861788401     35.8242188
  31.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_17.278.861791005     49.9980469
  32.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_19.281.861791071     49.9980469
  33.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_20.282.861791091     49.9980469
  34.     1           1            +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_21.283.861791119     49.9980469
  35.     2           1            +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_8.292.861795895     .000488281
  36.     2           1            +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_7.288.861795827     .921386719
  37.     2           1            +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_4.277.861788403     .567871094
  38.     2           2            +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_5.280.861791047     .791503906
  39.     2           2            +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_3.273.861730551     .008300781
  40.     2           2            +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_6.284.861791125     .000976563
  41.     2           2            +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_2.269.861729571     2.37207031
  42. (注意thread_2_seq_7和thread_2_seq_8,他們的歸檔是由thread 1 執行的,參看THREAD# 和ARCHIVAL_THREAD# 列,這兩個歸檔正是在例項2關閉的時候生成的)

  43. SQL> select GROUP#,THREAD#,SEQUENCE#,STATUS,FIRST_CHANGE# from v$log order by 2;

  44.     GROUP#     THREAD#  SEQUENCE#        STATUS     FIRST_CHANGE#
      ---------- ---------- ---------- ---------------- -------------
          1           1         27           ACTIVE         1831962
          2           1         28           CURRENT        1935906
          3           2         9            CURRENT        1955175
          4           2         8            INACTIVE       1690602

 
       由於redo wastage的存在,redo log file中間也會存在空白,那這部分空白會不會被丟棄呢?首先看下什麼是redo wastage,簡單的說就是LGWR程式在寫redo log file的時候是按作業系統的標準塊為單位進行寫入的,具體塊的大小,可以使用下述語句進行查詢:

  1. select max(l.lebsz) log_block_size_kccle
  2.   from sys.x$kccle l
  3.   where l.inst_id = userenv('Instance');
假設標準塊大小為512位元組,在一次寫入操作中一共要寫入1036位元組資料,那麼就需要3個標準塊,儘管第三個塊沒有被寫滿,但是SGA中redo log寫入的指標會跳轉到下面一個塊,這裡的第三個塊剩下的空間就被浪費了,這就是redo wastage。減少這種情況的方法就是減少commit次數。
                                               

     下面通過實驗觀察redo wastage造成的空白會不會在歸檔的時候被丟棄:
  
  1. --檢視redo file大小
  2. SQL> select group#,bytes/1024/1024 \"size(M)\" from v$log;

  3.     GROUP# size(M)
  4. ---------- ----------
  5.      1 50
  6.      2 50
  7.      3 50

  8. --建立測試表
  9. SQL> create table darren(id number,item varchar2(2));


  10. Table created.

  11. --檢視當前歸檔的情況
  12. SQL> select SEQUENCE#,ARCHIVED,status,COMPRESSED from v$archived_log;

  13. SEQUENCE#  ARC S COM
    ---------- --- - ---
       81      YES A NO
       82      YES A NO
       83      YES A NO
       84      YES A NO
       85      YES A NO
       86      YES A NO
       87      YES A NO
       88      YES A NO
       89      YES A NO
       90      YES A NO

  14. --檢視當前的redo size和redo wastage
  15. SQL> select name,value from v$sysstat where name in('redo size','redo wastage');

  16. NAME                                       VALUE
  17. --------------------- ------------------------------------------ ----------
  18. redo size                                 258664912
  19. redo wastage                              86181420

  20. --向測試表插入資料,產生redo記錄
  21. begin
  22.   for i in 1..500000 loop
  23.    insert into darren values(1,'aa');
  24.    commit;
  25.   end loop;
  26. end;

  27. --切換一起日誌,將insert過程中產生的redo檔案全部歸檔
  28. SQL> alter system archive log current;

  29. System altered.
  30.   
  31. --檢視現在的redo size和redo wastage
  32. SQL> select name,value from v$sysstat where name in('redo size','redo wastage');

  33. NAME           VALUE
  34. ---------- ------------
  35. redo size    512888704
  36. redo wastage 202172176

  37. --計算insert過程中產生的redo size和redo wastage
  38. SQL> select 512888704-258664912 redo from dual;

  39.       REDO
  40. ----------
  41.  254223792

  42. SQL> select 202172176-86181420 wastage from dual;

  43.    WASTAGE
  44. ----------
  45.  115990756

  46. --計算redo wastage的比例
  47. SQL> select 115990756/254223792 from dual;

  48. 115990756/254223792
  49. -------------------
  50. .456254527


  51. --檢視insert 過程中產生的archive log file
  52. SQL> select SEQUENCE#,ARCHIVED,status,COMPRESSED from v$archived_log;

  53.  SEQUENCE# ARC S COM
  54. ---------- --- - ---
  55. 81 YES A NO
  56. 82 YES A NO
  57. 83 YES A NO
  58. 84 YES A NO
  59. 85 YES A NO
  60. 86 YES A NO
  61. 87 YES A NO
  62. 88 YES A NO
  63. 89 YES A NO
  64. 90 YES A NO
  65. 91 YES A NO
  66. 92 YES A NO
  67. 93 YES A NO
  68. 94 YES A NO
  69. 95 YES A NO
  70. 96 YES A NO
  71. 97 YES A NO
  72. 98 YES A NO
  73. 99 YES A NO
  74. 從91號歸檔開始為本次insert操作產生的歸檔
  75.  --檢視歸檔檔案大小
  76. [oracle@oracle11g archive]$ ls -trl
  77. -rw-r----- 1 oracle oinstall 49917440 Oct 23 13:49 orcl_1_91_851966182.arc
  78. -rw-r----- 1 oracle oinstall 49257472 Oct 23 13:49 orcl_1_92_851966182.arc
  79. -rw-r----- 1 oracle oinstall 49896448 Oct 23 13:50 orcl_1_93_851966182.arc
  80. -rw-r----- 1 oracle oinstall 44149760 Oct 23 13:50 orcl_1_94_851966182.arc
  81. -rw-r----- 1 oracle oinstall 49917440 Oct 23 13:50 orcl_1_95_851966182.arc
  82. -rw-r----- 1 oracle oinstall 44199936 Oct 23 13:50 orcl_1_96_851966182.arc
  83. -rw-r----- 1 oracle oinstall 46582784 Oct 23 13:51 orcl_1_97_851966182.arc
  84. -rw-r----- 1 oracle oinstall 48513536 Oct 23 13:51 orcl_1_98_851966182.arc
  85. -rw-r----- 1 oracle oinstall    13312 Oct 23 13:51 orcl_1_99_851966182.arc
根據實驗資料顯示,redo wastage的比例約為46%,redo log大小為50M,忽略檔案末尾的空白影響,如果歸檔時丟棄redo wastage產生的日誌檔案中間的空白,那麼,歸檔檔案的大小約為50*1024*1024*46%=24117248位元組。從實驗資料看,歸檔日誌都遠大於24117248位元組(不考慮99號日誌,該日誌為手動切換產生)。
     結論:歸檔時不會丟棄由於redo wastage產生的redo log file中間的空白。
    另外再說明一點,由於某些BUG的存在,會出現redo log切換非常頻繁,產生的歸檔都遠小於redo log file的大小,所以,在觀察到redo log切換頻繁的時候,要關注下歸檔日誌的大小,如歸歸檔日誌遠小於redo log file大小,這時造成redo log頻繁切換的原因可能不是大量的事務,這時要綜合考慮,
不要貿然加大redo log file大小。







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28258625/viewspace-1688115/,如需轉載,請註明出處,否則將追究法律責任。

相關文章