MySQL 的 ZIP 版本 24 步安裝過程
持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第10天,點擊查看活動詳情
MySQL 是在軟件開發過程中不可或缺的一個部分,但是對於初學者來説搭建環境總是會遇到各種各樣的問題,或者是未授權,或者是密碼修改未成功,或者是服務無法安裝,無法刪除等等一系列問題,總要在學習初期遇到各種各樣的坑。
為了解決這個問題,筆者總結了 ZIP 版本 MySQL(MySQL 8.0.18 1045 28000)的 24 步安裝過程。
- MySQL 的安裝
- MySQL 的刪除
- MySQL 的密碼修改
- MySQL 中的 Flush Privileges 的使用
- MySQL 對 Host 的修改
- 其他常見異常
其中對於 Flush Privileges 在 MySQL Ref-Manual 中的闡述的描述是相對來説比較提倡的一種學習方法。
下面分別從上述幾個方面進行具體描述。
MySQL的安裝 24 步
1. 配置系統環境變量,對於這一步驟,可以配置系統環境變量,也可以配置用户環境變量,至於兩者的區別,再這就不做贅述了。
對於這一步驟有些用户操作的時候可能會出現如下問題:
環境變量配置完成後,仍然提示“'mysql' 不是內部或外部命令”。這種情況下,不需要重啟電腦,重新打開命令提示符窗口即可。
2. 直接在系統路徑下進入 MySQL 報錯,如下:
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
3. 嘗試啟動 MySQL,提示:
發生系統錯誤 2。
系統找不到指定的文件。
4. 切換到 MySQL 解壓文件夾 bin 文件夾所在路徑:
5. 執行 mysqld install
命令安裝 MySQL 服務,net start mysql
啟動服務。
6. 拒絕訪問
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
7. 無密碼訪問
mysqld --console --skip-grant-tables --shared-memory
提示:
2020-01-06T05:49:30.805343Z 0 [System] [MY-010116] [Server] D:\software\mysql-8.
0.18-winx64\bin\mysqld.exe (mysqld 8.0.18) starting as process 3980
2020-01-06T05:49:31.078781Z 1 [ERROR] [MY-012271] [InnoDB] The innodb_system dat
a file 'ibdata1' must be writable
2020-01-06T05:49:31.107101Z 1 [ERROR] [MY-012278] [InnoDB] The innodb_system dat
a file 'ibdata1' must be writable
2020-01-06T05:49:31.207687Z 1 [ERROR] [MY-010334] [Server] Failed to initialize
DD Storage Engine
2020-01-06T05:49:31.259445Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initi
alization failed.
2020-01-06T05:49:31.285812Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-01-06T05:49:31.428390Z 0 [System] [MY-010910] [Server] D:\software\mysql-8.
0.18-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.18) MySQL Community S
erver - GPL.
針對這個問題,有提供了一種解決方案,刪除 data 文件夾下的,ib_logfile0、ib_logfile1 兩個日誌文件。
但是,由於沒有對緣由進行説明,所以放棄這種方案。另外,對於這種不明確緣由直接刪除相關文件情況下,實際上也是在為後續工作埋雷,及時當前配置經過折騰正常啟動後,依然會導致運行過程中存在不確定因素。
上述這個過程看上去沒什麼問題,實際上是不對的,在安裝過程中環境變量配置完成後直接安裝並啟動服務,但是缺少一個“初始化”的步驟,所以導致無法正常啟動。所以在配置過程中應該,環境變量配置完成後,首先初始化,初始化過程中會生成響應的data文件夾下的文件和配置一些屬性。
另一種方案
8. 刪除方案一中已經安裝的服務,mysqld -remove
:
- 去下載 ZIP 版本的MYSQL
並解壓,第一次解壓後會發現目錄中並沒有 data 文件夾。
10. 在解壓的目標路徑下,創建data文件夾。
11. 在解壓目錄路徑下創建 my.ini 文件,注意右下角,保存 ini 文件的時候,選擇 ANSI 編碼方式。
12. 初始化 mysqld --initialize --console
(注:是先初始化,再安裝啟動,而不是先安裝服務啟動,再初始化,先安裝啟動的情況下,會在啟動時提示,無法啟動),可是報編碼有歧義。
這個在步驟 3 中已經標註完成了,由原來的 UTF-8,修改為 UTF8MB4。
13. 再次初始化,有些情況下,由於在刪除服務後沒有刪除 data 文件夾,所以文件夾下會有文件,再次初始化的時候,提示 data 文件已經存在了,刪除即可。
- 再初執行
mysqld --initialize --console
,可以看到初始化完成,並且生成了臨時密碼。
密碼:
i%lsDLpT?6J+(這個密碼是可以直接複製的)
mysqld install
安裝 MySQL 服務:
net start mysql
啟動 MySQL 服務:
17. 使用剛才的密碼登錄 MySQL(注意:這個密碼是可以複製粘貼的),進入 MySQL。
- 由於剛才的密碼不便於記憶,或者由於別的原因,通常需要修改密碼,使用如下語句:
mysql>ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
mysql>FLUSH PRIVILEGES;
19. 修改完成後 Ctrl+Z,退出 MySQL。
20. 測試新密碼成功連接:
21. 有些情況下,需要查看 MySQL 佔用的端口:
show global variables like 'port';
需要注意的是,命令號要用分號結尾。
當然,也可以通過之前添加的配置文件中查看使用的端口。
22. 使用客户端連接,報錯:
錯誤號碼1130,host ' ' is not allowed to connect to this mysql server
如果使用 navicat 連接的情況下,也有可能報錯誤:
protocol mismatch; server version=10 client version=11
解決辦法:
語句:
use mysql;
select host,user from user;
update user set host='%' where user='root';
flush privileges;
23. 連接成功。
24. 在提示密碼過期的情況下,即使重置也沒有用,必須在原來的密碼輸入以後,修改密碼,設置不過期才可以,經過測試,在密碼過期之後重新初始化 MySQL,生成臨時密碼後,輸入臨時密碼,依然無效,需要使用過期的舊密碼,輸入後,進入 MySQL,修改密碼,過程如下:
-- 修改密碼以能夠在客户端登陸:
set password for [email protected] = password('123');
-- 修改root密碼永不過期:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
到此經過 24 步驟的嘗試,基本上對 MySQL 8.0.19 的 ZIP 版本的安裝算是完成。
MySQL 的刪除
mysqld -remove
MySQL 密碼修改
步驟 11 中用到的如下語句:
mysql>ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
在密碼修改過後使用 Flush Privileges 進行緩存的清除,對權限進行刷新。
MySQL 中的 Flush Privileges 的使用
mysql>FLUSH PRIVILEGES;
Flush Privileges,顧名思義,對權限進行刷新,很多人不明白這究竟是個什麼東西,看一下官方的解釋(來自 MySQL 的 refman-5.7-en.pdf)就明白了:
重新從 MySQL 的系統數據庫中加載授權表中的權限,Flush Privileges 能夠使運行時的權限及時生效。這和其中提及到的 --skip-grant-tables
的參數有關係,也就是説如果在啟動的時候禁用了權限系統,使用 Flush Privileges 就能夠釋放緩存,重新使修改的內容生效。這就從根本上了解了,--skip-grant-tables
,Flush Privileges的作用,而不用每次使用的時候都懵懵懂懂。
通過上面 Flush Privileges 的機制在 Ref-Manual 中的闡述,對於用法的深入瞭解,實際上是一種很值得提倡的學習方法。
我們會發現,尤其對於初學者,在知識點的學習和查找過程中,對於很多博客無法正確解決心中的疑慮,總是多多少少的令人感到不解。
這種情況下追根溯源,找到它的出處,看最原始的解釋,就能很直白,簡單的理解問題的癥結所在。
通過上面這種方式,我們查看在上文中提到的 ib_logfile0 和 ib_logfile1 是什麼?
innodb_log_group_home_dir= /dr3/ibblogs
通過原文的描述知道,放置 InnoDB 的 log files 在不同的物理存儲位置,避免發生資源的讀寫衝突。就是在上述描述的方案中出現的錯誤提示。在 Ref-Manual 中很明確的提到,只要對路徑指向別處,便可以避免權限導致的讀寫錯誤,而不是直接選擇刪除。
通過這種方式,在 MySQL 安裝過程中遇到的所有問題,便可以迎刃而解,而不是翻閲各種重複的,不夠深入理解的博客方案,導致的各種問題無法正確理解。通過這種方式,一勞永逸,舉一反三的解決。
當然不僅僅侷限於官方手冊,雖然官方手冊是比較優秀的選擇,但是對於有些同學來説,存在一定難度,那麼可以選擇比較系統的相關書籍,結合博客深入,全面理解。
提供一個基本的 ini 配置如下:
``` [mysqld]
設置3306端口
port=3306
設置mysql的安裝目錄
basedir=E:***\MySQL\mysql-8.0.19-winx64
設置mysql數據庫的數據的存放目錄
datadir=E:***\MySQL\mysql-8.0.19-winx64\data
允許最大連接數
max_connections=200
允許連接失敗的次數。這是為了防止有人從該主機試圖攻擊數據庫系統
max_connect_errors=10
服務端使用的字符集默認為UTF8
character-set-server=UTF8MB4
創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
默認使用“mysql_native_password”插件認證
default_authentication_plugin=mysql_native_password
[mysql]
設置mysql客户端默認字符集
default-character-set=UTF8MB4
[client]
設置mysql客户端連接服務端時默認使用的端口
port=3306 default-character-set=UTF8MB4 ```
MySQL 對 Host 的修改
使用上面提供的具體方法, 再次愉快的從《refman-5.7-en》的第 996 頁中找到答案。如下:
表中展示了,用户名稱,主機值,以及允許鏈接的備註信息,從表中可以看出通配符百分號,以及 IP 地址所對應的含義。具體內容,可以去手冊上查找,如果不明確的話,可以留言。
其他常見異常
- 錯誤輸入命令,使用
mysqld -u root -p
會出現如下錯誤。修改 mysqld 為 mysql 即可。
mysqld: Can not perform keyring migration : Invalid --keyring-migration-source option.
2020-01-20T08:17:51.407930Z 0 [System] [MY-010116] [Server] E:\Tool\MySQL\mysql-8.0.19-winx64\bin\mysqld.exe (mysqld 8.0.19) starting as process 25932
2020-01-20T08:17:51.413918Z 0 [ERROR] [MY-011084] [Server] Keyring migration failed.
2020-01-20T08:17:51.424474Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-01-20T08:17:51.424758Z 0 [System] [MY-010910] [Server] E:\Tool\MySQL\mysql-8.0.19-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
- 無法連接 MySQL 服務,原因是沒有啟動服務導致的:
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
- 發生系統錯誤 2,系統找不到系統文件:
切換到 bin 所在路徑安裝,才能可執行文件路徑才不是默認的系統路徑,如下圖:
再啟動才能夠正常啟動服務: