innodb buffer pool作為innodb最重要的快取,其快取命中率的高低會直接影響資料庫的效能。因此在資料庫發生變更,比如重啟、主備切換例項遷移等等,innodb buffer poll 需要一段時間預熱,期間資料庫的效能會受到明顯影響。
另外mysql 5.7以前innodb buffer pool快取大小修改不是動態的,重啟才能生效。因此innodb buffer pool的預熱和innodb buffer pool大小的動態修改,對效能要求較高的應用來說是不錯的特性,下面我來看看這兩個特性的具體實現。
mysql 5.6以後支援buffer pool預熱功能。引入了以下引數, 引數具體含義參見官方文件
innodb_buffer_pool_load_now
innodb_buffer_pool_dump_now
innodb_buffer_pool_load_at_startup
innodb_buffer_pool_dump_at_startup
innodb_buffer_pool_filename
buffer pool預熱分為dump過程和load過程,均由後台執行緒buf_dump_thread完成。
比如使用者發起set命令
set global innodb_buffer_pool_load_now=on;
set 命令會立刻返回,具體操作由buf_dump_thread來實現。
dump過程一般比較快,而load過程相對要慢些。
通過innodb_buffer_pool_dump_status
、innodb_buffer_pool_load_status
可檢視dump/load的狀態
另外5.7引入了performance_schema.events_stages_current來顯示load進度,每load 32m會更新一條進度資訊
select * from performance_schema.events_stages_current;
thread_id 19
event_id 1367
end_event_id null
event_name stage/innodb/buffer pool load
source buf0dump.cc:619
timer_start 33393877311000
timer_end 33398961258000
timer_wait 5083947000
work_completed 0
work_estimated 1440
nesting_event_id null
nesting_event_type null
work_estimated表示總page數
work_completed表示當前已load page數
dump檔案的資料格式如下
#cat ib_buffer_pool |more
0,70,1
0,30,2
0,40,11
0,50,6
dump檔案比較簡單,我們可以編輯此檔案來預載入指定page,比較靈活。
5.7 開始支援buffer pool 動態調整大小,每個buffer_pool_instance
都由同樣個數的chunk組成(chunks陣列), 每個chunk記憶體大小為innodb_buffer_pool_chunk_size
(實際會偏大5%,用於存放chuck中的block資訊)。buffer pool以innodb_buffer_pool_chunk_size
為單位進行動態增大和縮小。調整前後innodb_buffer_pool_size
應一直保持是innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
的倍數。
同樣的buffer pool動態調整大小由後台執行緒buf_resize_thread
,set命令會立即返回。通過innodb_buffer_pool_resize_status
可以檢視調整的執行狀態。
由上可以看出,擴大記憶體比縮小記憶體相對容易些。縮小記憶體時,如果遇到有事務一直未提交且占用了待收縮的page時,導致收縮一直重試,error log會列印這種重試資訊,
包含可能引用此問題的事務資訊。為了避免頻繁重試,每次重試的時間間隔會指數增長。
以上步驟中resize階段buffer pool會不可用,此階段會鎖所有buffer pool, 但此階段都是記憶體操作,時間比較短。收縮記憶體階段耗時可能會很長,也有一定影響,但是每次都是以instance為單位進行鎖定的。
總的來說,buffer pool 動態調整大小對應用的影響並不大。
buffer pool 預熱 和buffer pool 動態調整大小,這兩功能相輔相承的。buffer pool 動態調整大小只適用於例項在主機本地公升級的情況,如果使用者修改buffer pool大小,同時涉及跨機遷移,那麼buffer pool 預熱功能就排上用場了。
另外buffer pool 動態調整盡量在業務低鋒時進行。
快速預熱innodb buffer pool
早期,peter在實際的工作中總結了一些預熱buffer pool的sql語句,也就是通過人為模擬一些請求,盡可能地將我們所需的資料塊和索引載入到記憶體中。1.載入主鍵索引 select count from tbl where no index col 0 2.載入非主鍵索引 select cou...
特基礎特基礎的東西隨便寫寫
include include include using namespace std 定義人類 person 資料成員 m strname 成員函式 attack class person 定義士兵類 soldier 士兵類公有繼承人類 資料成員 m strname 成員函式 attack cla...
斯特林數 斯特林反演
第一類stirling數 s n,m 也可記為 beginn m end 第一類stirling分為無符號第一類stirling數 s u n,m 和帶符號第一類stirling數 s s n,m 他們分別表現為其公升階函式和降階函式的各項係數,形式如下 x x cdot x 1 cdot x 2 ...