今天遇到了一些關於處理資料庫操作相關的事情,先做一些簡要的總結:
昨天老大安排要測試一下資料庫單表中可以插入多少條記錄,為此做了個簡單的網頁來跑這個程式,昨天下班的時候忘記查看記錄,為此導致在同一資料庫的其他項目不能正確拉取資料庫。錯誤的原因很簡單,資料庫所在的磁碟分割已滿,資料庫不滿進行資料庫操作。
在得到資料庫所在磁碟分割已滿的情況下,首先想到的是要將測試資料刪除掉,我們採取的操作為清表操作,即truncate table document,但是過了一段時間卻沒有卻發現“show processlist”該語句依然在“waiting for table”。此後kill了這條語句,依然發現“waiting for table”。而執行這兩條語句期間“select count(*) from documents ”的結構沒有變。此後一段時間一度想直接刪除資料庫相關的檔案,經與營運的同事一討論發現這是時分愚蠢的做法。
營運童鞋的提議是刪除一些資料庫所在磁碟分割的一些檔案,然後再進行刪除資料庫的操作。分析了一下該分區下的檔案,竟然發現一程式的記錄檔竟然達到拉31G如此龐大,清空此檔案之後即可進行資料庫的操作。
究其原因,在資料庫操作過程中,資料庫中部分資料需要回寫到磁碟中。在我操作的MySQL所在磁碟中,使用率已經為100%。所以才會出現在沒用鎖表情況下的“waiting for documents”的提示資訊。
總結處理此類問題的方法:
1、 首先要查看mysql的慢日誌記錄,mysql的設定檔通常存放在/etc/my.cnf中,可以根據此檔案找到mysql設定檔的位置;
2、 利用show processlist,查看當前語句的執行狀態,關鍵是查看該語句是否被“Locked”;
3、 分析Locked的原因;
4、 查看MySQL所在磁碟分割的使用方式。
附此次操作中的學習的主要命令:
1、 殺掉MySQL中執行某些語句串連的方式,kill該串連的ID號,類似於殺死進程一樣的方式;
2、 查看系統的分區情況:
3、查看分區下檔案大小的命令
順便也學習了一下關於MySQL鎖的相關概念:
MySQL的鎖並非像Linux中的P/V鎖。如果在Linux中用sem_wait和sem_post進行P/V鎖操作,如果此時發生死結,沒有其他可以選擇的方式,只能由系統的守護來負責解鎖操作。但是在MySQL中的鎖,即使執行該操作的MySQL進程顯示為“Locked”,並非是顯示死結,而是臨時鎖,而是等待前面正在執行的語句執行完畢,釋放該表的時候,此鎖就會解鎖,繼續執行該語句。MySQL就像對所有待執行的語句做了一個等待隊列,在等待隊列中的語句顯示為“Locked”狀態。