最近遇到了一個坑,MySQL數(shù)據(jù)庫服務(wù)器硬盤容量告警,而且因為非技術(shù)原因,還不能追加硬盤。
目前創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、東豐網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
通過監(jiān)控發(fā)現(xiàn),磁盤IO一直100%。直接影響就是系統(tǒng)處理時間越來越長,接口響應(yīng)耗時也越來越多。
經(jīng)過分析,發(fā)現(xiàn)mysql業(yè)務(wù)數(shù)據(jù)庫里有好幾張大表,而且這幾張大表行數(shù)都在5000萬以上,文件大小都在100G和150G之間。
因為這些表都是備份表,第一反應(yīng)就是找DBA直接清理掉這些表。 潛意識里以為drop table 和 truncate table效率很高,都會快速完成,但事實上不是。 但意外的是,在執(zhí)行drop table時,直接導(dǎo)致數(shù)據(jù)庫掛起了,而且還發(fā)生了主從切換。
第一次嘗試失敗。
第一次失敗反應(yīng)出來的問題是,如果數(shù)據(jù)文件過大,drop table操作也得慎用。
那我們可以在drop table之前,想辦法把數(shù)據(jù)文件邏輯清空。比如Linux硬連接的方式,具體步驟如下(假如目標(biāo)表名是test):
ln test.ibd test.ibd.hdlk
drop table test;
此時,磁盤上真實的數(shù)據(jù)其實沒刪除,但數(shù)據(jù)庫里的表,已經(jīng)刪除了。
rm test.ibd.hdlk
到此,數(shù)據(jù)就能快速清理成功了。
你寫了一條正常的update 或者 delete 語句時,語句本身是沒問題的,但是卻執(zhí)行不了。原因是是MySQL Workbench的安全設(shè)置。當(dāng)要執(zhí)行的SQL語句是進行批量更新或者刪除的時候就會提示這個錯誤。
打開Workbench的菜單Edit-Preferences xxx-切換到SQL Editor
把Forbid UPDATE and DELETE statements without a WHERE clause (safe updates)的勾去掉擊[OK]按鈕重新啟動就OK了。
或者在每句語句前,加上‘SET SQL_SAFE_UPDATES=0;’
問題就解決了。
(ps:以后我會分享我所遇到的問題,這里持續(xù)更新?。?/p>
進入“控制面板-管理工具-服務(wù)”查看才發(fā)現(xiàn),雖然MYSQL已經(jīng)卸載了,但是MYSQL服務(wù)仍然殘留在系統(tǒng)服務(wù)里。
又不想改服務(wù)名,改怎么辦呢。
只要在CMD里輸入一跳命令就可以將服務(wù)刪除:
sc delete mysql //這里的mysql是你要刪除的服務(wù)名
這樣一來服務(wù)就被刪除了,進入服務(wù)里查看確實沒有mysql服務(wù)了,OK。
這是一項新功能,用于指定在插入或更新到一行之前檢查值的條件。如果表的任何行的搜索條件的結(jié)果為 FALSE,則約束可能返回錯誤(但如果結(jié)果為 UNKNOWN 或 TRUE,則約束不會返回錯誤)。此功能開始在 MySQL 8.0.16 上運行,在以前的版本中,我們可以創(chuàng)建它,但它不起作用,這意味著支持語法,但不起作用。要牢記的使用規(guī)則:
AUTO_INCREMENT 自增列不允許使用
引用另一個表中的另一列不允許使用
存儲的函數(shù)和用戶定義的函數(shù)不允許使用
存儲過程和函數(shù)參數(shù)不允許使用
子查詢不允許使用
在外鍵中用于后續(xù)操作(ON UPDATE,ON DELETE)的列不允許使用
為下一條語句 INSERT,UPDATE,REPLACE,LOAD DATA 和 LOAD XML 評估此次監(jiān)測。此外,還會為 INSERT IGNORE,UPDATE IGNORE,LOAD DATA…IGNORE 和 LOAD XML…IGNORE 評估此監(jiān)測約束。對于這些語句,如果約束的評估結(jié)果為 FALSE,則會發(fā)生警告。插入或更新被跳過。
我們可以使用此功能在表中添加更多的邏輯,但是根據(jù)我以前作為程序員的經(jīng)驗,我不建議在表中添加邏輯,因為除非您無法訪問應(yīng)用程序代碼,否則很難找到或調(diào)試錯誤。
卸載之后,在你的系統(tǒng)賬號目錄下,有一個mysql的文件夾要把那個照出來刪除了才可以。你可以通過搜索
data來找。
有兩種方法,一種方法使用mysql的check table和repair table 的sql語句,另一種方法是使用MySQL提供的多個myisamchk, isamchk數(shù)據(jù)檢測恢復(fù)工具。前者使用起來比較簡便。推薦使用。
1. check table 和 repair table
登陸mysql 終端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出現(xiàn)的結(jié)果說Status是OK,則不用修復(fù),如果有Error,可以用:
repair table tabTest;
進行修復(fù),修復(fù)之后可以在用check table命令來進行檢查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk適用于MYISAM類型的數(shù)據(jù)表,而isamchk適用于ISAM類型的數(shù)據(jù)表。這兩條命令的主要參數(shù)相同,一般新的系統(tǒng)都使用MYISAM作為缺省的數(shù)據(jù)表類型,這里以myisamchk為例子進行說明。當(dāng)發(fā)現(xiàn)某個數(shù)據(jù)表出現(xiàn)問題時可以使用:
myisamchk tablename.MYI
進行檢測,如果需要修復(fù)的話,可以使用:
myisamchk -of tablename.MYI
關(guān)于myisamchk的詳細參數(shù)說明,可以參見它的使用幫助。需要注意的時在進行修改時必須確保MySQL服務(wù)器沒有訪問這個數(shù)據(jù)表,保險的情況下是最好在進行檢測時把MySQL服務(wù)器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local里面啟動MySQL服務(wù)器前:
[ -x /tmp/mysql.sock ] /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL監(jiān)聽的Sock文件位置,對于使用RPM安裝的用戶應(yīng)該是/var/lib/mysql/mysql.sock,對于使用源碼安裝則是/tmp/mysql.sock可以根據(jù)自己的實際情況進行變更,而pathtochk則是myisamchk所在的位置,DATA_DIR是你的MySQL數(shù)據(jù)庫存放的位置。
需要注意的時,如果你打算把這條命令放在你的rc.local里面,必須確認在執(zhí)行這條指令時MySQL服務(wù)器必須沒有啟動!檢測修復(fù)所有數(shù)據(jù)庫(表)