當前位置: 首頁>>技術教程>>正文


在低內存虛擬機上啟動MySQL

mysql

雲計算讓我們在互聯網上擁有自己的私有虛擬服務器非常實惠。Digital Ocean提供每月5美元的入門級Droplet,而亞馬遜在EC2平台上擁有微型實例層,第一年是免費的。如果您想測試一些新技術(多源複製?)或將其概念放在一起,這些實例是非常有用的。然而,這些服務器具有非常低的內存,通常在半個GB到1GB之間。而現在,通常能看到生產級數據庫服務器的內存是上述的100倍。 100MB的內存使用對這些打內存服務器來說不會有顯著差異,但是對512MB的虛擬機絕對非常可觀。我最近遇到了一個MySQL不能啟動的問題。有趣的是MySQL缺乏任何錯誤提示:

140521 08:26:40 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 
140521 08:26:41 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid

但是,如果我們檢查我們的內核消息,我們清楚地看到內存不足的事件:

May 21 08:26:41 aes2 kernel: Out of memory: Kill process 24774 (mysqld) score 842 or sacrifice child 
May 21 08:26:41 aes2 kernel: Killed process 24774, UID 0, (mysqld) total-vm:549180kB, anon-rss:437324kB, file-rss:44kB

或者在其他情況下,我們看到InnoDB無法分配緩衝池的錯誤:

2014-05-21 08:33:23 25042 [Note] InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12 
2014-05-21 08:33:23 25042 [ERROR] InnoDB: Cannot allocate memory for the buffer pool

但是我們確實有RAM可用:

[root@aes2 ~]# free -m total used free shared buffers cached Mem: 490 86 403 0 7 32 -/+ buffers/cache: 46 443 Swap: 0 0 0 
[root@aes2 ~]#

那麽這裏的問題是性能機製,所以不是很明顯。MySQL啟動時,它會分配所需的所有RAM。默認情況下,它將使用大約400MB的RAM,這對於具有64GB RAM的數據庫服務器基本可以無視,但是對於小型虛擬機來說這是非常要命的。如果您添加默認的InnoDB緩衝池設置為128MB,就會輕易地超過512MB RAM分配,這還不包括任何操作係統占用的內存。我們可以通過將下麵的命令放在[mysqld]部分配置下麵,輕鬆地禁用性能優化模式:

performance_schema = off

當然也可以在性能模式(Performance Schema)下自定義使用那些監視器來減少內存占用。雖然內存受限,最好也能使用所有的功能,比如緩存(buffer pool)。有一個MySQL錯誤報告提供了關於性能模式的一個非常好的描述:[http://bugs.mysql.com/bug.php?id=68514]http://bugs.mysql.com/bug.php?id=68514。還有一個功能請求來打印用於性能模式的內存量,這將使整個問題更加可見:[http://bugs.mysql.com/bug.php?id=69665]http://bugs.mysql.com/bug.php?id=69665

本文翻譯自:Starting MySQL On Low Memory Virtual Machines

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3513.html,未經允許,請勿轉載。