原文鏈接:https://www.modb.co/db/24698 (復(fù)制鏈接至瀏覽器,即可查看)
摘要:MySQL 正常情況下關(guān)閉啟動(dòng)服務(wù)的時(shí)候?yàn)槭裁绰?想過嗎! 帶著疑問,看下下面的查證
有一次,在客戶現(xiàn)場(chǎng),調(diào)優(yōu)的時(shí)候發(fā)現(xiàn)配置128G內(nèi)存服務(wù)器,但innodb_buffer_pool_size 設(shè)置 4G 和100G的情況下,發(fā)現(xiàn)關(guān)機(jī)啟動(dòng)的時(shí)候非常慢?突然蒙了,沒碰到過這樣的場(chǎng)景。帶著疑問,就進(jìn)行查證有如下設(shè)置。
MySQL提供關(guān)閉啟動(dòng)熱數(shù)據(jù)參數(shù):
show variables where variable_name like 'innodb_buffer_pool_dump%'
or variable_name like 'innodb_buffer_pool_load%';
在MySQL5.6里一個(gè)新特性
- innodb_buffer_pool_dump_at_shutdown = 1解釋:在關(guān)閉時(shí)把熱數(shù)據(jù)dump到本地磁盤。
- innodb_buffer_pool_dump_now = 1解釋:采用手工方式把熱數(shù)據(jù)dump到本地磁盤。
- innodb_buffer_pool_dump_pct解釋:指定每個(gè)緩沖池最近使用的頁面讀取和轉(zhuǎn)儲(chǔ)的百分比。 范圍是1到100。默認(rèn)值是25。例如,如果有4個(gè)緩沖池,每個(gè)緩沖池有100個(gè)page,并且innodb_buffer_pool_dump_pct設(shè)置為25,則dump每個(gè)緩沖池中最近使用的25個(gè)page。
- innodb_buffer_pool_load_abort是否要中止緩沖池加載操作,默認(rèn)是關(guān)閉的
- innodb_buffer_pool_load_at_startup = 1解釋:在啟動(dòng)時(shí)把熱數(shù)據(jù)加載到內(nèi)存。
- innodb_buffer_pool_load_now = 1解釋:采用手工方式把熱數(shù)據(jù)加載到內(nèi)存。
保存緩沖區(qū)文件
關(guān)閉MySQL時(shí),會(huì)把內(nèi)存中的熱數(shù)據(jù)保存在磁盤里ib_buffer_pool文件中,位于redo日志存放的路徑innodb_log_group_home_dir數(shù)據(jù)目錄下。
查看日志,會(huì)發(fā)現(xiàn):
在啟動(dòng)后,會(huì)自動(dòng)加載熱數(shù)據(jù)到Buffer_Pool緩沖池里。查看方式:顯示加載時(shí)間
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
手動(dòng)加載參看配置參數(shù)(innodb_buffer_pool_load_at_startup)
mysql> SHOW variables WHERE variable_name like 'innodb_buffer_pool_dump%'
-> or variable_name like 'innodb_buffer_pool_load%';
查看執(zhí)行狀態(tài):沒有進(jìn)行加載
mysql>SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
手動(dòng)進(jìn)行加載:
mysql> set global innodb_buffer_pool_load_now=1;
這樣,始終保持熱數(shù)據(jù)在內(nèi)存中。
總結(jié):只有在正常關(guān)閉MySQL服務(wù),或者pkill mysql時(shí),會(huì)把熱數(shù)據(jù)dump到內(nèi)存。機(jī)器宕機(jī)或者pkill -9 mysql,是不會(huì)dump。
官方說明:https://dev.mysql.com/doc/refman/5.7/en/innodb-preload-buffer-pool.html