MySQL數(shù)據(jù)庫(kù)CPU飆升到100%的詳細(xì)解決方案
1、定位cpu問(wèn)題所在
當(dāng)cpu飆升到100%時(shí),先用操作系統(tǒng)命令top命令觀(guān)察是不是mysqld占用導(dǎo)致的,如果不是,找出占用高的進(jìn)程,并進(jìn)行相關(guān)處理。
2、查看慢查詢(xún)?nèi)罩?/h2>
進(jìn)入mysql命令行
mysql -h主機(jī)地址 -u用戶(hù)名 -p用戶(hù)密碼
查看慢查詢(xún)SQL是否啟用:ON是開(kāi)啟,OFF是關(guān)閉。
show variables like ‘log_slow_queries';
開(kāi)啟慢查詢(xún)?nèi)罩?/p>
set global log_slow_queries = on;
3、使用show processlist查看運(yùn)行線(xiàn)程
如果是mysqld造成的,show processlist顯示用戶(hù)正在運(yùn)行的線(xiàn)程,看看里面跑的session情況,是不是有消耗資源的sql在運(yùn)行【查看Time這一列最大值】。找出消耗高的sql,看看執(zhí)行計(jì)劃是否準(zhǔn)確,index是否缺失,或者是數(shù)據(jù)量太大造成。
show processlist
注意state字段中如果包含大量的Sending data、Wating for tabls、或者各種Lock、大概率是SQL造成數(shù)據(jù)庫(kù)擁堵。優(yōu)化對(duì)應(yīng)的SQL,開(kāi)啟慢查詢(xún)?nèi)罩?,分析sql語(yǔ)句進(jìn)行優(yōu)化。
一般來(lái)說(shuō),肯定要kill掉這些線(xiàn)程(同時(shí)觀(guān)察cpu使用率是否下降),等進(jìn)行相應(yīng)的調(diào)整(比如說(shuō)加索引、改sql、改內(nèi)存參數(shù))之后,再重新跑這些SQL。
也有可能是每個(gè)sql消耗資源并不多,但是突然之間,有大量的session連進(jìn)來(lái)導(dǎo)致cpu飆升,這種情況就需要跟應(yīng)用一起來(lái)分析為何連接數(shù)會(huì)激增,再做出相應(yīng)的調(diào)整,比如說(shuō)限制連接數(shù)等。
阻止濫用資源的程序: 當(dāng)網(wǎng)站受到攻擊時(shí),有可能在短時(shí)間內(nèi)建立異常高的連接數(shù)量。MySQL中的PROCESSLIST可用于檢測(cè)頂級(jí)用戶(hù)并阻止對(duì)濫用連接的訪(fǎng)問(wèn)。
4、大量的睡眠線(xiàn)程導(dǎo)致CPU過(guò)高
運(yùn)行show full processlist
【1】根據(jù)Command這一列發(fā)現(xiàn)大量的Sleep
【2】再根據(jù)Time這一列 查看當(dāng)前Sleep線(xiàn)程的sql所用的耗時(shí)
【3】根據(jù)sql睡眠線(xiàn)程耗時(shí)時(shí)間 配置msyql
【4】打開(kāi)mysql的配置文件my.cnf文件
配置如下:
vim /etc/my.cnf [mysqld] wait_timeout=20 ## 大于20秒自動(dòng)斷開(kāi) (根據(jù)實(shí)際情況設(shè)置)
配置完成后重啟Mysql,不重啟的話(huà),可以設(shè)置全局的等待超時(shí)時(shí)間
mysql> set global wait_timeout=20; mysql> show global variables like '%timeout';
5、合理優(yōu)化配置項(xiàng)
檢查一下MySQL設(shè)置,有助于確定內(nèi)存使用情況,從而為MySQL分配合適的值。緩存在InnoDB存儲(chǔ)的緩沖池中完成。緩沖池的大小對(duì)系統(tǒng)性能起著關(guān)鍵作用,并被指定為可用RAM的50%-70%之間的值。如果池大小,將導(dǎo)致頁(yè)面過(guò)度刷新,如果太大,將由于內(nèi)存競(jìng)爭(zhēng)而導(dǎo)致交換。
innodb_buffer_pool_size
max_connections為了在任何時(shí)刻為MySQL分配盡可能多的連接數(shù),并避免單個(gè)用戶(hù)使服務(wù)器過(guò)載,需要使用max_connections。每個(gè)線(xiàn)程使用RAM的一部分進(jìn)行緩沖區(qū)分配,因此它根據(jù)RAM的大小限制最大連接數(shù)。
max_connections = (Available RAM – Global Buffers) / Thread Buffers 最大連接數(shù) = (有效內(nèi)存 - 全局緩沖容量)/ 線(xiàn)程緩沖容量
當(dāng)不經(jīng)常更改且Web服務(wù)器接收許多相同查詢(xún)時(shí),查詢(xún)高速緩存可能會(huì)很有用。查詢(xún)緩存將SELECT語(yǔ)句的文本與發(fā)送到客戶(hù)端的相應(yīng)結(jié)果一起存儲(chǔ)。
query_cache_size
因此,此參數(shù)僅用于此類(lèi)應(yīng)用程序服務(wù)器,否則將被禁用,并為其他服務(wù)器設(shè)置為零。
為了避免資源爭(zhēng)用,盡管啟用了該功能,但應(yīng)將該值設(shè)置為10MB左右的最小值。
總結(jié)
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)CPU飆升到100%的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫(kù)CPU飆升100%內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Linux環(huán)境下mysql的root密碼忘記解決方法(三種)
這篇文章主要介紹了在Linux環(huán)境下mysql的root密碼忘記解決方法,詳細(xì)的介紹了3種解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12
MySQL數(shù)據(jù)庫(kù)的shell腳本自動(dòng)備份
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)的shell腳本自動(dòng)備份的相關(guān)資料,網(wǎng)站或應(yīng)用的后臺(tái)都有備份數(shù)據(jù)庫(kù)的功能按鈕,但需要去手工執(zhí)行。我們需要一種安全的,每天自動(dòng)備份的方法需要的朋友可以參考下2017-03-03
mysql存儲(chǔ)過(guò)程之創(chuàng)建(CREATE PROCEDURE)和調(diào)用(CALL)及變量創(chuàng)建(DECLARE)和賦值(SET
這篇文章主要介紹了mysql存儲(chǔ)過(guò)程之創(chuàng)建(CREATE PROCEDURE)和調(diào)用(CALL)及變量創(chuàng)建(DECLARE)和賦值(SET)操作方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了mysql存儲(chǔ)過(guò)程創(chuàng)建、調(diào)用及變量創(chuàng)建、賦值具體原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-12-12
mysql中update按照多重條件進(jìn)行更新處理的方案
更新數(shù)據(jù)是使用數(shù)據(jù)庫(kù)時(shí)最重要的任務(wù)之一,下面這篇文章主要給大家介紹了關(guān)于mysql中update按照多重條件進(jìn)行更新處理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
PHP MYSQL注入攻擊需要預(yù)防7個(gè)要點(diǎn)
這篇文章主要介紹了PHP MYSQL開(kāi)發(fā)中,對(duì)于注入攻擊需要預(yù)防的7個(gè)要點(diǎn),大家需要注意了2013-11-11
Linux下將數(shù)據(jù)庫(kù)從MySQL遷移到MariaDB的基礎(chǔ)操作教程
這篇文章主要介紹了將數(shù)據(jù)庫(kù)從MySQL遷移到MariaDB的基礎(chǔ)操作教程,當(dāng)然遷移之前不要忘記數(shù)據(jù)庫(kù)的備份!需要的朋友可以參考下2015-11-11

