在數據庫繁忙時如何快速有效的關閉MySQL服務
如果InnoDB_buffer_size參數很大,緩沖區內的臟數據太多,那么關閉
MySQL的時候
必須把臟數據刷新到磁盤,這個過程有可能是很漫長的,從而導致關閉MySQL服務的時間過長。
可以臨時設置innodb_max_dirty_pages_pct=0,然后等到臟數據大部分都刷新到磁盤后(通過查看show engine innodb status命令輸出中的Modified db pages,這個值應該很小),再手動關閉數據庫。
方法1:
mysql>set global innodb_max_dirty_pages_pct=0;
Query OK, 0 rows affected (0.00 sec)
運行命令mysqladmin -uroot ext -i10 |grep dirty,檢查狀態變量值,等到它接近0的時候關閉它,如果是生產繁忙的系統,這個值可能會一直偏大,待innodb_max_dirty_pages的值很小時,就可以
用mysqladmin關閉MySQL了.
# mysqladmin -uroot ext -i10 |grep dirty
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0
方法2:
mysql>set global innodb_fast_shutdown=2; 默認為1
Query OK, 0 rows affected (0.00 sec)
雖然這樣可以快速關閉mysql,但啟動時候需要執行更多的恢復操作.
Innodb_fast_shutdown三個值的含義:
Innodb_fast_shutdown告訴innodb在它關閉的時候該做什么工作。有三個值可以選擇:
0表示在innodb關閉的時候,需要purge all, merge insert buffer,flush dirty pages。這是最慢的一種關閉方式,但是restart的時候也是最快的。后面將介紹purge all,merge insert buffer,flush dirty pages這三者的含義。
1表示在innodb關閉的時候,它不需要purge all,merge insert buffer,只需要flush dirty page。
2表示在innodb關閉的時候,它不需要purge all,merge insert buffer,也不進行flush dirty page,只將log buffer里面的日志flush到log files。因此等下進行恢復的時候它是最耗時的。