用于搜索引擎抓取,以及給剛進來的人展示我的報錯資訊,解決方案在下面,
MySQL57 服務正在啟動 .
MySQL57 服務無法啟動,
服務沒有報告任何錯誤,
請鍵入 NET HELPMSG 3534 以獲得更多的幫助,
2020-12-15T00:39:28.143958Z 0 [ERROR] InnoDB: The innodb_system data file ‘ibdata1’ must be writable
2020-12-15T00:39:28.143958Z 0 [ERROR] InnoDB: The innodb_system data file ‘ibdata1’ must be writable
2020-12-15T00:39:28.144910Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2020-12-15T00:39:28.346376Z 0 [ERROR] Plugin ‘InnoDB’ init function returned error.
2020-12-15T00:39:28.346376Z 0 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
2020-12-15T00:39:28.347368Z 0 [ERROR] Failed to initialize plugins.
2020-12-15T00:39:28.348370Z 0 [ERROR] Aborting
前言
本地一直好好的MySQL突然出問題了(我的機器是Windows的),問題是這樣的

雖然本地的mysql里沒什么重要的資料,但我自己平時練手的那些專案,資料可都在本地,沒了還是很心疼的,練手的專案還有有參考價值的,所以我要將這個問題解決了!!
著手分析
就這提示,也沒啥具體的參考、提示資訊,想解決也無從下手啊,不過我馬上想到了MySQL的日志,可以去看日志嘛,emmm,不過沒在本地看過mysql的日志,我也找不到日志在哪里,而且我當初安裝MySQL的時候選擇了默認安裝,把MySQL的服務和資料分開了,目錄結構更找不到了,前方無路……
我查詢3306埠,埠是被占用的,但是服務沒啟動起來?

這……突然,我想到了一個命令,之前用過, 可以將錯誤資訊輸出到控制臺上:mysqld --console ,馬上輸入這個命令,果然:

note那些直接被我忽略,一眼就看到了我熟悉的ERROR,什么?資料檔案“ibdata1”必須是可寫入的?“ibdata1”是什么檔案?哪里有,難道是權限不夠嗎?但是Linux下修改權限倒是好修改,要查找檔案用find命令也好使,可是Windows下不好搞呀,第一次遇到這種問題,我也不敢貿然的去修改,還是先去網上查一查,看看有沒有遇到相同問題的網友,參考一下他們的解決方案,
鍵入關鍵字“InnoDB: The innodb_system data file ‘ibdata1’ must be writable”,回車,果然,有好多遇到相同問題的網友,不過他們都是在Linux下,一個find命令,一個chmod命令,就完事了,這……
那好吧,我再限定一下關鍵字:Windows,也有先例的呀,不過我看了解決方案,也看了一些評論,好像有很多都沒有解決問題,而且這解決方案也有點草率啊:

直接洗掉檔案?太草率了,我看下面的評論,好像并沒有解決問題,我又翻看了其它幾篇博客,發現有好幾篇都是這么說的,但是反應也不統一,有的能解決,有的不能解決,我覺得不太靠譜啊,
定位問題
我又重新看了控制臺的報錯資訊,“ibdata1”檔案必須是可寫入的?那我查查本機上有沒有這個檔案,這里給大家推薦一款Windows下非常好用的查詢工具Everything,可以查詢檔案或者檔案,在本機范圍內,還可以用正則匹配,我查詢了ibdata1,有四個結果

但三個是我之前Python爬蟲的時候裝的mysql,已經沒用了,還沒清理,可以排除,第四個:D:/temp/ 是我放一些臨時檔案的地方,也可以排除,基本可以確認是前兩個檔案,
因為我MySQL安裝的時候是默認的,所以第一個Program Files是程式安裝的地方,第二個ProgramData是存放資料的地方,可能描述得不太準確,懂我意思就行,
解決問題
既然找到了這兩個檔案,那么接下來修改這個檔案的權限應該就可以了,我記得Windows下也可以對檔案的讀寫操作等權限進行修改(的確是可以的,不經常用的操作記憶有點模糊了),
找到對應檔案,資料檔案,我先來到的是第二個,也就是ProgramData里面的,

通過Everything可以快速的來到檔案目錄,當然,也可以一層一層的點開,
選中檔案,右擊,點開屬性,然后在頂部的選項中選擇安全,可以看到如下

這些權限全都有的啊,看起來沒問題,
那我再去看看另一個,和上面同樣的方法,果然有問題

只有讀取和執行的權限,沒有寫入權限,點擊編輯,這個檔案添加上修改和寫入的權限

我也不太清楚Windows下的用戶、用戶組什么的,就默認選中“所有的程式包”,添加權限就OK了,
到此基本上就OK了,但是還有一個問題,因為剛剛查看埠的時候,發現其實3306這個埠是被占用的,但是服務沒啟起來,有點僵尸行程的感覺,我們得先把這個行程殺死,釋放出被占用的埠,

- netstat -aon | findstr 3306 查找3306埠,最后面那個數字就是行程號
- taskkill -F /pid 15688 強制殺死15688行程
然后再重新啟動服務就OK了

整理步驟
- 使用控制臺查看報錯資訊
mysqld --console
- 找到對應的檔案,賦予權限
- 查找占用埠的行程并殺死
netstat -aon | findstr 3306 查找3306埠
taskkill -F /pid 15688 強制殺死15688行程
- 重新啟動MySQL服務
net start mysql57 啟動mysql57服務
歸納總結
當然,可能導致錯誤的原因和我不一樣,但是可以有類似的解決思路:
- 使用mysqld --console將錯誤資訊輸出到控制臺,
- 根據報錯資訊在網上查詢
- 參考別人解決方案,根據自己經驗,解決問題
寫在最后
自己根據實際的經驗寫的文章,水平有限,如有錯誤還請指出,另外,問題雖然解決了,但是沒搞清楚問題發生的原因,Program Files里的那個Ibdata1檔案我重來沒有動過,之前一直都好好,怎么突然就不行了呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/235432.html
標籤:其他
下一篇:HashMap底層原理深入分析
