資料庫佔用cpu
⑴ 資料庫cpu過高 排查方法
資料庫佔用CPU的使用率過高,有可能是你的資料庫中毒了,建議你重裝系統,然後讓資料庫重裝試一下。
⑵ mysql 伺服器CPU佔用過高,如何調優,求助
通過以前對mysql的操作經驗,先將mysql的配置問題排除了,查看msyql是否運行正常,通過查看mysql data目錄裡面的*.err文件(將擴展名改為.txt)記事本查看即可。如果過大不建議用記事本了,容易死掉,可以用editplus等工具。
簡單的分為下面幾個步驟來解決這個問題:
1、mysql運行正常,也有可能是同步設置問題導致
2、如果mysql運行正常,那就是php的一些sql語句導致問題發現,用root用戶進入mysql管理
mysql -u root -p
輸入密碼
mysql:show processlist 語句,查找負荷最重的 SQL 語句,優化該SQL,比如適當建立某欄位的索引。
通過這個命令我看到原來是有人惡意刷搜索,因為dedecms搜索後面調用搜索最高的詞,導致很多人用工具刷這個,而且是定時有間隔的,所以將這個php程序改名跳轉都方法解決了。
當然如果你的確實是sql語句用了大量的group by等語句,union聯合查詢等肯定會將mysql的佔用率提高。所以就需要優化sql語句,網站盡量生成靜態的,一般4W ip的靜態網站,mysql佔用率幾乎為0的。所以這對於程序員的經驗是個考慮。盡量提高mysql性能 (MySQL 性能優化的最佳20多條經驗分享)
下面是豆芽收集的文章,大家都可以參考下
MYSQL CPU 佔用 100% 的現象描述
早上幫朋友一台伺服器解決了 Mysql cpu 佔用 100% 的問題。稍整理了一下,將經驗記錄在這篇文章里
朋友主機(Windows 2003 + IIS + PHP + MYSQL )近來 MySQL 服務進程 (mysqld-nt.exe) CPU 佔用率總為 100% 高居不下。此主機有10個左右的 database, 分別給十個網站調用。據朋友測試,導致 mysqld-nt.exe cpu 佔用奇高的是網站A,一旦在 IIS 中將此網站停止服務,CPU 佔用就降下來了。一啟用,則馬上上升。
MYSQL CPU 佔用 100% 的解決過程
今天早上仔細檢查了一下。目前此網站的七日平均日 IP 為2000,PageView 為 3萬左右。網站A 用的 database 目前有39個表,記錄數 60.1萬條,占空間 45MB。按這個數據,MySQL 不可能佔用這么高的資源。
於是在伺服器上運行命令,將 mysql 當前的環境變數輸出到文件 output.txt:
d:\web\mysql> mysqld.exe --help >output.txt
發現 tmp_table_size 的值是默認的 32M,於是修改 My.ini, 將 tmp_table_size 賦值到 200M:
d:\web\mysql> notepad c:\windows\my.ini
[mysqld]
tmp_table_size=200M
然後重啟 MySQL 服務。CPU 佔用有輕微下降,以前的CPU 佔用波形圖是 100% 一根直線,現在則在 97%~100%之間起伏。這表明調整 tmp_table_size 參數對 MYSQL 性能提升有改善作用。但問題還沒有完全解決。
於是進入 mysql 的 shell 命令行,調用 show processlist, 查看當前 mysql 使用頻繁的 sql 語句:
mysql> show processlist;
反復調用此命令,發現網站 A 的兩個 SQL 語句經常在 process list 中出現,其語法如下:
SELECT t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
ORDER BY t1.pid
LIMIT 0,15
調用 show columns 檢查這三個表的結構 :
mysql> show columns from _myuser;
mysql> show columns from _mydata;
mysql> show columns from _mydata_body;
終於發現了問題所在:_mydata 表,只根據 pid 建立了一個 primary key,但並沒有為 userid 建立索引。而在這個 SQL 語句的第一個 LEFT JOIN ON 子句中:
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
_mydata 的 userid 被參與了條件比較運算。於是我為給 _mydata 表根據欄位 userid 建立了一個索引:
mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` )
建立此索引之後,CPU 馬上降到了 80% 左右。看到找到了問題所在,於是檢查另一個反復出現在 show processlist 中的 sql 語句:
SELECT COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
WHERE t1.pid=t2.pid and t2.keywords = '孔雀'
經檢查 _mydata_key 表的結構,發現它只為 pid 建了了 primary key, 沒有為 keywords 建立 index。_mydata_key 目前有 33 萬條記錄,在沒有索引的情況下對33萬條記錄進行文本檢索匹配,不耗費大量的 cpu 時間才怪。看來就是針對這個表的檢索出問題了。於是同樣為 _mydata_key 表根據欄位 keywords 加上索引:
mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` )
建立此索引之後,CPU立刻降了下來,在 50%~70%之間震盪。
再次調用 show prosslist,網站A 的sql 調用就很少出現在結果列表中了。但發現此主機運行了幾個 Discuz 的論壇程序, Discuz 論壇的好幾個表也存在著這個問題。於是順手一並解決,cpu佔用再次降下來了。(2007.07.09 附註:關於 discuz 論壇的具體優化過程,我後來另寫了一篇文章,詳見:千萬級記錄的 Discuz! 論壇導致 MySQL CPU 100% 的 優化筆記 )
解決 MYSQL CPU 佔用 100% 的經驗總結
增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默認大小是 32M。如果一張臨時表超出該大小,MySQL產生一個 The table tbl_name is full 形式的錯誤,如果你做很多高級 GROUP BY 查詢,增加 tmp_table_size 值。
對 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的條件判斷中用到的欄位,應該根據其建立索引 INDEX。索引被用來快速找出在一個列上用一特定值的行。沒有索引,MySQL不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。表越大,花費時間越多。如果表對於查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數據文件的中間,沒有必要考慮所有數據。如果一個表有1000行,這比順序讀取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B樹中存儲。
根據 mysql 的開發文檔:
索引 index 用於:
快速找出匹配一個WHERE子句的行
當執行聯結(JOIN)時,從其他表檢索行。
對特定的索引列找出MAX()或MIN()值
如果排序或分組在一個可用鍵的最左面前綴上進行(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。如果所有鍵值部分跟隨DESC,鍵以倒序被讀取。
在一些情況中,一個查詢能被優化來檢索值,不用咨詢數據文件。如果對某些表的所有使用的列是數字型的並且構成某些鍵的最左面前綴,為了更快,值可以從索引樹被檢索出來。
假定你發出下列SELECT語句:
mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
如果一個多列索引存在於col1和col2上,適當的行可以直接被取出。如果分開的單行列索引存在於col1和col2上,優化器試圖通過決定哪個索引將找到更少的行並來找出更具限制性的索引並且使用該索引取行。
⑶ SQL佔用了CPU將近100%的資源
SQL佔用了CPU將近100%的資源,解決方法如下:
1、伺服器CPU過高,首先查看系統進程,確定引發CPU過高的進程;
2、通過SQLServer Profiler能夠輕易監控到哪些SQL語句執行時間過長,消耗最多的CPU;
3、通過SQL語句是可以查看每條SQL語句消耗的CPU是多少;
4、導致CPU高的都是進行大量計算的語句:包括內存排序、表掃描、編譯計劃等;
5、如果使用Top刷選前面幾條語句,則盡量為Order By子句建立索引,這樣可以減少對所有的刷選結果進行排序;
6、使用Count查詢記錄數時,盡量通過為where字句的相關欄位建立索引以減少表掃描。如果多個表進行join操作,則把相關的表連接欄位建立在包含索引中;
7、通過服務端通知的方式,減少SQL語句的查詢;
8、通過表分區,盡量降低因為添加索引而導致表插入較慢的影響。
⑷ 求教,資料庫cpu佔用總是100
關掉隨機開啟項,隨機開啟項開得越多,麻煩越多。無論什麼程式都是能等到開啟完畢再打開(OPEN)的。
①開始→運行→輸入:msconfig 回車打開(OPEN)【系統(System)配置實用程式】→開啟項→禁用無用的隨機開啟項。
②也能用第三方軟體優化:360安全衛士→優化加速→【開啟項】→選中不要的東東→禁止開啟
③假如電腦(PC)安裝了列印機、掃描儀等設備,或在開啟時剛剛連接了USB硬碟,那麼不妨試試先將它們斷開,看看開啟速度是不是有變化。一般來說,由於USB介面速度較慢,因此相應設備會對電腦(PC)開啟速度有較明顯的影響,盡量在開啟後再連接USB設備。
④看看光碟機內是不是有光碟看有光碟,電腦(PC)開啟計算機也會讀盤的。
⑸ sql cpu佔用率高怎麼解決
1、佔用率高,多數是因為SQL語句的問題,可以使用以下語句進行排查
USEmaster
GO
--若要指定資料庫就修改USE後面的部分
SELECT*FROMsys.[sysprocesses]WHERE[spid]>50--ANDDB_NAME([dbid])='gposdb'
SELECTCOUNT(*)FROM[sys].[dm_exec_sessions]WHERE[session_id]>50
2、檢查程序是否存在高頻率的循環
3、檢查SQL是否有嵌套觸發器,這個是最難檢查,也是最難發現的
4、CPU本來就很次,需要更換更好的CPU
⑹ Mysql佔用CPU達100%,怎麼解決!! - PHP進階討論
1.檢查數據關鍵欄位是否建立索引2.檢查是否太多未關閉鏈接3.索引是否被頻繁更新4.被查詢表記錄的數量是否過多5.表與表關聯查詢,是否數據量過多6.檢查緩沖設置7.優化SQL語句8.你用PHP5,可能也用了MYSQL5,盡量使用存儲過程。
⑺ mysql什麼能夠影響資料庫服務佔用cpu使用率過多
CPU佔用過高診斷思路,舉個栗子~
mpstat -P ALL 1,查看cpu使用情況,主要消耗在sys即os系統調用上
⑻ win2012 sql2014資料庫 cpu佔用過高怎麼解決辦法
可以做如下考慮:
1.打開慢查詢日誌,查詢是否是某個SQL語句佔用過多資源,如果是的話,可以對SQL語句進行優化,比如優化 insert 語句、優化 group by 語句、優化 order by 語句、優化 join 語句等等;
2.考慮索引問題;
3.定期分析表,使用optimize table;
4.優化資料庫對象;
5.考慮是否是鎖問題;
6.調整一些MySQL Server參數,比如key_buffer_size、table_cache、innodb_buffer_pool_size、innodb_log_file_size等等;
7.如果數據量過大,可以考慮使用MySQL集群或者搭建高可用環境。