關于fast_start_io_target的一點看法
2024-07-21 02:39:02
供稿:網友
首先明確幾個概念:
1.Data block 是包含幾個os block,也就是一對多的關系。
2.Data files 中的是 data block
Redo log files 中的 redo block 是os block
3.Data block 中記錄的是完整的信息
Redo block 中記錄的是最簡單的信息
在8i 以前的版本,只有兩個參數用來影響recovery,那就是log_checkpoint_interval和log_checkpoint_time。以log_checkpoint_interval=10000舉例。意思很簡單,就是經過10000個redo block后就引發checkpoint,這樣恢復時,就絕對是在這10000個redo block中。
但是這樣做有個缺點,就是因為redo block(os block)不等于data block。假如datablock中的數據很小,比如1,修改成2,那么10000個redo block中包含的信息卻可以是遠遠大于10000個data block,假如data block中的數據很大,比如123456789,修改成987654321,那么10000個redo block中包含的信息卻可以是遠遠小于10000個data block。
這樣,在恢復時,盡管是讀10000個redo blcok,但是這個10000個redo block中所包含的data block有可能是很少,也有可能是很多,很難把握恢復的時間。
于是,在8i中就引進了fast_start_io_target這個參數來彌補這個不足。計算機自動計算redo block中所包含的data block的多少。例如fast_start_io_target=10000,t1(第一次checkpoint),在t1后有5000個redo block記錄了,但是這個5000個redo block中只包含了7000個data block,那么redo block繼續記錄,到了redo block到8000個時,計算機發現這8000個redo block中包含了10000個data block,那么就引起t2(第二次checkpoint),凡是在t1和t2之間的任何crash,都可以保證recovery的時間肯定在這10000個data block的讀寫時間之內(因為1個data block的I/O 是可以估算的)
所以說,設置fast_start_io_target比設置log_checkpoint_interval,log_checkpoint_time這個兩個參數更為準確。假如3個參數一起設置,那么只要達到任一參數值時,就引發checkpoint。
例如:fast_start_io_target=10000,log_checkpoint_interval=10000,log_checkpoint_time=1800。
在redo block=10000時,所包含的data block卻只有8000,就觸發log_checkpoint_interval
在redo block=8000時,所包含的data block 卻有10000,就觸發fast_start_io_target