
簡(jiǎn)介MySQL 8.0.15 Windows 64位一鍵安裝版壓縮包面向需要在本機(jī)搭建數(shù)據(jù)庫(kù)環(huán)境的開發(fā)者、運(yùn)維人員與學(xué)習(xí)者解決官方免安裝版本需手動(dòng)初始化數(shù)據(jù)目錄、注冊(cè)系統(tǒng)服務(wù)等繁瑣步驟。包內(nèi)共374個(gè)文件以數(shù)據(jù)字典文件sdi、動(dòng)態(tài)鏈接庫(kù)dll、可執(zhí)行程序exe、調(diào)試符號(hào)pdb、XML配置以及系統(tǒng)驅(qū)動(dòng)文件sys為主體覆蓋服務(wù)器核心組件、命令行工具和基礎(chǔ)數(shù)據(jù)字典整體壓縮包約194.95MB解壓后即可通過安裝向?qū)Щ蜃詭_本快速完成部署。資源包含多個(gè)binlog日志、InnoDB表空間及啟動(dòng)批處理文件可幫助驗(yàn)證安裝結(jié)果并理解MySQL 8.0的目錄結(jié)構(gòu)與運(yùn)行機(jī)制。該作者分享的版本已在CSDN獲得1127人瀏覽學(xué)習(xí)適合Windows環(huán)境下快速獲得可用的MySQL 8.0.15實(shí)例也便于離線安裝與教學(xué)演示。1. mysql-8.0.15-winx64一鍵安裝版它到底替你省了什么前段時(shí)間給模擬項(xiàng)目X補(bǔ)數(shù)據(jù)庫(kù)環(huán)境機(jī)器是內(nèi)網(wǎng)Windows Server還處于完全離線狀態(tài)沒法走官方圖形安裝器一步步點(diǎn)下一步。我把手頭的 mysql-8.0.15-winx64一鍵安裝版 這個(gè)zip重新翻出來用解壓到固定目錄用一條批處理自動(dòng)生成my.ini、初始化數(shù)據(jù)目錄、注冊(cè)Windows服務(wù)幾分鐘就得到一臺(tái)能用的MySQL 8.0.15。它解決的問題非常具體在Windows x64上把MySQL 8.0.15的部署變成可重復(fù)執(zhí)行的腳本而不是一套點(diǎn)鼠標(biāo)的流程。適合內(nèi)網(wǎng)運(yùn)維、舊項(xiàng)目遷移前的兼容性試跑也適合剛接觸MySQL 8服務(wù)部署的新手用來快速?gòu)?fù)現(xiàn)一套環(huán)境。2. 為什么選8.0.15版本卡位、目錄結(jié)構(gòu)與三個(gè)核心命令2.1 版本卡位為什么老項(xiàng)目遷移常從8.0.15起步MySQL 8.0.15是2019年初發(fā)布的8.0 GA版本處于8.0系列的中前段。它默認(rèn)字符集已經(jīng)是utf8mb4默認(rèn)認(rèn)證插件是caching_sha2_passwordSQL模式延續(xù)了5.7那套嚴(yán)格模式。對(duì)老項(xiàng)目來說它比5.x多出了窗口函數(shù)、CTE這些實(shí)用特性但又不像后來的8.0.27那樣在安裝環(huán)節(jié)帶上一堆密碼策略檢查。實(shí)際運(yùn)維中我見過不少團(tuán)隊(duì)把8.0.15當(dāng)作“5.7到8.0的過渡跳板”先用它試跑SQL兼容性確認(rèn)業(yè)務(wù)代碼沒問題再去追逐更高的小版本。這樣說并不是要否定新版本。一個(gè)很負(fù)責(zé)任的提醒是8.0.15缺少后面版本的安全更新如果數(shù)據(jù)庫(kù)要暴露到公網(wǎng)或者跑生產(chǎn)核心業(yè)務(wù)不建議長(zhǎng)期停留。它更適合的場(chǎng)景是內(nèi)網(wǎng)環(huán)境、離線部署、遷移驗(yàn)收、教學(xué)復(fù)現(xiàn)在這些場(chǎng)景下它的穩(wěn)定性和低折騰程度反而是優(yōu)勢(shì)。選型時(shí)還有另一個(gè)角度官方免安裝zip形態(tài)的8.0.15在Windows上部署路徑很直接。壓縮包解壓后就是一個(gè)完整的MySQL目錄不寫注冊(cè)表不依賴圖形界面注冊(cè)服務(wù)失敗也能隨時(shí)清理重來。這種“綠色包批處理”的組合恰恰是Windows批量部署MySQL最常見的落地方案。2.2 解壓后第一眼目錄結(jié)構(gòu)里誰在干活解壓后先別急著雙擊任何exe先看清目錄布局。bin目錄是核心mysqld.exe是服務(wù)端mysql.exe是命令行客戶端mysqladmin.exe負(fù)責(zé)探活和管理mysqldump.exe將來做備份會(huì)用到。share目錄里放錯(cuò)誤信息和字符集相關(guān)文件lib目錄是插件和運(yùn)行庫(kù)docs里是版本說明。data目錄在剛解壓時(shí)通常不存在初始化之后才會(huì)生成這里面放的是系統(tǒng)庫(kù)、用戶數(shù)據(jù)和錯(cuò)誤日志。我一般會(huì)要求所有安裝路徑使用純英文比如 D:/mysql-8.0.15-winx64。中文路徑雖然多數(shù)時(shí)候能跑通但初始化階段一旦出問題排查方向會(huì)被帶偏不值得賭。路徑分隔符也建議統(tǒng)一寫成正斜杠在my.ini里反斜杠容易觸發(fā)轉(zhuǎn)義解析問題這點(diǎn)后面踩坑部分還會(huì)再提。這個(gè)包里最值得記住的不是哪個(gè)圖形工具而是三件事初始化數(shù)據(jù)目錄、注冊(cè)Windows服務(wù)、啟動(dòng)服務(wù)。對(duì)應(yīng)的命令固定是 mysqld --initialize-insecure、mysqld --install MySQL8、net start MySQL8。后面第4章會(huì)逐條拆解。2.3 三個(gè)核心命令一鍵包的底層動(dòng)作先說初始化。mysqld有兩種初始化方式--initialize 和 --initialize-insecure。前者會(huì)生成一個(gè)隨機(jī)臨時(shí)密碼打印到data目錄的錯(cuò)誤日志里你得去日志里翻后者直接把root賬號(hào)置為空密碼初始化完立刻能用。一鍵安裝包幾乎都選insecure因?yàn)槟_本里不需要捕獲臨時(shí)密碼后續(xù)再重置就行。然后是注冊(cè)服務(wù)。mysqld --install MySQL8 的作用是把mysqld.exe注冊(cè)成Windows系統(tǒng)服務(wù)服務(wù)名叫MySQL8。這里有個(gè)容易寫錯(cuò)的細(xì)節(jié)--defaults-file參數(shù)要放在install子命令的后面因?yàn)樗鼤?huì)被寫入服務(wù)啟動(dòng)命令行服務(wù)啟動(dòng)時(shí)按這個(gè)路徑找配置文件。順序?qū)懗?mysqld --defaults-file... --install MySQL8在某些版本下會(huì)提示參數(shù)解析異常。最后net start MySQL8啟動(dòng)服務(wù)net stop MySQL8停止mysqld --remove MySQL8或sc delete MySQL8可以清掉服務(wù)注冊(cè)。為什么這套組合能替代圖形安裝器因?yàn)閃indows服務(wù)本身就是一種受系統(tǒng)管理的進(jìn)程注冊(cè)好后能設(shè)置開機(jī)自啟、能用net命令控制、崩了可以被服務(wù)控制管理器拉起來。一鍵包把初始化、注冊(cè)、啟動(dòng)串成一條批處理就把“圖形點(diǎn)選”變成了“文本重現(xiàn)”。后面第4章會(huì)直接把這條批處理的內(nèi)容貼出來拆解。3. my.ini怎么配初始化前先把參數(shù)想清楚3.1 最小可運(yùn)行配置先讓服務(wù)起來初始化數(shù)據(jù)目錄之前一定要先準(zhǔn)備好my.ini否則mysqld會(huì)用一堆編譯期默認(rèn)值去跑路徑也不受控。一份最小可運(yùn)行配置大概長(zhǎng)這樣[mysqld] port3306 basedirD:/mysql-8.0.15-winx64 datadirD:/mysql-8.0.15-winx64/data character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci這里basedir和datadir必須寫成絕對(duì)路徑datadir指向的目錄可以不存在mysqld初始化時(shí)會(huì)自動(dòng)創(chuàng)建。port默認(rèn)就是3306寫出來的意義是讓你知道自己改過沒有。character-set-server和collation-server成對(duì)出現(xiàn)設(shè)置服務(wù)端默認(rèn)字符集和排序規(guī)則既然8.0已經(jīng)默認(rèn)utf8mb4這里顯式寫出來主要是防止后續(xù)配置被覆蓋。很多人拿到my.ini會(huì)急著往里堆參數(shù)我的建議是第一次先把上面這幾行配好服務(wù)能起來再逐步添加其他項(xiàng)。最小可運(yùn)行配置的目的是把變量數(shù)壓到最少之后出了問題你知道一定是路徑、端口、權(quán)限這三件事之一排查范圍小得多。3.2 面向舊項(xiàng)目的參數(shù)取舍SQL模式、認(rèn)證與字符集如果這套環(huán)境要承接老業(yè)務(wù)下面幾項(xiàng)就要認(rèn)真考慮而不是照抄默認(rèn)值。第一個(gè)是sql_mode。8.0.15默認(rèn)值里包含ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES等一堆約束。ONLY_FULL_GROUP_BY會(huì)讓那些“select非聚合列但不寫進(jìn)group by”的舊SQL直接報(bào)錯(cuò)這種SQL在5.6時(shí)代很常見。我一般會(huì)在遷移試跑階段先保留默認(rèn)約束讓報(bào)錯(cuò)暴露問題等確認(rèn)了哪些SQL需要改再?zèng)Q定是否從my.ini里去掉ONLY_FULL_GROUP_BY。第二個(gè)是認(rèn)證插件。8.0默認(rèn)的caching_sha2_password安全性強(qiáng)但老版圖形客戶端、老版PHP mysqli擴(kuò)展不一定認(rèn)。如果連接端版本偏舊可以在my.ini里加一行default-authentication-pluginmysql_native_password這行配置的效果是初始化后新建或重置的用戶默認(rèn)走mysql_native_password認(rèn)證兼容性立刻回升。要注意這行必須在初始化之前生效已經(jīng)創(chuàng)建的用戶需要單獨(dú)ALTER USER才能切換。第三個(gè)是字符集。8.0.15默認(rèn)排序規(guī)則是utf8mb4_0900_ai_ci基于Unicode 9.0的排序算法。老驅(qū)動(dòng)如果不認(rèn)識(shí)0900這個(gè)排序規(guī)則建表或查詢時(shí)會(huì)報(bào)Unknown collation。如果你的應(yīng)用層是較老的組件穩(wěn)妥做法是配置成更通用的utf8mb4_general_ci。這幾個(gè)參數(shù)的取舍有個(gè)共同原則默認(rèn)值不等于最優(yōu)值要看你的連接端和SQL風(fēng)格是什么年代。一張速查表放在這里配置項(xiàng)建議值典型場(chǎng)景sql_mode去掉ONLY_FULL_GROUP_BY老業(yè)務(wù)SQL大量使用非嚴(yán)格分組default-authentication-pluginmysql_native_password老客戶端或老驅(qū)動(dòng)無法握手collation-serverutf8mb4_general_ci舊系統(tǒng)依賴舊的排序語(yǔ)義character-set-serverutf8mb4需要完整中文和emoji支持skip-name-resolve開啟純內(nèi)網(wǎng)IP直連減少DNS反查3.3 內(nèi)存與連接數(shù)按機(jī)器規(guī)格調(diào)別復(fù)制網(wǎng)上的大參數(shù)內(nèi)存參數(shù)最容易出現(xiàn)兩種翻車一種是一臺(tái)2G內(nèi)存的機(jī)器配了2G的innodb_buffer_pool_sizeMySQL啟動(dòng)直接失敗另一種是連配置的意義都沒搞清楚抄來一堆大參數(shù)。innodb_buffer_pool_size是InnoDB用來緩存數(shù)據(jù)頁(yè)和索引頁(yè)的內(nèi)存池按物理內(nèi)存的50%到70%給是比較常見的經(jīng)驗(yàn)值。比如2核4G的機(jī)器給512M8核16G的機(jī)器給8G左右這個(gè)區(qū)間內(nèi)先跑起來再看命中率。max_connections這個(gè)參數(shù)也要克制默認(rèn)151對(duì)開發(fā)環(huán)境足夠生產(chǎn)環(huán)境調(diào)到300到500是常見操作。很多人誤以為開得越大越好實(shí)際上每個(gè)連接在內(nèi)存里都要占用線程棧和緩沖區(qū)開5000個(gè)連接只是把內(nèi)存耗盡。常見做法是先把max_connections設(shè)成預(yù)期業(yè)務(wù)峰值的兩倍再通過監(jiān)控觀察實(shí)際連接數(shù)沒必要為了賬面數(shù)字好看而浪費(fèi)內(nèi)存。4. 部署一臺(tái)MySQL8命令走一遍與一鍵包拆解4.1 從解壓到啟動(dòng)關(guān)鍵命令逐條拆拿到zip后的完整手工流程大概是這樣的以管理員身份打開cmdcd到解壓目錄的bin下執(zhí)行D: cd D:/mysql-8.0.15-winx64/bin mysqld --defaults-fileD:/mysql-8.0.15-winx64/my.ini --initialize-insecure mysqld --install MySQL8 --defaults-fileD:/mysql-8.0.15-winx64/my.ini net start MySQL8第一條命令的作用是初始化數(shù)據(jù)目錄。--initialize-insecure會(huì)讓root賬號(hào)初始密碼為空方便腳本繼續(xù)往下執(zhí)行。第二條命令把mysqld注冊(cè)成Windows服務(wù)服務(wù)名MySQL8后面的--defaults-file會(huì)寫入服務(wù)的啟動(dòng)命令行里。第三行net start就是真正把服務(wù)啟動(dòng)起來。如果這三行都順利最后會(huì)看到“MySQL8 服務(wù)已經(jīng)啟動(dòng)成功”的提示。此時(shí)注意mysqld --install之后即使命令正確Windows也有可能提示服務(wù)已經(jīng)存在那說明之前注冊(cè)過先用 mysqld --remove MySQL8 清掉再試。啟動(dòng)失敗的排查方向第5章會(huì)專門展開。4.2 空密碼進(jìn)去后第一步重置root和探活初始化用的是insecure模式所以root賬號(hào)暫時(shí)沒有密碼。連接方式有一個(gè)細(xì)節(jié)很多人不知道直接執(zhí)行 mysql -uroot 回車就好不要寫 -p寫了反而會(huì)進(jìn)入密碼輸入等待。進(jìn)到命令行之后第一件事是重置密碼ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密碼; FLUSH PRIVILEGES;這段SQL把root的認(rèn)證方式明確指定為mysql_native_password同時(shí)設(shè)置新密碼。如果my.ini里已經(jīng)寫了default-authentication-plugin后面新建的用戶都會(huì)默認(rèn)走這個(gè)插件但root這種初始化時(shí)就存在的賬號(hào)仍然需要單獨(dú)ALTER一次。探活命令也很簡(jiǎn)單mysql -uroot -p你的密碼 -e SELECT VERSION();能返回8.0.15版本號(hào)說明服務(wù)已經(jīng)在正常響應(yīng)。腳本里更常用的是 mysqladmin -uroot -p你的密碼 ping返回mysqld is alive就是存活狀態(tài)。4.3 一鍵包的bat到底做了什么手工流程跑通之后再看一鍵包的bat就很好理解了。網(wǎng)上常見的封裝邏輯是這樣的echo off set BASE_DIR%~dp0 set MY_INI%BASE_DIR%my.ini set DATA_DIR%BASE_DIR%data if not exist %DATA_DIR% mkdir %DATA_DIR% if not exist %MY_INI% ( echo [mysqld] %MY_INI% echo basedir%BASE_DIR% %MY_INI% echo datadir%DATA_DIR% %MY_INI% echo port3306 %MY_INI% echo character-set-serverutf8mb4 %MY_INI% ) cd /d %BASE_DIR%bin mysqld --defaults-file%MY_INI% --initialize-insecure mysqld --install MySQL8 --defaults-file%MY_INI% net start MySQL8這段腳本的核心邏輯是用%~dp0獲取bat所在的當(dāng)前目錄把它同時(shí)當(dāng)作basedir再往下拼datadir和my.ini路徑。如果my.ini不存在就自動(dòng)生成一份最簡(jiǎn)配置然后直接執(zhí)行手工流程里的三步。這樣任何一臺(tái)Windows x64機(jī)器把這個(gè)zip解壓后以管理員權(quán)限運(yùn)行bat就能得到一套可用的MySQL 8.0.15。注意這個(gè)基礎(chǔ)版腳本有個(gè)隱患data目錄存在時(shí)會(huì)跳過創(chuàng)建但mysqld --initialize-insecure又要求data目錄為空如果目錄里已經(jīng)有殘留文件初始化就會(huì)報(bào)錯(cuò)。解決思路我放在第6章講這里先留個(gè)懸念。5. 避坑記錄初始化、服務(wù)與認(rèn)證的三處翻車復(fù)盤5.1 初始化失敗因?yàn)閐ata目錄有殘留現(xiàn)象命令行執(zhí)行mysqld --initialize-insecure報(bào)錯(cuò)提示“--initialize specified but the data directory has files in it”。原因mysqld出于安全考慮拒絕在非空目錄里執(zhí)行初始化。這個(gè)殘留往往是之前初始化失敗留下的半成品文件或者是手動(dòng)建了一個(gè)空data目錄后又在里面放過東西。解決把data目錄里的所有內(nèi)容備份到其他地方然后徹底清空目錄本身再重新執(zhí)行初始化。這里有個(gè)細(xì)節(jié)備份文件不要放在解壓目錄內(nèi)否則mysqld掃描時(shí)會(huì)把備份文件也算作data目錄內(nèi)容。我習(xí)慣備份到同級(jí)目錄或D盤根目錄。5.2 服務(wù)啟動(dòng)即停止先看.err日志現(xiàn)象net start MySQL8執(zhí)行后提示“服務(wù)正在啟動(dòng)”然后又彈失敗或者服務(wù)管理里看到MySQL8狀態(tài)變?yōu)椤耙淹V埂?。原因Windows只負(fù)責(zé)拉起進(jìn)程mysqld啟動(dòng)失敗時(shí)服務(wù)管理者不會(huì)告訴你具體原因。大概率是my.ini路徑寫錯(cuò)、basedir/datadir指向不存在、或者配置文件里的路徑分隔符用了反斜杠導(dǎo)致解析異常。解決去data目錄下找一個(gè)以機(jī)器名命名的.err文件比如DESKTOP-ABC123.err。只要mysqld能跑到初始化階段這個(gè)日志就一定會(huì)生成。打開看最后幾行里面有明確的error信息。路徑問題的話日志會(huì)直接顯示basedir解析成了什么值一眼就能看出寫錯(cuò)了什么。從那次之后我養(yǎng)成的習(xí)慣是凡是服務(wù)起來又立刻停先看err日志不要反復(fù)重啟。5.3 3306被占用一條命令定位現(xiàn)象啟動(dòng)時(shí)報(bào)錯(cuò)日志里有“Address already in use”相關(guān)字樣或者net start命令直接返回端口占用提示。原因機(jī)器上已經(jīng)有一個(gè)MySQL實(shí)例或其他程序占了3306最常見的是之前裝過5.7沒卸載干凈或者有別的開發(fā)工具自帶了MySQL服務(wù)。解決先執(zhí)行 netstat -ano | findstr :3306輸出里最后一列是占用進(jìn)程的PID。再用 tasklist | findstr PID 看是哪個(gè)程序確認(rèn)不是有用的進(jìn)程后執(zhí)行 taskkill /pid PID /f 結(jié)束它。如果舊實(shí)例是MySQL服務(wù)更明確的做法是去服務(wù)管理里停掉舊服務(wù)而不是簡(jiǎn)單kill進(jìn)程。5.4 老客戶端連不上認(rèn)證插件不兼容現(xiàn)象圖形客戶端或老版本的語(yǔ)言驅(qū)動(dòng)連接報(bào)錯(cuò)提示 Authentication plugin caching_sha2_password cannot be loaded。原因8.0默認(rèn)的caching_sha2_password后向兼容性不好老客戶端在握手階段根本不認(rèn)識(shí)這個(gè)插件。這個(gè)問題在5.7升級(jí)8.0時(shí)最容易爆發(fā)而且升級(jí)之后不會(huì)自動(dòng)出現(xiàn)往往在第一次從應(yīng)用端連接時(shí)才暴露。解決如果只是少數(shù)賬號(hào)要兼容舊客戶端執(zhí)行 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密碼; 切換認(rèn)證方式。如果整個(gè)環(huán)境都要兼容舊生態(tài)直接在my.ini里加 default-authentication-pluginmysql_native_password讓新建賬號(hào)默認(rèn)走到老協(xié)議。5.5 中文亂碼與排序規(guī)則報(bào)錯(cuò)現(xiàn)象導(dǎo)入舊庫(kù)后中文變問號(hào)或者建表時(shí)直接報(bào) Unknown collation: utf8mb4_0900_ai_ci。原因8.0.15的默認(rèn)排序規(guī)則基于Unicode 9.0老驅(qū)動(dòng)不認(rèn)識(shí)這個(gè)排序規(guī)則亂碼則是連接字符集和服務(wù)端字符集不一致寫入時(shí)就已經(jīng)轉(zhuǎn)壞了。解決my.ini里統(tǒng)一寫 character-set-serverutf8mb4 和 collation-serverutf8mb4_general_ci。對(duì)已經(jīng)建好的庫(kù)光改配置不生效需要執(zhí)行 ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 重建表的字符集。這一點(diǎn)要特別注意連接層的字符集設(shè)置只能影響新連接已經(jīng)亂掉的數(shù)據(jù)不會(huì)自動(dòng)恢復(fù)。6. 一個(gè)值得帶走的技巧把部署腳本改成可重復(fù)執(zhí)行上面那個(gè)基礎(chǔ)版bat有個(gè)痛點(diǎn)同一臺(tái)機(jī)器跑第二遍初始化會(huì)因data目錄非空而失敗mysqld --install會(huì)因服務(wù)已存在而報(bào)錯(cuò)。解決辦法是給腳本加上冪等判斷data目錄和my.ini存在就跳過對(duì)應(yīng)步驟服務(wù)已注冊(cè)就不再重復(fù)install。echo off set BASE_DIR%~dp0 set MY_INI%BASE_DIR%my.ini set DATA_DIR%BASE_DIR%data if not exist %DATA_DIR% mkdir %DATA_DIR% cd /d %BASE_DIR%bin if not exist %MY_INI% ( echo [mysqld] %MY_INI% echo basedir%BASE_DIR% %MY_INI% echo datadir%DATA_DIR% %MY_INI% echo port3306 %MY_INI% ) sc query MySQL8 2nul | findstr /i RUNNING if errorlevel 1 ( if not exist %DATA_DIR%\mysql ( mysqld --defaults-file%MY_INI% --initialize-insecure ) sc query MySQL8 2nul | findstr /i SERVICE_NAME nul if errorlevel 1 ( mysqld --install MySQL8 --defaults-file%MY_INI% ) net start MySQL8 )核心邏輯就三處用data目錄下是否存在mysql子目錄判斷是否已經(jīng)初始化過用sc query加findstr判斷服務(wù)是否已經(jīng)注冊(cè)再用net start把服務(wù)拉起來。這樣的腳本可以反復(fù)執(zhí)行不會(huì)跑一次就壞。想部署多實(shí)例時(shí)復(fù)制整個(gè)目錄修改my.ini里的port和服務(wù)名重新跑一次就行。這比每次手工清理服務(wù)、清空data目錄要省事一個(gè)量級(jí)。從那以后我每次給Windows裝MySQL都會(huì)強(qiáng)制走一遍“先查端口、再看err、再初始化”的流程這套習(xí)慣幫我避開了不少半夜的電話。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取