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