1.查參數(shù)配置

成都創(chuàng)新互聯(lián)公司始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達十年累計超上千家客戶的網(wǎng)站建設總結了一套系統(tǒng)有效的營銷解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:酒店設計等企業(yè),備受客戶贊揚。
目前積累的使用經(jīng)驗中,存儲過程函數(shù)觸發(fā)器視圖 在MySQL場景下是不適合的。性能不好,又容易發(fā)現(xiàn)內存不釋放的問題,所以建議盡量避免.
2.存儲過程函數(shù)
3.視圖
4.觸發(fā)器
5.1 總內存使用
5.2 分事件統(tǒng)計內存
5.3 賬號級別統(tǒng)計
5.4 線程對應sql語句,內存使用統(tǒng)計
5.5 打開所有內存性能監(jiān)控,會影響性能,需注意
5.6 系統(tǒng)表內存監(jiān)控信息
6.top 命令
8.ps命令
9.pmap 命令
pmap是Linux調試及運維一個很好的工具,查看進程的內存映像信息
用法1:執(zhí)行一段時間記錄數(shù)據(jù)變化,最少20個記錄,下面69265是MySQL pid
用法2:linux 命令pmap MySQL pid導出內存,下面69265是MySQL pid
RSS就是這個process實際占用的物理內存。
Dirty: 臟頁的字節(jié)數(shù)(包括共享和私有的)。
Mapping: 占用內存的文件、或[anon](分配的內存)、或[stack](堆棧)。
writeable/private:進程所占用的私有地址空間大小,也就是該進程實際使用的內存大小。
1.首先使用/top/free/ps在系統(tǒng)級確定是否有內存泄露。如有,可以從top輸出確定哪一個process。
2.pmap工具是能幫助確定process是否有memory leak。確定memory leak的原則:writeable/private (‘pmap –d’輸出)如果在做重復的操作過程中一直保持穩(wěn)定增長,那么一定有內存泄露
最近接了一個鍋,進入新公司接手了一個進入交付階段的項目.在code?review的時候發(fā)現(xiàn)很多問題,然后開始修復bug.
在測試階段突然發(fā)現(xiàn)幾乎所有涉及到更新的操作都失敗,下面貼出異常信息.
第一次 出現(xiàn)的時候百度了一下,猜想可能是多服務部署資源沖突,重啟服務故障消失.所以沒有特別重視
第二次 出現(xiàn)的時候只有測試環(huán)境部署,不存在多機資源沖突的問題,猜想是多線程資源交叉導致的,于是給可能導致資源競爭的地方加上了分布式鎖.
由于無法重現(xiàn)故障,所以并沒有確認問題得到解決.
第三次 故障依舊,當發(fā)現(xiàn)問題依然存在的時候,開始認真反思,發(fā)現(xiàn)自己解決問題的思路明顯有問題,過于片面,一直都只在應用層面尋求解決問題的辦法,而且解決問題的方式也只是在嘗試百度出來的方法.并沒有去思考更深層的問題.
在Mysql5.5中,information_schema 庫中增加了三個關于鎖的表(MEMORY引擎);
INNODB_TRX ## 當前運行的所有事務
INNODB _LOCKS ## 當前出現(xiàn)的鎖
INNODB_LOCK_WAITS ## 鎖等待的對應關系
通過查詢 INNODB_TRX 發(fā)現(xiàn)
當前事務中又兩個RUNNING狀態(tài)開始時間在一個小時之前
開始一直以為是鎖表了
查看了 INNODB _LOCKS? 事務信息之后發(fā)現(xiàn)有4行數(shù)據(jù)被鎖住了一直沒有釋放
從這里開始發(fā)現(xiàn)問題了,應用已經(jīng)拋了異常,事務理所當然的應該回滾才對,為什么資源依然沒有釋放,導致持續(xù)的阻塞呢?
其實最開始的異常信息就已經(jīng)給出了答案,回到開始的地方,再看異常信息就很清楚了,應用里面的異常類是 MySQLTransactionRollBackException
是一個回滾異常, 這就說明在事務回滾的時候出了問題資源沒有得到釋放
然后開始查詢 MySQLTransactionRollBackException? 相關的信息
這個時候 innodb_rollback_on_timeout =0(默認配置)這個MySQL的配置開始進入我的視線,
舉個栗子
事務在鎖等待超時后是回滾事務內所有的statement還是最后一條語句;
0表示rollback最后一條語句,默認值; 有點坑爹啊( 細思極恐 )
1表示回滾事務內所有的statements;(此參數(shù)是只讀參數(shù),需在my.cnf中配置,并且重啟生效;)
吃過一次虧,這次并沒有盲目的相信百度到的信息
于是開始測試
一、驗證innodb_rollback_on_timeout=off的情況
1.session?A
開啟事務,事務未提交,鎖住id=1的數(shù)據(jù)
2.session B?
開啟事務,執(zhí)行更新id=2的數(shù)據(jù)成功(事務未提交,鎖住id=2),然后請求id=1等待鎖超時,id=2的數(shù)據(jù)更改為222.
3.session C
請求id=2的數(shù)據(jù)50秒后顯示等待鎖超時
執(zhí)行 SELECT * FROM information_schema.INNODB_TRX;
可發(fā)現(xiàn)有資源一直未釋放,具體到測試數(shù)據(jù)中就是id=2的資源一直被鎖定,線程一直被掛起.
總結:通過實驗基本可以確定是業(yè)務資源交叉導致死鎖之后資源沒釋放造成的持續(xù)阻塞,
二.驗證innodb_rollback_on_timeout=on
修改配置后將驗證innodb_rollback_on_timeout=off的步驟再走一遍
發(fā)現(xiàn)鎖等待只能在業(yè)務層面盡量避免
on/off的區(qū)別在于session?C進入時不會持續(xù)阻塞,session B異常后全部回滾
查看mysql日志,查看是什么原因導致數(shù)據(jù)庫宕機。然后根據(jù)原因分析問題。
排查思路..... 我都是第一時間去看日志
弄個監(jiān)控程序 監(jiān)控一切可以監(jiān)控的信息 最好能圖形化的
然后觀察出問題的點到底發(fā)生了什么
如果程序是你寫的 也可以在程序里加標記 追蹤程序
總之 就是收集信息 發(fā)現(xiàn)異常
另外
可以分成幾塊 系統(tǒng) 網(wǎng)絡 mysql 你的某程序 改變一個變量 察看是否正常 正常了就是那個變量的問題了
解決方法一:
打開“服務”項目,選擇mysql服務,在右鍵中選擇其“恢復”選項,它負責服務失敗時計算機的反應。每一次失敗時,你可以選擇(1)不操作;(2)重新啟動服務;(3)運行一個程序;(4)重啟服務器。您可以在第一次和第二次失敗時選擇重新啟動服務,第三次失敗就重啟服務器,這樣可以在無人值守的情況下達到自穩(wěn)。但遺憾的是windows的這項內置服務工作時并不盡如人意。
解決方法二:
定期優(yōu)化MySQL,這可以通過Mysql administrator來執(zhí)行,也可以使用mysql的維護工具mysqlcheck,使用方法為:進入Mysql的Bin目錄:C:\Program Files\MySQL\MySQL Server 4.1\bin 運行:mysqlcheck -A -o -r -uroot -p123456(注意,將123456改成你自己的root用戶密碼, 如無請留空 ),有時可以起到一定的作用。
解決方法三:
建立一個php+mysql的簡單網(wǎng)站,在服務器監(jiān)控王的網(wǎng)站監(jiān)視設置中,讓服務器監(jiān)控王軟件定期去訪問這個網(wǎng)站(如60秒一次),如果不能訪問,說明數(shù)據(jù)庫存在問題,將故障回報至您的郵箱或手機中,讓您在第一時間內得知網(wǎng)站訪問情況。如果連續(xù)幾次都不能訪問,您可以選擇自動重啟服務器,從而達到無人值守的狀態(tài)。
解決方法四:
設定服務器監(jiān)控王的SQL監(jiān)視,定期對mysql是否運行進行定期監(jiān)視,如有問題立即重啟或回報。
解決方法五:
對于上面問題中提到某臺服務器準時在掛掉,如凌晨5點,產生這樣的原因分析可能與當前流行的discuz論壇的自動定時備份有關,因為很多客戶定時在凌晨時段自動備份mysql數(shù)據(jù)庫,導致mysql工作忙碌(如有很多的mysql用戶),可以建立一個計劃任務,定時如早上6時將mysql重啟一下。
解決方法六:
更換為非windows主機,運行更少的mysql+PHP網(wǎng)站,當然對于從事虛擬主機業(yè)務的運營商來說是一項損失。
如果你的mysql也出現(xiàn)以上這種提示,
建議你逐個字看完我這篇文章再按以下方法來嘗試解決問題.
這是mysql數(shù)據(jù)庫很多時候出現(xiàn)的問題, 網(wǎng)上流傳很多解決辦法. 有人按照那些方法, 還真可以把問題解決了; 但也有很多人按那些方法解決不了問題!
而這個中原因, 就是沒有對癥下藥!!!
網(wǎng)上的那些方法, 很多都沒有明確指出是什么版本的mysql, 所以導致問題者不能對癥下藥.
出現(xiàn)這個問題, 通過停止/重啟 mysql 服務, 是可以解決的, 這個是最簡單的辦法! 對于不懂得什么叫做"停止/重啟mysql服務"的人來說,
這個最簡單的辦法就是把服務器主機進行重新啟動(就是把你的電腦進行重新啟動).
以上是方法A! (這個方法適合任何版本的mysql)
以下是方法B:(方法僅適用于MySQL4.0.26 版本!!! (我估計,
4.0的其他版本應該也可以的))
網(wǎng)上也有說, 就是對root進行重改密碼. 對于網(wǎng)上流傳的改密碼方法, 也是可行的. 請參考以下:
DOS下修改ROOT密碼:當然后面安裝PHPMYADMIN后修改密碼也可以通過PHPMYADMIN修改
格式:mysqladmin -u用戶名 -p舊密碼 password
新密碼
例:給root加個密碼ideacmblog
首先在進入CMD命令行,轉到MYSQL目錄下的bin目錄,然后鍵入以下命令
mysqladmin
-uroot password ideacmblog
注:因為開始時root沒有密碼,所以-p舊密碼一項就可以省略了。
D:\php\MySQL\binmysqladmin -uroot password
ideacmblog回車后ROOT密碼就設置為ideacmblog了
但是, 請注意了, 以上方法僅適用于MySQL4.0.26
版本!!! (我估計, 4.0的其他版本應該也可以的)
方法C:
好了, 扯了那么多, 以上的兩個方法都不是我本人測試過的, 本人不對真實性負責!
而現(xiàn)在我說一下本人親自試過的方法, 以供參考:
話說今天, 我的服務器所有php及使用了mysql數(shù)據(jù)庫的網(wǎng)站, 均掛掉了! 無法打開,
并有以下提示:
錯誤代碼 1045
Access denied for
user 'root'@'localhost' (using password:YES)
一開始我也是不斷搜索google(我本人不喜歡百度!),
去找尋解決的辦法. 看了很多, 也參照執(zhí)行了, 事實上也是解決不了問題. 后來我想到了是版本的問題, 不同的mysql版本,
解決辦法是不一定一樣的!!記住...
我的mysql版本是: 5.0.22
(mysql-essential-5.0.22-win32)
今天一整天, 那些php網(wǎng)站均罷工. 到今晚才有時間上去服務器繼續(xù)尋找方法, 但仍然解決不了.
最后, 我決定把mysql卸掉重新安裝!
卸載很快, 而且不需要重新啟動計算機.
于是, 繼續(xù)進行安裝.
第一步:
打開這個mysql-essential-5.0.22-win32.exe文件;
第二步: 見到窗口彈出, 并點擊 Next
進入下一步;
第三步: 選擇 Custom 項, 并點擊
Next 進入下一步;
第四步: 到這一步要注意了, 點擊
Change... 選擇你原安裝mysql的目錄; 選擇后, 繼續(xù)點擊Next 進入下一步;
第五步: 點擊 Install
進行安裝...
安裝至下一步, 會提示你進行注冊, 選擇最后一項, 即跳過注冊,
進入下一步正式完成安裝.
安裝完成后, 繼續(xù)彈出一個窗口, 提示你是不是立刻進行配置,
選擇 Next
選擇Standard Configuration.繼續(xù)點擊
Next 進入下一步
這一步里, 把上面那行的勾去掉, 只在 Include
....PATH 那行打勾, 繼續(xù)點擊 Next 進入下一步
在這一步, 點擊中間的"Ex****"那頂,
接著配置完畢!
這時候, 你去看看你的mysql正常了沒有??
!!
這樣就ok了!!!
網(wǎng)站名稱:mysql掛了怎么排查 mysql掛了怎么辦
URL分享:http://chinadenli.net/article44/dodjphe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、手機網(wǎng)站建設、營銷型網(wǎng)站建設、域名注冊、App開發(fā)、Google
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)