AdSense

網頁

2017/12/11

MySQL 5.7 突然無法啟動 in Windows 7

MySQL服務突然無法啟動這問題已經碰到兩次了,真的是覺得很煩,然後就想遷怒Oracle。

情況是這樣的,可能在前一天MySQL都可以正常啟動並連線,但隔天想啟動的時候就不行了。這個MySQL Server當初是透過官網的安裝工具一切以預設來安裝,安裝後就直接使用了,然後建了幾個資料表,每次啟動都是透過MySQL Notifier,是安裝MySQL時會同時安裝的小工具,在正常的情況下會在工作列顯示海豚小圖案。然而今天突然無法啟動,因為連MySQL Notifier都無法打開,所以就透過在命令提示字元(cmd)使用mysqld指令,但一樣無法啟動,錯誤訊息如下。

C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqld
mysqld: Can't change dir to 'C:\Program Files\MySQL\MySQL Server 5.7\data\' (Errcode: 2 - No such file or
directory)
2017-12-12T02:23:27.700357Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --
explicit_defaults_for_timestamp server option (see documentation for more details).
2017-12-12T02:23:27.700357Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO'
 sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2017-12-12T02:23:27.700357Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2017-12-12T02:23:27.700357Z 0 [Warning] Insecure configuration for --secure-file-priv: Current value does
not restrict location of generated files. Consider setting it to a valid, non-empty path.
2017-12-12T02:23:27.700357Z 0 [Note] mysqld (mysqld 5.7.12) starting as process 8668 ...
2017-12-12T02:23:27.700357Z 0 [Warning] Can't create test file C:\Program Files\MySQL\MySQL Server 5.7\data\1509007NB01.lower-test
2017-12-12T02:23:27.700357Z 0 [Warning] Can't create test file C:\Program Files\MySQL\MySQL Server 5.7\data\1509007NB01.lower-test
2017-12-12T02:23:27.700357Z 0 [ERROR] failed to set datadir to C:\Program Files\MySQL\MySQL Server 5.7\data\
2017-12-12T02:23:27.710357Z 0 [ERROR] Aborting

2017-12-12T02:23:27.710357Z 0 [Note] Binlog end
2017-12-12T02:23:27.710357Z 0 [Note] mysqld: Shutdown complete

恩,錯誤訊息好像是說在MySQL安裝目錄下沒有\data,所以乾脆加了個data目錄,加了以後再次輸入>mysqld,恩...,還是無法啟動,這次連錯誤詢息都沒了,總之大概就是以上情況。

第一次的解決方法是直接透過Windows服務來啟動。開啟命令提示字元,然後輸入services.msc如下。

C:\Users\matthung>services.msc

找到MySQL57服務然後按滑鼠右鍵並選擇[啟動],然後MySQL真的就正常啟動了,原本建立的資料表都在,但總覺得這樣的方式有點類似走後門,不是按照"正常程序",覺得不太踏實。



最後的解決方法如下,不過下面的解決方法也順便把我先前仍可以正常啟動時所建立的一些資料表給幹掉了,還好我只是拿來練習才裝了這個資料庫,所以沒差...。

MySQL Server服務預設啟動時會讀取C:\ProgramData\MySQL\MySQL Server 5.7\my.ini(可以從MySQL57服務的內容得知啟動時會附帶參數--defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"),而my.ini是用來設定了一些初始參數,如果MySQL讀取不到這個設定檔,或設定檔裡面沒有內容,則預設會以MySQL目錄下的data目錄來存放一些啟動時的資料如組態,log,測試檔等等,而MySQL無法啟動的原因,或許是因為原本MySQL安裝完成時在C:\ProgramData\MySQL\MySQL Server 5.7\建立了一份my.ini,然後裡面有一些預設的設定,然而因為MySQL的自動更新使得更新後的my.inidata目錄被移除了,所以導致無法正常啟動。而即使手動在C:\ProgramData\MySQL\MySQL Server 5.7\建立一個新的data目錄,也因為原本裡面用來啟動的資料都不在了,所以也是無法正常啟動。

所以可以在MySQL安裝目錄下C:\Program Files\MySQL\MySQL Server 5.7\新增一份my.ini檔。

my.ini的內容可以從MySQL目錄下的樣本my-default.ini複製如下。

# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the # *** default location during install, and will be replaced if you # *** upgrade to a newer version of MySQL.
[mysqld] character-set-server=utf8mb4 collation-server =utf8mb4_unicode_ci
# Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # These are commonly set, remove the # and set as required.
basedir = C:\\Program Files\\MySQL\\MySQL Server 5.7 datadir = D:\\MySQLdata
# port = ..... # server_id = .....
# Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

basedir的值設為MySQL的安裝目錄(C:\ProgramData\MySQL\MySQL Server 5.7\);
datadir設為任一個你想用來存放MySQL暫存檔的地方,我設為D:\\MySQLdata

my.ini建好後,在命令提示字元C:\Program Files\MySQL\MySQL Server 5.7\bin\目錄下輸入mysqld --initialize-insecure

C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqld --initialize-insecure

接著MySQL便會讀取my.ini重新做初始化,並依照datadir的值建立暫存檔目錄(即D:\\MySQLdata)。

初始化完成後(初始化時沒有什麼特別訊息,當命令提示字元回復可操作狀態的時候就是完成初始化了。),在命令停提示字元輸入mysqld便可以正常啟動MySQL Server了。

C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqld

使用mysqld --initialize-insecure指令初始化的root沒有設定密碼,所以可以使用mysqlshow -u root指令測試MySQL是否正在執行,如果有正確執行便會返回如下。

C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqlshow -u root
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

如果要關掉MySQL Server,開啟新的命令提示字元,輸入mysqladmin shutdown -u root

C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqladmin shutdown -u root

然後記得關掉MySQL的自動更新

儘管如此MySQL Notifier還是壞的。

還有我只是要開啟MySQL來看看而已就花了將近半天的時間。

如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。


參考:

沒有留言:

AdSense