
裝機這件事尤其是一臺干干凈凈的服務(wù)器要從零開始部署 MySQL我前后折騰了不下幾十次。從最早官網(wǎng)下個安裝包一路下一步到后來在 Linux 上寫腳本靜默安裝再到幫同事排查各種連不上、起不來的問題MySQL 的下載安裝及配置看起來是入門第一課但恰恰是這一課最容易埋坑。版本選錯、初始化密碼丟失、字符集不對、認證插件不兼容任何一個點都能卡住半天。所以今天把整個流程從選版本、下載、安裝、初始化配置到故障排查一次性寫透適合剛準(zhǔn)備自己部署數(shù)據(jù)庫的開發(fā)者也適合那些已經(jīng)“能跑但總覺得哪里不對勁”的人。1. 動手之前先搞清楚自己和這臺機器的真實需求1.1 先選版本再談安裝很多人第一件事就是打開瀏覽器搜下載鏈接這其實是最容易后悔的做法。MySQL 的版本選擇直接決定了后面幾年你維護數(shù)據(jù)庫時的心情。目前主流的社區(qū)版本就兩條線5.7 和 8.0。如果這是新項目、新環(huán)境我基本無腦推薦 8.0。原因很簡單8.0 默認支持 utf8mb4 字符集emoji 和生僻字不用單獨處理有窗口函數(shù)和公共表表達式寫統(tǒng)計 SQL 比 5.7 舒服太多默認認證插件是 caching_sha2_password安全性更高。而且 MySQL 5.7 的官方維護早已進入尾聲很多新硬件和操作系統(tǒng)對新版本支持更好。但如果你要維護的是老項目主從架構(gòu)已經(jīng)跑了好幾年客戶端還是老版本的 JDBC 驅(qū)動或者老版圖形工具那 5.7 反而更穩(wěn)妥。8.0 默認的認證插件很多老客戶端不認報錯信息直接就是 Authentication plugin caching_sha2_password cannot be loaded升級驅(qū)動若是來不及項目就只能干瞪眼。另外還有一個容易忽略的點MySQL 社區(qū)版和企業(yè)版的區(qū)別。企業(yè)版帶備份、監(jiān)控、審計這些商業(yè)化組件但那都是付費的。絕大多數(shù)場景用社區(qū)版就足夠了功能上沒有閹割性能也一樣不要因為名字里帶“社區(qū)”就覺得是個簡化版。1.2 安裝包的三種獲取渠道和選擇邏輯確定版本之后再考慮從哪里拿安裝包。這里有三種常見渠道側(cè)重點完全不同。第一種是官網(wǎng)的下載頁。這個最靠譜版本最全GPL 協(xié)議的社區(qū)版就在里邊。官網(wǎng)會提供各種平臺的安裝包Windows 下有 MSI 安裝器和 ZIP 壓縮包兩種形態(tài)Linux 下有 RPM、DEB 包和 tar.gz 源碼包。如果你不確定裝什么就直接選帶“Installer”字樣的 MSI 版它能引導(dǎo)你完成整個安裝過程。第二種是公共軟件倉庫或鏡像站點。這類渠道的優(yōu)勢是速度快尤其是部分網(wǎng)絡(luò)環(huán)境訪問官網(wǎng)不穩(wěn)定的時候從鏡像拉取能省不少時間。但要注意鏡像站上的版本可能不是最新的偶爾還會出現(xiàn)同步延遲。下載完多一步校驗工作核對一下安裝包的哈希值這一步不難但很值得做防止拿到損壞或不完整的文件。第三種是內(nèi)網(wǎng)軟件源或本地自建倉庫。公司或團隊內(nèi)部如果已經(jīng)維護了自己的軟件源直接從里面拉取是最規(guī)范的做法版本統(tǒng)一、依賴可控還能在離線環(huán)境下安裝。我見過很多內(nèi)網(wǎng)環(huán)境完全不能訪問外部網(wǎng)絡(luò)這時候內(nèi)網(wǎng)鏡像和離線 RPM 包就是救命稻草。1.3 環(huán)境準(zhǔn)備一臺干凈的機器比什么都重要很多人忽略了裝前的環(huán)境檢查直接開裝然后被各種莫名其妙的錯誤打斷。其實檢查就三件事。磁盤和內(nèi)存是否夠用。MySQL 8.0 安裝完基礎(chǔ)占用大概 1GB 左右數(shù)據(jù)目錄還要預(yù)留空間。內(nèi)存方面開發(fā)環(huán)境 2GB 勉強能跑生產(chǎn)環(huán)境建議至少 4GB并且要提前規(guī)劃 InnoDB 緩沖池的大小。端口 3306 是否空閑也很關(guān)鍵尤其 Windows 上裝過其他數(shù)據(jù)庫軟件或者被別的進程占了端口安裝時配置那一關(guān)就會卡住。操作系統(tǒng)的基礎(chǔ)組件是否齊全。Windows 環(huán)境下MySQL 安裝器依賴微軟的 VC 運行庫缺了它會在檢測環(huán)境那一步失敗。Linux 環(huán)境下RPM 安裝時經(jīng)常提示缺少依賴比較常見的是 libaio、numactl 之類的庫需要提前裝上。虛擬機場景下先打個快照。這一步真的是無數(shù)血淚換來的經(jīng)驗安裝配置過程中如果搞亂了系統(tǒng)配置回滾快照比反安裝干凈一百倍。我就是有一次在測試機里反復(fù)卸載重裝最后 MySQL 服務(wù)殘留了一大堆費了半天勁才清理干凈。2. Windows 上把 MySQL 裝起來并且當(dāng)場驗證2.1 安裝類型怎么選全量、只裝服務(wù)端還是自定義Windows 下用 MSI 安裝器是最省心的方式。雙擊打開后會有幾個安裝類型選項很多人直接選默認的 Developer Default結(jié)果裝了一堆用不上的組件。Developer Default 會安裝 MySQL 服務(wù)端、MySQL Shell、Router、各種語言的連接器、文檔、示例數(shù)據(jù)庫甚至還有 Excel 插件。如果是給一個專門的數(shù)據(jù)庫服務(wù)器用這些東西基本都是多余的白占磁盤空間還拖慢安裝速度。Server only 是最精簡的只裝服務(wù)端和客戶端命令行工具適合純粹要跑數(shù)據(jù)庫的場景。Custom 是自定義適合像我這種喜歡掌控每個目錄位置的人。我的建議是本機開發(fā)用 Developer Default 沒什么問題圖省事。但如果是部署服務(wù)器選 Server only需要的工具用的時候再單獨裝保持環(huán)境干凈。另外一個選擇是 ZIP 免安裝包。這個方式其實很適合批量部署解壓之后改一下配置文件執(zhí)行初始化命令注冊成 Windows 服務(wù)就能用。不用走圖形安裝器的向?qū)窂胶托袨槎伎煽?。不過它需要手寫配置文件和手工初始化對新手來說門檻稍微高一點。2.2 配置實例時容易被忽略的幾項選擇安裝類型之后就到了配置實例這一步這里面的細節(jié)直接影響后續(xù)使用。第一個是 Config Type。這個選項會出現(xiàn)三個類型Development Machine、Server Machine、Dedicated Machine。它們的區(qū)別不是安裝位置而是 MySQL 會根據(jù)類型自動估算內(nèi)存占用、連接數(shù)和 InnoDB 緩沖池大小。本地開發(fā)機選 Development 就行會留更多內(nèi)存給其他應(yīng)用專用數(shù)據(jù)庫服務(wù)器選 Server 或 DedicatedMySQL 會吃下更多內(nèi)存以換取性能。我之前在測試機上選了 Dedicated Machine結(jié)果數(shù)據(jù)庫把內(nèi)存占滿了開發(fā)工具全部卡頓后來才反應(yīng)過來是這個配置的原因。第二個是端口和網(wǎng)絡(luò)。默認 3306 基本不用改但要注意 TCP/IP 勾選之后的地址范圍。默認情況下 MySQL 監(jiān)聽所有網(wǎng)絡(luò)接口如果只有本機訪問其實可以配置成只監(jiān)聽 127.0.0.1減少暴露風(fēng)險。生產(chǎn)上需要遠程連接時再放開到指定 IP而不是粗暴地監(jiān)聽所有地址。第三個是認證方式。8.0 安裝的時候會問你要不要用舊版認證默認是新的 caching_sha2_password。需要特別注意這一點如果公司的老項目用的是老版本 JDBC 驅(qū)動、老版 Navicat 或者其他跟不上時代的客戶端建議直接勾選兼容選項。否則裝完之后本地命令行能連遠程或者程序連就報錯。第四個是密碼。安裝過程會要求設(shè)置 root 密碼這里的難點在于 MySQL 8.0 默認密碼策略比較嚴(yán)格要求至少 8 位且包含大小寫、數(shù)字和特殊字符。你可以后續(xù)再調(diào)整策略但初始設(shè)置時最好記到自己的密碼管理工具里。密碼忘了的恢復(fù)過程雖然可行但比較折騰后面會詳細講。2.3 完成安裝后的第一次連接測試安裝完成后先別急著關(guān)窗口當(dāng)場做一次連接測試確認服務(wù)真的能工作。打開命令行用 mysql -u root -p 登錄輸入剛才設(shè)置的密碼。如果出現(xiàn) mysql 不是內(nèi)部或外部命令 的報錯說明 MySQL 的 bin 目錄沒有加到 PATH 環(huán)境變量里。MSI 安裝器一般會自動配置但如果沒生效手動把安裝目錄下的 bin 路徑加進去就行。登錄成功之后執(zhí)行幾條基礎(chǔ)命令驗證狀態(tài)SELECT VERSION(); SHOW DATABASES;第一條能看到當(dāng)前版本號第二條能看到初始化好的幾個默認數(shù)據(jù)庫。到這里 MySQL 服務(wù)端基本就算是正常工作了。接下來我還會順手執(zhí)行一條 SHOW VARIABLES LIKE character_set%;看一下字符集配置情況。如果 character_set_server 還是默認的 latin1后面就需要在配置文件里改成 utf8mb4這個在第 4 部分會細說。3. Linux 服務(wù)器上的靜默安裝與自動化腳本3.1 倉庫安裝與 RPM 離線安裝取舍Linux 上部署 MySQL 通常有兩種主流套路一種是通過官方軟件倉庫在線安裝另一種是下載 RPM 包離線安裝。我兩種都用了很多年各自的優(yōu)劣很清楚。官方軟件倉庫的優(yōu)勢是省心一條指令就能完成安裝并自動處理依賴關(guān)系。在 Red Hat 系的發(fā)行版上需要先安裝官方倉庫的 RPM 配置包然后直接拿 yum 或 dnf 裝 mysql-server。Debian 系則可以配置官方 APT 源之后用 apt 安裝。這種方式適合網(wǎng)絡(luò)暢通、可以訪問外部軟件源的環(huán)境。離線 RPM 包則是把 mysql-community-server、mysql-community-client 等一整套包下載下來在目標(biāo)機器上手動安裝。安裝順序是有講究的一般是 common、libs、client、server 這個順序因為后邊的包依賴前邊的內(nèi)容。用 rmp -ivh 依次安裝如果缺少依賴庫會有明確的提示再單獨補齊就行。這里特別提醒一下不要用系統(tǒng)自帶的默認倉庫直接裝 MySQL很多發(fā)行版的軟件源里默認的“mysql-server”其實是 MariaDB 或者某個舊版本分支。不是說 MariaDB 不好而是如果你就是沖 MySQL 去的裝出來一個跑了 MariaDB 的庫后面很多參數(shù)和行為都不對勁。我剛?cè)腴T時就在這上面吃過虧折騰半天才搞明白數(shù)據(jù)庫的內(nèi)核都不一樣。3.2 初始化、目錄權(quán)限和啟動服務(wù)RPM 安裝完成之后MySQL 不會自動初始化數(shù)據(jù)目錄。需要執(zhí)行 mysqld --initialize --usermysql 命令注意必須以 mysql 用戶身份執(zhí)行不能直接用 root 跑這也是很多新手會掉的坑。初始化過程會在錯誤日志文件里生成一個臨時 root 密碼。日志文件的位置一般在 /var/log/mysqld.log 或 /var/lib/mysql 目錄下具體看發(fā)行版。第一次啟動服務(wù)時用 grep 過濾日志里的 temporary password 字樣就能找到??吹矫艽a之后啟動服務(wù)systemctl start mysqld systemctl enable mysqld然后登錄第一件事就是修改初始密碼。因為初始密碼是一串隨機字符不修改的話根本沒法用。mysql -u root -p ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword;這里還要注意目錄權(quán)限問題。如果不小心用 root 初始化過數(shù)據(jù)目錄之后 MySQL 啟動會報權(quán)限錯誤。徹底的辦法是停掉服務(wù)把 /var/lib/mysql 目錄的屬主改成 mysql 用戶再重新初始化。啟動成功后日常巡檢可以只用一條命令mysqladmin -u root -p status這條命令能快速查看 MySQL 的存活狀態(tài)、運行時長、連接數(shù)和慢查詢計數(shù)比登錄進去敲 SQL 快得多。3.3 一條命令搞定常規(guī)巡檢說到巡檢我順手整理幾條平時用得最頻繁的命令。除了 mysqladmin status還有這幾條查看當(dāng)前所有數(shù)據(jù)庫連接數(shù)確認有沒有連接堆積SHOW PROCESSLIST;查看 InnoDB 緩沖池實際命中情況SHOW STATUS LIKE Innodb_buffer_pool_read%;查看慢查詢相關(guān)的配置和狀態(tài)確認慢查詢?nèi)罩居袥]有生效SHOW VARIABLES LIKE slow_query_log; SHOW VARIABLES LIKE long_query_time;這些命令組合起來基本就是數(shù)據(jù)庫健康體檢的標(biāo)配。不用裝額外的監(jiān)控工具命令行就能把 80% 的問題排查掉。4. 初始化配置每個參數(shù)背后都有代價4.1 字符集與排序規(guī)則不是小事數(shù)據(jù)庫能跑起來之后第一個要改的就是字符集。MySQL 安裝后默認字符集很可能是 latin1這就意味著你存中文勉強能存存 emoji 或者各種特殊符號就會報錯或者變成亂碼。MySQL 8.0 的默認字符集其實已經(jīng)改成了 utf8mb4但 5.7 和更早版本不是。而且即便是 8.0也建議確認一下實際生效的配置。最穩(wěn)妥的做法是在配置文件里顯式聲明character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci在 5.7 里排序規(guī)則一般建議 utf8mb4_unicode_ci。utf8mb4 和 utf8 的區(qū)別在于MySQL 里的 utf8 實際是 utf8mb3最多只能存 3 個字節(jié)的字符表情符號根本存不進去。所以凡是涉及字符集的配置統(tǒng)一用 utf8mb4 是絕對沒錯的。另一個容易忽略的點是連接層的字符集。就算服務(wù)端設(shè)了 utf8mb4客戶端連接時如果沒有指定依然會出現(xiàn)亂碼。在 Linux 命令行登錄時可以加參數(shù)mysql --default-character-setutf8mb4 -u root -p在 JDBC 連接串里則要加上 characterEncodingutf8mb4 和 useUnicodetrue。這些都是實際項目中常見的坑。排序規(guī)則的選擇也有講究。utf8mb4_0900_ai_ci 是 8.0 默認的ai 表示不區(qū)分重音ci 表示不區(qū)分大小寫。如果業(yè)務(wù)對大小寫敏感就要改成 utf8mb4_bin 或者 _cs 結(jié)尾的規(guī)則。這屬于業(yè)務(wù)層決策沒有絕對的好壞。4.2 賬號管理與密碼策略root 賬號只適合本地 DBA 管理用任何業(yè)務(wù)程序都不應(yīng)該用 root 去連庫。這是我反復(fù)強調(diào)的一點因為業(yè)務(wù)程序中如果數(shù)據(jù)庫密碼泄露root 權(quán)限意味著整個數(shù)據(jù)庫被接管。實踐上建議單獨創(chuàng)建業(yè)務(wù)賬號CREATE USER app_userlocalhost IDENTIFIED BY StrongPssw0rd; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO app_userlocalhost; FLUSH PRIVILEGES;這里的 host 部分非常關(guān)鍵。localhost 表示只允許本機連接如果要允許遠程訪問就得換成具體 IP 或者 %。% 表示任意地址能用具體 IP 的時候盡量不要用 %。密碼策略方面MySQL 8.0 默認啟用了 validate_password 組件密碼必須滿足一定復(fù)雜度。這個組件在安裝時就生效修改密碼時如果太簡單會被拒絕。可以通過配置調(diào)整策略等級SET GLOBAL validate_password.policy LOW;低策略只要求長度但生產(chǎn)環(huán)境一般不建議降級。權(quán)限授予遵循最小化原則只給業(yè)務(wù)實際需要的權(quán)限。需要聯(lián)表查詢就加 SELECT 權(quán)限需要批量寫入就加 INSERT沒必要一股腦給 ALL PRIVILEGES。權(quán)限給多了出問題的時候排查范圍也大。4.3 慢查詢和日志到底要不要開慢查詢?nèi)罩臼悄壳靶詢r比最高的性能排查工具我一般建議長期開啟只是閾值和輸出方式可以按環(huán)境調(diào)整。slow_query_logON long_query_time1 slow_query_log_file/var/log/mysql/slow.loglong_query_time1 表示超過 1 秒的 SQL 都會被記錄。對于線上環(huán)境如果業(yè)務(wù)本來就復(fù)雜可以適當(dāng)放寬到 2 秒或 3 秒避免日志增長太快。開發(fā)環(huán)境建議 0.5 秒甚至 0 秒把所有 SQL 都記錄下來方便性能調(diào)優(yōu)。開啟慢查詢?nèi)罩局蠖ㄆ诳匆槐槿罩灸男?SQL 占用了大量時間一目了然。配合 EXPLAIN 分析執(zhí)行計劃基本能定位 90% 的性能問題。通用日志 general_log 默認是關(guān)閉的它記錄所有執(zhí)行的 SQL信息量太大只有排查特定問題時才建議臨時打開。還有一個容易被忽略的日志是二進制日志 binlog。如果是單機使用且不需要數(shù)據(jù)恢復(fù)其實可以不開啟因為 binlog 會占用磁盤空間。但只要是搭建主從復(fù)制binlog 就必須開啟。我見過一臺服務(wù)器上 binlog 增長到幾十 GB 導(dǎo)致磁盤被寫滿的故障排查下來就是 binlog 過期時間沒有配置。5.7 里用 expire_logs_days8.0 則改成了 binlog_expire_logs_seconds默認是 2592000 秒也就是 30 天。如果不小心把保留時間設(shè)成了 0binlog 就永遠不會自動清理磁盤遲早被寫爆。4.4 遠程訪問與安全焦慮的平衡“為什么我的 MySQL 遠程連接不上”是我被問過最多的問題。遠程訪問這件事一通百通報錯就那么幾種原因。首先要確認 MySQL 是否監(jiān)聽了所有網(wǎng)卡。配置文件里的 bind-address 如果默認是 127.0.0.1那就只監(jiān)聽本機回環(huán)地址局域網(wǎng)其他機器根本碰不到。改成 0.0.0.0 或者指定業(yè)務(wù)網(wǎng)段的 IP才能從外部連接。其次要確認賬號的 host 設(shè)置。前面講過app_userlocalhost 只允許本機登錄需要遠程連接就要用 app_user192.168.1.% 這種形式。最后是防火墻。Linux 上如果啟用了 firewalld 或者系統(tǒng)防火墻即使 MySQL 配置全對外部訪問依然會被攔截。開發(fā)環(huán)境圖省事可以直接關(guān)掉防火墻但生產(chǎn)環(huán)境請務(wù)必只放行必要端口并且限定來源 IP。IPv6 的問題偶爾也會出現(xiàn)。有些環(huán)境里 MySQL 監(jiān)聽的是 ::1 而不是 0.0.0.0配置 bind-address 時要確認寫成 * 或者明確指定 0.0.0.0。還有一個安全方面的細節(jié)遠程訪問盡量使用獨立賬號不要放行 root 的遠程登錄。root 只保留本機訪問即可。5. 故障排查我替你踩過的幾個坑5.1 忘記 root 密碼的三種恢復(fù)思路不管是在本地開發(fā)還是在生產(chǎn)服務(wù)器忘記 root 密碼都是遲早會遇到的事情。恢復(fù)方式根據(jù)環(huán)境和場景至少有三種選擇。最簡單的方式是走 skip-grant-tables 模式。這個模式的原理是 MySQL 啟動時不加載授權(quán)表跳過所有權(quán)限校驗。操作步驟是先停掉正常服務(wù)然后用跳過授權(quán)表的方式手動啟動。systemctl stop mysqld mysqld_safe --skip-grant-tables --skip-networking 注意 --skip-networking 一定要加這個參數(shù)會禁用遠程連接避免在無認證狀態(tài)下被網(wǎng)絡(luò)請求攻擊。啟動成功后再用 mysql -u root 無密碼登錄重置密碼FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewStrongPassword;改完密碼后重啟服務(wù)恢復(fù)正常模式。第二種思路是使用 init-file。在配置文件里指定一個包含重置密碼 SQL 的文本文件啟動時 MySQL 會先執(zhí)行里面的語句。這種方式的好處是服務(wù)正常啟動不用經(jīng)歷無認證階段比較適合有嚴(yán)格安全要求的場景。第三種思路是備份和恢復(fù)。如果日常有備份數(shù)據(jù)庫的邏輯可以直接用最近的備份恢復(fù)這個代價最大只作為最后手段。這里要特別說一句MySQL 8.0 中 authentication_string 字段存的是密碼哈希不是明文也不支持直接用 update 語句寫簡單字符串。有人自作聰明執(zhí)行 update mysql.user set authentication_stringpassword where userroot結(jié)果密碼還是不對。正確做法就是用 ALTER USER 語句讓 MySQL 自己計算哈希。5.2 遠程連接報錯的排查路徑遇到客戶端連不上遠程 MySQL我通常按照一條固定路徑排查從外到內(nèi)一層層剝。先確認網(wǎng)絡(luò)通不通。在客戶端機器上執(zhí)行 ping 和 telnet檢查目標(biāo) IP 的 3306 端口是否能訪問。如果 telnet 報錯說明問題在網(wǎng)絡(luò)層或防火墻數(shù)據(jù)庫本身即使配置正確也白搭。然后確認 MySQL 監(jiān)聽狀態(tài)。在服務(wù)器上執(zhí)行netstat -tlnp | grep 3306如果結(jié)果只顯示 127.0.0.1:3306說明只監(jiān)聽了本機需要修改 bind-address。如果顯示 0.0.0.0:3306 或者具體 IP說明監(jiān)聽沒問題。最后確認賬號授權(quán)。用 root 本地登錄后查看 hosts 權(quán)限SELECT user, host FROM mysql.user;如果賬號的 host 是 localhost遠程就是連不通的。創(chuàng)建一個允許遠程的賬號或者把 host 改為具體網(wǎng)段。然后再試一次連接。很多報錯都是表面現(xiàn)象Cant connect to MySQL server on x.x.x.x (10061) 是端口不通Access denied for user rootx.x.x.x 是權(quán)限問題Authentication plugin cannot be loaded 是認證插件不兼容。報錯信息不同本質(zhì)原因完全不同不要看到一個報錯就去改數(shù)據(jù)庫配置。5.3 性能異常與配置復(fù)核清單MySQL 裝好后正常跑了一段時間突然變慢了這類問題我也遇過不少。排查時先別急著調(diào)大各種參數(shù)先看系統(tǒng)層面的狀態(tài)。用 SHOW PROCESSLIST 看看有沒有大量堆積的連接。這個輸出能直接看到每個連接在做什么是正在執(zhí)行慢 SQL還是處于 sleep 狀態(tài)空占連接。如果 sleep 連接特別多說明連接池配置有問題或者 wait_timeout 設(shè)置得太長連接沒有被及時回收。連接數(shù)被打滿時會出現(xiàn) Too many connections 的錯誤。這個錯誤的直接原因是 max_connections 不夠用但根因往往不是這個。應(yīng)用程序的連接池沒有復(fù)用連接而是一次請求新建一個連接是最常見的場景。這個時候把 max_connections 從 200 調(diào)到 2000 只能治標(biāo)真正該做的是修連接池配置。磁盤 I/O 也是一個容易被忽略的瓶頸。數(shù)據(jù)庫所在磁盤如果滿了或者磁盤 I/O 本來就很差MySQL 的表現(xiàn)就是越來越慢。用 iostat 或系統(tǒng)自帶監(jiān)控工具看一眼負載如果 I/O 長時間在 90% 以上優(yōu)先考慮優(yōu)化 SQL而不是加內(nèi)存調(diào)參。最后檢查一下 InnoDB 緩沖池大小。innodb_buffer_pool_size 默認值在安裝時不一定適合當(dāng)前業(yè)務(wù)量。當(dāng)前內(nèi)存總量 70% 左右是一個常見經(jīng)驗值但也不是越大越好畢竟系統(tǒng)本身和其他進程也要內(nèi)存。5.4 一份可以直接抄的避坑速查表最后整理一份速查表把前面提到的典型問題和排查思路集中放進來我平時排查問題時也會參考這個思路?,F(xiàn)象常見原因排查與解決安裝時卡在 Start Service端口被占用、權(quán)限不足、殘留服務(wù)沖突檢查 3306 端口占用確認以管理員身份運行安裝器卸載時清理注冊表和服務(wù)殘留mysql 命令找不到bin 目錄未加入 PATH把 MySQL 安裝目錄下的 bin 路徑加入系統(tǒng) PATHLinux 啟動失敗數(shù)據(jù)目錄權(quán)限錯誤、依賴庫缺失檢查 /var/lib/mysql 屬主是否為 mysql補齊 libaio、numactl 等依賴忘記 root 密碼無skip-grant-tables 模式重置注意禁用網(wǎng)絡(luò)遠程連不上監(jiān)聽地址、防火墻、賬號 host、認證插件按網(wǎng)絡(luò)通斷、監(jiān)聽狀態(tài)、賬號權(quán)限、認證插件順序逐層排查中文亂碼或 emoji 報錯字符集不是 utf8mb4統(tǒng)一服務(wù)端、連接層、表字符集為 utf8mb4磁盤被 binlog 占滿binlog 保留時間未設(shè)置檢查 binlog_expire_logs_seconds及時清理連接數(shù)被打滿連接池未復(fù)用連接檢查應(yīng)用連接池配置然后考慮調(diào)大 max_connections老客戶端連不上 8.0認證插件為 caching_sha2_password升級客戶端驅(qū)動或?qū)①~號認證方式改為 mysql_native_password這個表其實覆蓋了我這些年遇到的絕大多數(shù) MySQL 安裝配置問題。很多問題在官方文檔里都有詳細說明但文本形式的信息密度高。真正上手操作的時候手邊有一份這樣的清單比翻文檔快得多。聊到這兒我再分享一個自己一直堅持的習(xí)慣每次在一個新環(huán)境里部署完 MySQL我會立刻把配置文件、初始化命令、遇到的坑和解決方式記到項目筆記里。不是給自己增加工作量而是半年后再維護這套環(huán)境的時候這份筆記就是最省時間的資料。MySQL 安裝配置看似基礎(chǔ)但恰恰是基礎(chǔ)環(huán)節(jié)最容易因為“反正就這么幾步”而留下隱患。先用對版本再做對配置最后留好排查思路這一套流程走下來數(shù)據(jù)庫才能真正穩(wěn)定地跑起來。