archive log文件大小與redo log文件大小關係探究

首先我們來看下什麼是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大小。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章