程連接全流程)
簡(jiǎn)介這是一份面向后端開(kāi)發(fā)、運(yùn)維及數(shù)據(jù)庫(kù)學(xué)習(xí)者的 MySQL 8.0 免安裝綠色版資源主打解壓即用無(wú)需繁瑣安裝流程適合快速搭建本地測(cè)試環(huán)境或臨時(shí)部署數(shù)據(jù)庫(kù)服務(wù)。壓縮包共 420 個(gè)文件以 sdi、dll、pdb、exe、xml、sys、h、def 等為主涵蓋可執(zhí)行程序、動(dòng)態(tài)鏈接庫(kù)、系統(tǒng)表定義、調(diào)試符號(hào)與配置腳本另有 sql、pem、ibd、ibdata1、ib_logfile 等數(shù)據(jù)庫(kù)核心文件整體約 186.28MB。默認(rèn)解壓到 D 盤即可直接雙擊 startup.bat 啟動(dòng)端口 3306root 密碼為 root若需調(diào)整路徑修改 my.ini 中的 basedir 與 datadir 即可。目前已有 594 人學(xué)習(xí)下載資源包含完整的目錄結(jié)構(gòu)與啟動(dòng)腳本能幫助讀者省去安裝配置環(huán)節(jié)快速進(jìn)入數(shù)據(jù)庫(kù)連接、建庫(kù)建表與 SQL 調(diào)試等實(shí)際操作也便于理解 MySQL 8.0 的底層文件組成與運(yùn)行機(jī)制。1. MySQL 8.0 免安裝版從解壓到能連上的那條最短路徑很多人第一次接觸 MySQL 8.0 免安裝包都是被“綠色版”“解壓即用”這幾個(gè)字騙進(jìn)來(lái)的。真把 zip 解壓到D:\mysql-8.0之后才發(fā)現(xiàn)雙擊mysqld.exe窗口一閃就沒(méi)了服務(wù)里也找不到 MySQL用 Navicat 連 3306 直接報(bào)Cant connect to MySQL server on localhost。這不是包壞了而是免安裝版把“安裝”這件事從圖形向?qū)мD(zhuǎn)移到了命令行和配置文件上——它不寫注冊(cè)表、不自動(dòng)建服務(wù)、不彈初始化向?qū)惺虑槎嫉媚阕约簛?lái)。這套環(huán)境在開(kāi)發(fā)機(jī)、測(cè)試服務(wù)器、臨時(shí)排障場(chǎng)景里極其常見(jiàn)裝好了五分鐘能跑起來(lái)裝不好能折騰一下午。下面按我實(shí)際部署的順序把版本選擇、目錄規(guī)劃、初始化、注冊(cè)服務(wù)、改密碼、驗(yàn)證連接整條鏈路拆開(kāi)講新手照著敲能通熟手可以對(duì)照看參數(shù)取舍。2. 裝之前先把版本和目錄定死別讓路徑里的空格坑你2.1 選 8.0 的哪個(gè)小版本MySQL 8.0 系列小版本迭代很密8.0.20 之后官方對(duì) X Plugin、認(rèn)證插件、JSON 函數(shù)都有調(diào)整。免安裝包我一般選8.0.36 或 8.0.40這類 GA 穩(wěn)定版不追最新也不要用 8.0.11 這種早期版本——早期版本默認(rèn)認(rèn)證插件還是mysql_native_password而 8.0.4 之后默認(rèn)改成了caching_sha2_password很多老客戶端連不上就是卡在這里。下載時(shí)認(rèn)準(zhǔn)文件名里的winx64或linux-glibc2.17-x86_64別下成 debug 版或 minimal 版minimal 版缺share目錄里的字符集文件初始化會(huì)報(bào)錯(cuò)。提示官網(wǎng)下載頁(yè)有mysql-8.0.xx-winx64.zip和mysql-8.0.xx-winx64-debug-test.zip后者體積大且?guī)д{(diào)試符號(hào)生產(chǎn)環(huán)境不要用。2.2 目錄規(guī)劃路徑里絕對(duì)不能有空格和中文這是血淚經(jīng)驗(yàn)。我見(jiàn)過(guò)有人解壓到C:\Program Files\mysql-8.0初始化時(shí)--basedir參數(shù)帶空格命令行解析直接截?cái)鄨?bào)unknown variable。正確做法是解壓到一個(gè)純英文、無(wú)空格的短路徑比如# Windows 下推薦目錄結(jié)構(gòu) D:\mysql80\ ├── bin\ ├── data\ # 初始化后自動(dòng)生成不要手動(dòng)建空目錄 ├── my.ini # 手動(dòng)創(chuàng)建 └── share\Linux 下我習(xí)慣放/usr/local/mysql80同樣避免/opt/my sql這種帶空格的路徑。data目錄不要提前手動(dòng)創(chuàng)建mysqld --initialize會(huì)自己建你提前建了反而可能因?yàn)闄?quán)限或非空目錄導(dǎo)致初始化失敗。2.3 環(huán)境變量只加 bin 目錄別加根目錄把D:\mysql80\bin追加到系統(tǒng)Path里這樣在任何目錄都能敲mysql和mysqld。注意只加bin不要加D:\mysql80本身否則mysql命令找不到。Linux 下用# 寫入 /etc/profile.d/mysql80.sh export MYSQL_HOME/usr/local/mysql80 export PATH$MYSQL_HOME/bin:$PATH改完source /etc/profile.d/mysql80.sh生效。這一步不做后面所有命令都得寫全路徑容易漏。3. 初始化與配置文件my.ini 里這幾個(gè)參數(shù)決定能不能啟動(dòng)3.1 手寫 my.ini別用默認(rèn)的免安裝包解壓后根目錄沒(méi)有my.ini需要自己建。我一般放在D:\mysql80\my.ini內(nèi)容如下[mysqld] # 安裝根目錄必須和實(shí)際解壓路徑一致 basedirD:/mysql80 # 數(shù)據(jù)目錄初始化后自動(dòng)生成 datadirD:/mysql80/data # 端口默認(rèn) 3306被占用就改 3307 port3306 # 字符集8.0 默認(rèn) utf8mb4這里顯式寫死避免繼承問(wèn)題 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci # 默認(rèn)認(rèn)證插件老客戶端兼容就改成 mysql_native_password default_authentication_pluginmysql_native_password # 最大連接數(shù)開(kāi)發(fā)機(jī) 200 夠用 max_connections200 # 錯(cuò)誤日志路徑排錯(cuò)全靠它 log-errorD:/mysql80/data/mysql-error.log [client] port3306 default-character-setutf8mb4注意basedir和datadir用正斜杠/或雙反斜杠\\單反斜杠\在 ini 里會(huì)被當(dāng)轉(zhuǎn)義符。default_authentication_plugin這一行是 8.0 特有的設(shè)成mysql_native_password能讓 Navicat 12 以下、舊版 JDBC 驅(qū)動(dòng)直接連上如果只用 8.0 自帶客戶端可以刪掉這行用默認(rèn)的caching_sha2_password。3.2 初始化命令--initialize 和 --initialize-insecure 的區(qū)別以管理員身份打開(kāi) cmd切到D:\mysql80\bin執(zhí)行# 方式一生成隨機(jī) root 密碼寫在錯(cuò)誤日志里 mysqld --defaults-fileD:\mysql80\my.ini --initialize # 方式二root 密碼為空首次登錄后必須改 mysqld --defaults-fileD:\mysql80\my.ini --initialize-insecure--initialize會(huì)生成一個(gè)臨時(shí)密碼存在data/mysql-error.log里搜A temporary password is generated那一行。--initialize-insecure直接給空密碼適合本地開(kāi)發(fā)但初始化完必須立刻改密碼否則等于裸奔。初始化過(guò)程如果卡住不動(dòng)大概率是datadir目錄已存在且非空刪掉data目錄重來(lái)。注意初始化只能執(zhí)行一次。如果報(bào)data directory has files說(shuō)明之前初始化過(guò)要么刪 data 重來(lái)要么直接跳過(guò)這步去注冊(cè)服務(wù)。3.3 注冊(cè) Windows 服務(wù)一條命令讓 MySQL 開(kāi)機(jī)自啟免安裝版不會(huì)自動(dòng)注冊(cè)服務(wù)手動(dòng)執(zhí)行# 注冊(cè)服務(wù)服務(wù)名 MySQL80 mysqld --install MySQL80 --defaults-fileD:\mysql80\my.ini # 啟動(dòng)服務(wù) net start MySQL80 # 停止服務(wù) net stop MySQL80 # 刪除服務(wù)重裝前先刪 mysqld --remove MySQL80--install后面跟的服務(wù)名自己定但別和已有的 MySQL 服務(wù)重名。如果報(bào)Install/Remove of the Service Denied說(shuō)明 cmd 不是管理員權(quán)限。Linux 下沒(méi)有--install用systemd或mysqld_safe啟動(dòng)這里不展開(kāi)。4. 首次登錄與改密碼caching_sha2_password 的坑集中在這4.1 用臨時(shí)密碼登錄并強(qiáng)制改密如果用的是--initialize先看錯(cuò)誤日志拿臨時(shí)密碼# 查看臨時(shí)密碼 findstr temporary password D:\mysql80\data\mysql-error.log然后登錄mysql -u root -p # 粘貼臨時(shí)密碼登錄后 MySQL 會(huì)強(qiáng)制你改密碼執(zhí)行ALTER USER rootlocalhost IDENTIFIED BY YourNewPass123!; FLUSH PRIVILEGES;密碼策略在 8.0 里默認(rèn)是MEDIUM要求大小寫字母、數(shù)字、特殊字符至少各一長(zhǎng)度至少 8。嫌麻煩可以臨時(shí)降低-- 查看當(dāng)前策略 SHOW VARIABLES LIKE validate_password%; -- 降低策略僅開(kāi)發(fā)環(huán)境 SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;4.2 遠(yuǎn)程連接root 默認(rèn)只允許 localhost免安裝版初始化后root用戶只綁在localhost從別的機(jī)器連會(huì)報(bào)Host xxx is not allowed to connect。需要開(kāi)遠(yuǎn)程賬號(hào)-- 創(chuàng)建允許任意主機(jī)連接的賬號(hào) CREATE USER devuser% IDENTIFIED WITH mysql_native_password BY DevPass123!; GRANT ALL PRIVILEGES ON *.* TO devuser%; FLUSH PRIVILEGES;注意IDENTIFIED WITH mysql_native_password這段如果客戶端老必須顯式指定插件否則即使default_authentication_plugin改了新建用戶還是走caching_sha2_password。改完用SELECT user, host, plugin FROM mysql.user;確認(rèn)插件列。4.3 防火墻和端口占用排查服務(wù)起來(lái)了但連不上先查端口# Windows 查 3306 占用 netstat -ano | findstr :3306 # Linux 查端口 ss -tlnp | grep 3306如果端口被別的進(jìn)程占了改my.ini里的port3307重啟服務(wù)。Windows 防火墻還要放行入站規(guī)則否則本機(jī)連得上、局域網(wǎng)連不上。5. 避坑與排查這五個(gè)現(xiàn)象我每次部署都會(huì)遇到5.1 現(xiàn)象mysqld 一閃而過(guò)服務(wù)起不來(lái)原因my.ini路徑寫錯(cuò)、basedir帶空格、data目錄權(quán)限不足或者端口被占用。解決不要雙擊mysqld.exe用mysqld --console前臺(tái)啟動(dòng)錯(cuò)誤直接打在屏幕上??磀ata/mysql-error.log最后 20 行90% 的問(wèn)題日志里寫得很清楚。5.2 現(xiàn)象客戶端報(bào)Authentication plugin caching_sha2_password cannot be loaded原因客戶端版本低于 8.0不認(rèn)新認(rèn)證插件。解決要么升級(jí)客戶端要么在my.ini加default_authentication_pluginmysql_native_password后重建用戶要么對(duì)已有用戶執(zhí)行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 密碼;。5.3 現(xiàn)象初始化時(shí)報(bào)unknown variable default_authentication_plugin原因8.0.4 之前沒(méi)有這個(gè)參數(shù)或者拼寫成了default-authentication-plugin下劃線寫成連字符。解決確認(rèn)版本 ≥ 8.0.4參數(shù)名用下劃線。8.0.27 之后官方推薦用authentication_policy替代但default_authentication_plugin仍兼容。5.4 現(xiàn)象服務(wù)注冊(cè)成功但net start報(bào)系統(tǒng)錯(cuò)誤 1067原因my.ini里datadir指向的目錄不存在或?yàn)榭栈蛘遙asedir和實(shí)際路徑不一致。解決檢查my.ini兩個(gè)路徑確保data目錄里有ibdata1、mysql等文件。沒(méi)有就刪掉 data 重新--initialize。5.5 現(xiàn)象改完密碼后新密碼登錄失敗原因FLUSH PRIVILEGES沒(méi)執(zhí)行或者密碼里帶了!、在命令行被 shell 轉(zhuǎn)義。解決登錄 MySQL 內(nèi)部用ALTER USER改不要在命令行用mysqladmin帶特殊字符。改完必須FLUSH PRIVILEGES。6. 裝完怎么驗(yàn)證三條命令確認(rèn)這套 MySQL 8.0 真的能跑驗(yàn)證不是打開(kāi)客戶端看一眼就完事我習(xí)慣按“服務(wù)層 → 連接層 → 數(shù)據(jù)層”三層走一遍。第一層服務(wù)狀態(tài)# Windows sc query MySQL80 # 看到 STATE 為 RUNNING 才算過(guò) # Linux systemctl status mysqld第二層本地 socket 連接和版本確認(rèn)mysql -u root -p -e SELECT VERSION(), port, character_set_server;輸出里VERSION()應(yīng)該是8.0.xxport和你my.ini里寫的一致character_set_server是utf8mb4。這三個(gè)值不對(duì)說(shuō)明配置文件沒(méi)被加載檢查--defaults-file路徑。第三層建庫(kù)建表插數(shù)據(jù)驗(yàn)證存儲(chǔ)和字符集CREATE DATABASE verify_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE verify_db; CREATE TABLE t_check (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP); INSERT INTO t_check (name) VALUES (測(cè)試中文); SELECT * FROM t_check;能插能查中文不亂碼說(shuō)明字符集鏈路通了。最后用遠(yuǎn)程賬號(hào)從另一臺(tái)機(jī)器連一次mysql -h 192.168.x.x -u devuser -p -e SHOW DATABASES;遠(yuǎn)程能列出庫(kù)說(shuō)明user表、防火墻、端口三層都對(duì)了。這套驗(yàn)證走完我才敢把連接串交給開(kāi)發(fā)。從那以后我每次部署免安裝 MySQL都強(qiáng)制走一遍“服務(wù)狀態(tài) → 版本字符集 → 建表插數(shù)據(jù) → 遠(yuǎn)程連接”這四步少一步都可能在上線前夜翻車。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取