安裝完 MySQL 後必須調整的 10 項配置(轉)
當我們被人雇來監測MySQL性能時,人們希望我們能夠檢視一下MySQL配置然後給出一些提高建議。許多人在事後都非常驚訝,因為我們建議他們僅僅改動幾個設置,即使是這裏有好幾百個配置項。這篇文章的目的在於給你一份非常重要的配置項清單。
我們曾在幾年前在博客裏給出了這樣的建議,但是MySQL的世界變化實在太快了!
寫在開始前…
即使是經驗老道的人也會犯錯,會引起很多麻煩。所以在盲目的運用這些推薦之前,請記住下面的內容:
-
一次只改變一個設置!這是測試改變是否有益的唯一方法。
-
大多數配置能在運行時使用SET GLOBAL改變。這是非常便捷的方法它能使你在出問題後快速撤銷變更。但是,要永久生效你需要在配置文件裏做出改動。
-
一個變更即使重啟了MySQL也沒起作用?請確定你使用了正確的配置文件。請確定你把配置放在了正確的區域內(所有這篇文章提到的配置都屬於 [mysqld])
-
服務器在改動一個配置後啟不來了:請確定你使用了正確的單位。例如,innodb_buffer_pool_size的單位是MB而max_connection是沒有單位的。
-
不要在一個配置文件裏出現重復的配置項。如果你想追蹤改動,請使用版本控制。
-
不要用天真的計算方法,例如”現在我的服務器的內存是之前的2倍,所以我得把所有數值都改成之前的2倍“。
基本配置
你需要經常察看以下3個配置項。不然,可能很快就會出問題。
innodb_buffer_pool_size:這是你安裝完InnoDB後第一個應該設置的選項。緩沖池是數據和索引緩存的地方:這個值越大越好,這能保證你在大多數的讀取操作時使用的是內存而不是硬盤。典型的值是5-6GB(8GB內存),20-25GB(32GB內存),100-120GB(128GB內存)。
innodb_log_file_size:這是redo日誌的大小。redo日誌被用於確保寫操作快速而可靠並且在崩潰時恢復。一直到MySQL 5.1,它都難於調整,因為一方面你想讓它更大來提高性能,另一方面你想讓它更小來使得崩潰後更快恢復。幸運的是從MySQL 5.5之後,崩潰恢復的性能的到了很大提升,這樣你就可以同時擁有較高的寫入性能和崩潰恢復性能了。一直到MySQL 5.5,redo日誌的總尺寸被限定在4GB(默認可以有2個log文件)。這在MySQL 5.6裏被提高。
譯者信息
一開始就把innodb_log_file_size設置成512M(這樣有1GB的redo日誌)會使你有充裕的寫操作空間。如果你知道你的應用程序需要頻繁的寫入數據並且你使用的時MySQL 5.6,你可以一開始就把它這是成4G。
max_connections:如果你經常看到‘Too many connections’錯誤,是因為max_connections的值太低了。這非常常見因為應用程序沒有正確的關閉數據庫連接,你需要比默認的151連接數更大的值。max_connection值被設高了(例如1000或更高)之後一個主要缺陷是當服務器運行1000個或更高的活動事務時會變的沒有響應。在應用程序裏使用連接池或者在MySQL裏使用進程池有助於解決這一問題。
innodb_flush_log_at_trx_commit:默認值為1,表示InnoDB完全支持ACID特性。當你的主要關註點是數據安全的時候這個值是最合適的,比如在一個主節點上。但是對於磁盤(讀寫)速度較慢的系統,它會帶來很巨大的開銷,因為每次將改變flush到redo日誌都需要額外的fsyncs。將它的值設置為2會導致不太可靠(unreliable)因為提交的事務僅僅每秒才flush一次到redo日誌,但對於一些場景是可以接受的,比如對於主節點的備份節點這個值是可以接受的。如果值為0速度就更快了,但在系統崩潰時可能丟失一些數據:只適用於備份節點。
innodb_flush_method: 這項配置決定了數據和日誌寫入硬盤的方式。一般來說,如果你有硬件RAID控制器,並且其獨立緩存采用write-back機制,並有著電池斷電保護,那麽應該設置配置為O_DIRECT;否則,大多數情況下應將其設為fdatasync(默認值)。sysbench是一個可以幫助你決定這個選項的好工具。
innodb_log_buffer_size: 這項配置決定了為尚未執行的事務分配的緩存。其默認值(1MB)一般來說已經夠用了,但是如果你的事務中包含有二進制大對象或者大文本字段的話,這點緩存很快就會被填滿並觸發額外的I/O操作。看看Innodb_log_waits狀態變量,如果它不是0,增加innodb_log_buffer_size。
其他設置
query_cache_size: query cache(查詢緩存)是一個眾所周知的瓶頸,甚至在並發並不多的時候也是如此。 最佳選項是將其從一開始就停用,設置query_cache_size = 0(現在MySQL 5.6的默認值)並利用其他方法加速查詢:優化索引、增加拷貝分散負載或者啟用額外的緩存(比如memcache或redis)。如果你已經為你的應用啟用了query cache並且還沒有發現任何問題,query cache可能對你有用。這是如果你想停用它,那就得小心了。
譯者信息
log_bin:如果你想讓數據庫服務器充當主節點的備份節點,那麽開啟二進制日誌是必須的。如果這麽做了之後,還別忘了設置server_id為一個唯一的值。就算只有一個服務器,如果你想做基於時間點的數據恢復,這(開啟二進制日誌)也是很有用的:從你最近的備份中恢復(全量備份),並應用二進制日誌中的修改(增量備份)。二進制日誌一旦創建就將永久保存。所以如果你不想讓磁盤空間耗盡,你可以用 PURGE BINARY LOGS 來清除舊文件,或者設置 expire_logs_days 來指定過多少天日誌將被自動清除。
記錄二進制日誌不是沒有開銷的,所以如果你在一個非主節點的復制節點上不需要它的話,那麽建議關閉這個選項。
skip_name_resolve:當客戶端連接數據庫服務器時,服務器會進行主機名解析,並且當DNS很慢時,建立連接也會很慢。因此建議在啟動服務器時關閉skip_name_resolve選項而不進行DNS查找。唯一的局限是之後GRANT語句中只能使用IP地址了,因此在添加這項設置到一個已有系統中必須格外小心。
總結
當然還有其他的設置可以起作用,取決於你的負載或硬件:在慢內存和快磁盤、高並發和寫密集型負載情況下,你將需要特殊的調整。然而這裏的目標是使得你可以快速地獲得一個穩健的MySQL配置,而不用花費太多時間在調整一些無關緊要的MySQL設置或讀文檔找出哪些設置對你來說很重要上。
安裝完 MySQL 後必須調整的 10 項配置(轉)