歸檔重做日志 (明顯) 比重做日志文件小。 (文檔 ID 1356604.1)
日志切換將由于以下原因發生:
1. 由于在重做日志文件已滿之前強制創建存檔而記錄和設計的行為
- SQL> alter system switch logfile;
- SQL> alter system archive log current;
- RMAN> backup archivelog all;
- RMAN> backup database plus archivelog;
ARCHIVE_LAG_TARGET
?: limits the amount of data that can be lost and effectively increases the availability of the standby database by forcing a log switch after the specified amount of time elapses. you can see this aswell in RAC with an idle/low-load instance. ADG下定期自動切換
2. 未記錄但設計好的行為:
- BUG 9272059?- 由于 CMT CPU,重做日志切換大小為 1/8
- BUG 10354739?- REDOLOGSIZE 未完全使用
- BUG 12317474?- 頻繁重做日志切換生成小型存檔日志?
- BUG 5450861?- 生成的存檔日志比重做日志文件小
- BUG 7016254?- 減少日志切換時控制文件入隊等待時間
- BUG 29221745?- 刪除由代理發起的日志切換
解釋 :
根據Bug: 5450861?(已關閉為“非 Bug”):
* 存檔日志的大小不必相等。這是很久以前就決定的,當時停止了存檔日志的空白填充,理由很充分 - 為了節省磁盤空間。
* The archive logs do not have to be even in size. This was decided a very long time ago,when blank padding the archive logs was stopped, for a very good reason - in order to save disk space.redo 沒有用滿的話不會寫入archived log?
* 當重做日志文件已 100% 滿時,不會發生日志切換。有一個內部算法可以確定日志切換時刻。這也有一個很好的理由 - 在最后一刻進行日志切換可能會導致性能問題(出于各種原因,超出了本文的范圍)。因此,在發生日志切換后,歸檔程序只會從重做日志文件中復制實際信息。由于日志切換后重做日志并非 100% 滿,并且復制操作完成后存檔日志未填充空白,因此會導致文件比原始重做日志文件不均勻且更小。
* The log switch does not occur when a redo log file is 100% full. There is an internal algorithm that determines the log switch moment. This also has a very good reason - doing the log switch at the last moment could incur performance problems (for various reasons, out of the scope of this note). As a result, after the log switch occurs, the archivers are copying only the actual information from the redo log files. Since the redo logs are not 100% full after the log switch and the archive logs are not blank padded after the copy operation has finished, this results in uneven, smaller files than the original redo log files.
有許多因素共同決定了日志切換頻率。以下是本例中最相關的因素:
a) RDBMS 參數 LOG_BUFFER_SIZE
如果 DBA 沒有明確設置,則我們使用默認值;在實例啟動時,RDBMS 將共享重做線程數計算為 ncpus/16,每個線程的大小為 128Kb * ncpus(其中 ncpus 是系統中的 CPU 數量)。日志緩沖區大小是線程數乘以線程大小。計算或指定的大小四舍五入為 SGA 中內存段粒度的倍數。對于 11.2,如果SGA 大小 >= 128GB,則顆粒大小為 512MB有一些強制執行的最低限度和最高限度。
64GB <= SGA 大小 < 128GB,則顆粒大小為 256MB
32GB <= SGA 大小 < 64GB,則顆粒大小為 128MB
16GB <= SGA 大小 < 32GB,則顆粒大小為 64MB
8GB <= SGA 大小 < 16GB,則顆粒大小為 32MB
1GB <= SGA 大小 < 8GB,則顆粒大小為 16MB
SGA 大小 < 1GB,則顆粒大小為 4MB
b) 系統負載
STRAND翻譯:線, (線、繩等的)縷,股
最初只使用一個重做 strand,即“活動”重做 strand 的數量為 1,所有進程將其重做復制到該 strand 中。當/如果對該 strand 存在爭用,則活動重做 strand 的數量將增加到 2。隨著對活動 strand 的爭用增加,活動 strand 的數量也會增加。活動重做 strand 的最大可能數量是日志緩沖區中最初分配的 strand 數量。(此功能稱為“動態 strand”,有一個隱藏參數可以禁用它,然后允許進程從一開始就使用所有 strand)。
?
c) 日志文件大小
這是 DBA 在創建日志文件時決定的日志文件大小。
d) 日志文件空間預留算法
當 RDBMS 切換到新的聯機重做日志文件時,所有日志緩沖區重做線程內存都會“映射”到日志文件空間( 此功能稱為“動態 strand”,有一個隱藏參數可以禁用它,然后允許進程從一開始就使用所有 strand,? ? 這樣的話就不會有用不滿的情況了)。如果日志文件大于日志緩沖區,則每個線程將映射/保留其線程大小的日志文件空間,剩余的日志文件空間(“日志殘留”)仍然可用。如果日志文件小于日志緩沖區,則整個日志文件空間在所有線程之間 平均分配/映射/保留,并且沒有未保留的空間(即沒有日志殘留)。當任何進程填充線程,使得該線程的所有保留的底層日志文件空間都被使用,并且沒有日志殘留時,將安排日志切換。
示例:128 個 CPU,因此 RDBMS 分配一個大小為 128Mb 的 log_buffer,其中包含 8 個大小為 16Mb 的共享線程。它可能比 128Mb 稍大,因為它四舍五入到 SGA 粒度邊界。日志文件為 100Mb,因此當 RDBMS 切換到新的在線重做日志文件時,每個 strand 會保留 100Mb/8 = 25600 ( 12.5MB=12.5*1024*1024B/512B(redo 塊大小就是512B,datafile blocksize默認8k)=25600)個塊,并且沒有日志殘留。如果系統負載較低,則只有一個重做 strand 處于活動狀態/使用狀態,當該 strand 中的 25600 個塊已滿時,將安排日志切換 - 創建的存檔日志的大小約為 25600 個塊。
在實例啟動時,RDBMS 將共享重做線程數計算為 ncpus/16,每個線程的大小為 128Kb * ncpus(其中 ncpus 是系統中的 CPU 數量)。日志緩沖區大小是線程數乘以線程大小。 128/16=8? 128*128=16384=16MB? ? ? ?log buffer=? 8*16=128MB
在其他所有條件保持不變(128 個 CPU 和低負載)的情況下,使用更大的日志文件不會真正減少請求日志切換時未填充空間的數量,但它會使未填充空間占總日志文件空間的百分比降低,例如
- 對于 100Mb 的日志文件,日志切換發生在 7 x 16Mb=112MB 日志文件空間未填充的情況下(即,請求日志切換時日志文件已滿 10%) 這里錯了應該是7*100/8吧,反正是1/8
- 對于 1Gb 的日志文件,日志切換將在 7 x 16Mb 日志文件空間未填充的情況下發生(即,請求日志切換時日志文件已滿 90%)
1GB的情況下 初次映射了8*16MB,只有一個16MB在不停的增加,所以
1000MB/16MB=62.5 個有7個是不能用的,所以總共損失了 62.5-7/62.5= 88%
如果 CPU_COUNT 較高、負載較低且重做日志文件大小小于重做日志緩沖區,您可能會看到較小的歸檔日志文件,因為日志切換的大小約為定義日志文件大小的 1/8。這是因為 CPU_COUNT 定義了重做線程的數量 (ncpus/16)。如果負載較低,則只能使用單個線程。如果重做日志文件大小小于重做日志緩沖區,則日志文件空間將劃分為可用線程。例如,當僅使用單個活動線程時,當該線程已滿時,日志切換可能已經發生。
(最初只使用一個重做 strand,即“活動”重做 strand 的數量為 1,所有進程將其重做復制到該 strand 中。當/如果對該 strand 存在爭用,則活動重做 strand 的數量將增加到 2。隨著對活動 strand 的爭用增加,活動 strand 的數量也會增加。活動重做 strand 的最大可能數量是日志緩沖區中最初分配的 strand 數量。(此功能稱為“動態 strand”,有一個隱藏參數可以禁用它,然后允許進程從一開始就使用所有 strand)。)