當(dāng)我們被人雇來監(jiān)測(cè)MySQL性能時(shí),人們希望我們能夠檢視一下MySQL配置然后給出一些提高建議。許多人在事后都非常驚訝,因?yàn)槲覀兘ㄗh他們僅僅改動(dòng)幾個(gè)設(shè)置,即使是這里有好幾百個(gè)配置項(xiàng)。這篇文章的目的在于給你一份非常重要的配置項(xiàng)清單。
我們?cè)趲啄昵霸诓┛屠锝o出了這樣的建議,但是MySQL的世界變化實(shí)在太快了!
即使是經(jīng)驗(yàn)老道的人也會(huì)犯錯(cuò),會(huì)引起很多麻煩。所以在盲目的運(yùn)用這些推薦之前,請(qǐng)記住下面的內(nèi)容:
一次只改變一個(gè)設(shè)置!這是測(cè)試改變是否有益的唯一方法。
大多數(shù)配置能在運(yùn)行時(shí)使用SET GLOBAL改變。這是非常便捷的方法它能使你在出問題后快速撤銷變更。但是,要永久生效你需要在配置文件里做出改動(dòng)。
一個(gè)變更即使重啟了MySQL也沒起作用?請(qǐng)確定你使用了正確的配置文件。請(qǐng)確定你把配置放在了正確的區(qū)域內(nèi)(所有這篇文章提到的配置都屬于 [mysqld])
服務(wù)器在改動(dòng)一個(gè)配置后啟不來了:請(qǐng)確定你使用了正確的單位。例如,innodb_buffer_pool_size的單位是MB而max_connection是沒有單位的。
不要在一個(gè)配置文件里出現(xiàn)重復(fù)的配置項(xiàng)。如果你想追蹤改動(dòng),請(qǐng)使用版本控制。
你需要經(jīng)常察看以下3個(gè)配置項(xiàng)。不然,可能很快就會(huì)出問題。
innodb_buffer_pool_size:這是你安裝完InnoDB后第一個(gè)應(yīng)該設(shè)置的選項(xiàng)。緩沖池是數(shù)據(jù)和索引緩存的地方:這個(gè)值越大越好,這能保證你在大多數(shù)的讀取操作時(shí)使用的是內(nèi)存而不是硬盤。典型的值是5-6GB(8GB內(nèi)存),20-25GB(32GB內(nèi)存),100-120GB(128GB內(nèi)存)。
一開始就把innodb_log_file_size設(shè)置成512M(這樣有1GB的redo日志)會(huì)使你有充裕的寫操作空間。如果你知道你的應(yīng)用程序需要頻繁的寫入數(shù)據(jù)并且你使用的時(shí)MySQL 5.6,你可以一開始就把它這是成4G。
從MySQL 5.5版本開始,InnoDB就是默認(rèn)的存儲(chǔ)引擎并且它比任何其他存儲(chǔ)引擎的使用都要多得多。那也是為什么它需要小心配置的原因。
innodb_file_per_table:這項(xiàng)設(shè)置告知InnoDB是否需要將所有表的數(shù)據(jù)和索引存放在共享表空間里(innodb_file_per_table = OFF) 或者為每張表的數(shù)據(jù)單獨(dú)放在一個(gè).ibd文件(innodb_file_per_table = ON)。每張表一個(gè)文件允許你在drop、truncate或者rebuild表時(shí)回收磁盤空間。這對(duì)于一些高級(jí)特性也是有必要的,比如數(shù)據(jù)壓縮。但是它不會(huì)帶來任何性能收益。你不想讓每張表一個(gè)文件的主要場(chǎng)景是:有非常多的表(比如10k+)。
innodb_flush_method: 這項(xiàng)配置決定了數(shù)據(jù)和日志寫入硬盤的方式。一般來說,如果你有硬件RAID控制器,并且其獨(dú)立緩存采用write-back機(jī)制,并有著電池?cái)嚯姳Wo(hù),那么應(yīng)該設(shè)置配置為O_DIRECT;否則,大多數(shù)情況下應(yīng)將其設(shè)為fdatasync(默認(rèn)值)。sysbench是一個(gè)可以幫助你決定這個(gè)選項(xiàng)的好工具。
log_bin:如果你想讓數(shù)據(jù)庫服務(wù)器充當(dāng)主節(jié)點(diǎn)的備份節(jié)點(diǎn),那么開啟二進(jìn)制日志是必須的。如果這么做了之后,還別忘了設(shè)置server_id為一個(gè)唯一的值。就算只有一個(gè)服務(wù)器,如果你想做基于時(shí)間點(diǎn)的數(shù)據(jù)恢復(fù),這(開啟二進(jìn)制日志)也是很有用的:從你最近的備份中恢復(fù)(全量備份),并應(yīng)用二進(jìn)制日志中的修改(增量備份)。二進(jìn)制日志一旦創(chuàng)建就將永久保存。所以如果你不想讓磁盤空間耗盡,你可以用 PURGE BINARY LOGS 來清除舊文件,或者設(shè)置 expire_logs_days 來指定過多少天日志將被自動(dòng)清除。
skip_name_resolve:當(dāng)客戶端連接數(shù)據(jù)庫服務(wù)器時(shí),服務(wù)器會(huì)進(jìn)行主機(jī)名解析,并且當(dāng)DNS很慢時(shí),建立連接也會(huì)很慢。因此建議在啟動(dòng)服務(wù)器時(shí)關(guān)閉skip_name_resolve選項(xiàng)而不進(jìn)行DNS查找。唯一的局限是之后GRANT語句中只能使用IP地址了,因此在添加這項(xiàng)設(shè)置到一個(gè)已有系統(tǒng)中必須格外小心。
總結(jié)
當(dāng)然還有其他的設(shè)置可以起作用,取決于你的負(fù)載或硬件:在慢內(nèi)存和快磁盤、高并發(fā)和寫密集型負(fù)載情況下,你將需要特殊的調(diào)整。然而這里的目標(biāo)是使得你可以快速地獲得一個(gè)穩(wěn)健的MySQL配置,而不用花費(fèi)太多時(shí)間在調(diào)整一些無關(guān)緊要的MySQL設(shè)置或讀文檔找出哪些設(shè)置對(duì)你來說很重要上。
聯(lián)系客服