按照慣例,遇到Linux相關的問題先說系統版本,我用的是Ubuntu 16.04。
事情的起因是這樣的,把打了個jar包扔上服務器,然後nohup java -jar
運行,本來一切正常(之前一直都很正常),但這次報了個沒見過的錯:
The driver has not received any packets from the server。
網上查了一下說是連接超時,然後我就想着打開MySQL去改一下設置,結果發現MySQL連不上了,運行mysql -u root -p
報錯:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)。
然後我就按照網上的說法,刪掉了/tmp/mysql.sock和/tmp/mysql.sock.lock,然後systemctl restart mysql
重啓MySQL,結果這次連MySQL服務都沒法啓動了,報錯:
The server quit without updating PID file.
看起來是刪文件刪出問題了。網上資料基本上是基於5.x的,而MySQL到了8.0之後發生了很大變化,沒有找到一個能用的方案。
有人說刪掉data目錄下ib開頭的文件可以解決,我試了一下,除了會導致啓動報錯之外並沒有什麼效果。後來查了一下資料才知道,ib開頭的文件和InnoDB引擎有關係。
中間還出現了幾次not found的錯誤,後來發現只是因爲沒有權限而已,chmod一下就好了;但是仍然無法啓動,還是那個PID file的報錯。
後來看到有人說刪掉data重新初始化可以解決,我就試了一下,從某種程度上來說確實算是解決了,因爲按照這個流程操作之後,MySQL是可以運行了,但是MySQL的服務仍然是掛掉的,會報錯:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)。
只能說治標不治本,而且root用戶的密碼還是空的:
rm -rf data
bin/mysqld --initialize-insecure
bin/mysqld -u root &
實在沒辦法,先是想着能不能把MySQL的系統服務刪掉或者改一下,改成啓動改過的命令,後來發現不是很好弄,就想着乾脆卸載重裝算了。
在準備卸載的過程中,看到官網上的安裝流程,想着覆蓋一下mysql.server是不是能弄好:cp support-files/mysql.server /etc/init.d/mysql.server
,後來發現也沒啥用……
在rm -rf mysql
之前,我想着再最後掙扎一下,因爲整個流程中還有一個地方沒有檢查過,就是mysql用戶的權限。打開/etc/passwd之後,把mysql用戶的權限改成0,也就是給它root權限,保存之後重新啓動服務,它好了……
問題算是解決了,但爲什麼呢?如果有人知道,請不吝賜教。