解決mysql佔用IO太高

一、日誌產生的性能影響:
因爲日誌的記錄帶來的直接性能損耗就是數據庫系統中最爲昂貴的IO資源。MySQL的日誌包括錯誤日誌(ErrorLog),更新日誌(UpdateLog),二進制日誌(Binlog),查詢日誌(QueryLog),慢查詢日誌(SlowQueryLog)等。固然,更新日誌是老版本的MySQL纔有的,目前已經被二進制日誌替代。mysql

在默認狀況下,系統僅僅打開錯誤日誌,關閉了其餘全部日誌,以達到儘量減小IO損耗提升系統性能的目的。可是在通常稍微重要一點的實際應用場景中,都至少須要打開二進制日誌,由於這是MySQL不少存儲引擎進行增量備份的基礎,也是MySQL實現複製的基本條件。有時候爲了進一步的性能優化,定位執行較慢的SQL語句,不少系統也會打開慢查詢日誌來記錄執行時間超過特定數值(由咱們自行設置)的SQL語句。sql

通常狀況下,在生產系統中不多有系統會打開查詢日誌。由於查詢日誌打開以後會將MySQL中執行的每一條Query都記錄到日誌中,會該系統帶來比較大的IO負擔,而帶來的實際效益卻並非很是大。通常只有在開發測試環境中,爲了定位某些功能具體使用了哪些SQL語句的時候,纔會在短期段內打開該日誌來作相應的分析。因此,在MySQL系統中,會對性能產生影響的MySQL日誌(不包括各存儲引擎本身的日誌)主要就是Binlog了。數據庫

二、mysql內執行以下指令:
set global sync_binlog=500;  
當每進行500次事務提交以後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。
set global innodb_flush_log_at_trx_commit=2;  
默認值1表明每一次事務提交或事務外的指令都須要把日誌寫入(flush)硬盤,這是很費時的。特別是使用電池供電緩存(Battery backed up cache)時。設置爲2表明不寫入硬盤而是寫入系統緩存。日誌仍然會每秒flush到硬盤,因此你通常不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即便MySQL掛了也可能會丟失事務的數據。而值設置爲2只會在整個操做系統宕機時纔可能丟數據。
 
注:從新開機後,該指令失效。可在服務啓動時,設置如上兩項。
相關文章
相關標籤/搜索