
1. 為什么非要折騰 .tar.gz 方式安裝 MySQL先聊點實際的。很多人一聽到 Linux 下裝 MySQL第一反應就是apt install mysql-server或者yum install mysql-community-server一條命令搞定頂多配個密碼就完事。那為什么還有那么多人翻出 .tar.gz 壓縮包老老實實手動裝一遍我在實際工作里遇到過幾種情況逼著你必須走這條“笨路”。第一種是服務器環境特殊。有些內網環境、國產化系統或者最小化安裝的 Linux 發行版軟件源里根本沒有 MySQL或者源里的版本老得掉渣還是 5.6 時代的東西。CentOS 默認源里連 mysql-server 都沒有只有 MariaDB但項目又必須用官方 MySQL這時候只能去官網手動下載 tar.gz 包。第二種是版本潔癖或者說版本強需求。新項目要用 MySQL 8.0 的窗口函數、CTE 這些特性但生產環境是離線內網預裝的數據庫版本不夠yum 源又連不上。第三種更常見——你是開發環境想裝一個“干凈”的 MySQL不受系統包管理器的一堆依賴影響想裝幾個版本就裝幾個版本想刪就刪直接刪目錄完事。用 .tar.gz 方式安裝最大的好處就是可控性極強。所有文件都集中在一個目錄下數據目錄、配置文件、日志文件、啟動腳本全部由你說了算。不像 rpm/deb 包那樣把東西散落在系統的各個目錄里卸載的時候還得清理半天殘留。我自己的習慣是裝到/usr/local/mysql數據目錄單獨放這樣后面要做數據遷移、做備份甚至整機復制都非常方便。這篇文章面向的讀者我默認你已經有基本的 Linux 操作經驗會敲命令行、會用 vim 或者 nano 編輯文件。如果你是個剛接觸 Linux 的小白也不用慌下面每一步我都會寫得非常細你照著敲就行。2. 安裝前的準備工作下載、環境檢查、依賴處理2.1 從官網找到對的 MySQL 版本這一步看著簡單但很多人在官網迷路。MySQL 官方下載頁面dev.mysql.com/downloads/mysql/進去之后首先會讓你選擇操作系統千萬別選錯。我們要的是Linux - Generic也就是通用二進制版本下面會有 .tar.gz 格式的壓縮包下載鏈接。選版本的時候我建議優先選8.0.x 的 GA 穩定版不要一看到 8.4 或者 9.x 就手癢。MySQL 的版本策略有點特殊8.0 目前是廣泛應用的生產版本各種兼容性問題踩得差不多了社區資料也最全。另外注意區分兩個包帶-glibc2.12或類似標識的是預編譯好的二進制包適用大多數 Linux 發行版我們下載這個。不帶這個標識的源碼包Source Code那是要自己編譯的新手先別碰。下載的時候還有一個講究。直接在瀏覽器里下載再上傳服務器速度慢不說還容易斷。我一般用wget直接在服務器上下載cd /usr/local/src wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz如果你下載的時候被提示需要登錄可以換一個思路直接用 CDN 鏈接。官網頁面里每個版本的小字部分通常隱藏著No thanks, just start my download這種快速鏈接右鍵復制鏈接地址放到wget后面就行。下載完之后先確認一下文件大小MySQL 8.0 的二進制包體積大約在 200~300MB 左右如果只有幾十 KB那大概率下錯東西了。2.2 檢查系統環境和基礎依賴在動手之前先把系統環境摸清楚。我列幾個必須要檢查的項目查看系統架構和版本uname -m # 輸出 x86_64 說明是 64 位系統 cat /etc/os-release # 查看發行版信息MySQL 8.0 官方提供的 Linux 通用包只支持 64 位系統32 位系統直接放棄這條路。檢查是否已經安裝過 MySQL 或依賴沖突這一點特別重要。很多人在初始化數據庫的時候報錯就是因為系統里已經有舊的 MySQL/MariaDB 殘留把/etc/my.cnf或者數據目錄占用了。rpm -qa | grep -i mysql # 如果有輸出說明有舊包 rpm -qa | grep -i mariadb # 如果有輸出需要先移除如果有 MariaDB執行yum remove mariadb-libs之類的命令先清掉。不要猶豫兩個數據庫的庫文件如果混在一起后面會出各種莫名其妙的問題。檢查基礎編譯運行庫MySQL 二進制包雖然不需要你現場編譯但是運行它需要系統有libaio這個依賴庫。我踩過最典型的坑就是所有步驟都做完了結果啟動服務的時候報錯error while loading shared libraries: libaio.so.1。不同發行版的安裝命令不一樣Debian/Ubuntu 用apt update apt install -y libaio1 libnuma-devCentOS/RHEL 系用yum install -y libaio libaio-devel numactl有些精簡版系統可能還需要安裝ncurses-compat-libs可以用ldd命令檢查 MySQL 的二進制文件依賴情況ldd /usr/local/src/mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz # 這只是看壓縮包沒意義正確的做法是先解壓再對解壓出來的mysqld文件做檢查cd /usr/local/src tar -xzf mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz ldd /usr/local/src/mysql-8.0.36-linux-glibc2.12-x86_64/bin/mysqld看到輸出里如果有not found字樣那就對照著缺什么裝什么。這一步做好后面能少掉 50% 的報錯。2.3 創建專用用戶和數據目錄這是個被講了無數次但總是被忽略的步驟。我見過有人直接用 root 用戶跑 MySQL短時間看著沒問題但隱患極大。MySQL 官方文檔明確要求mysqld 進程不允許用 root 身份啟動否則會直接報錯拒絕運行。而且安全角度來說數據庫進程權限越小越好萬一被注入攻擊者也拿不到系統 root 權限。創建方式# 創建 mysql 用戶組 groupadd mysql # 創建 mysql 用戶不創建家目錄不允許登錄 shell useradd -r -g mysql -s /bin/false mysql-s /bin/false這個參數會讓該用戶無法登錄系統這是安全基線要求別為了省事不加。數據目錄我習慣單獨建在/data/mysql而不是默認的/usr/local/mysql/data。這樣做的原因很實際數據目錄和應用程序目錄分離如果系統盤出了問題要重裝系統只要數據盤沒壞數據就不會丟。另外很多服務器的數據盤是額外掛載的比如掛載在/data下后續做擴容也更靈活。mkdir -p /data/mysql chown -R mysql:mysql /data/mysql chmod 750 /data/mysql注意這里的權限設置。750意味著只有 mysql 用戶和 mysql 組有讀和執行權限其他用戶一律不可訪問。數據庫文件是敏感資產權限過松是大忌。3. 解壓安裝與目錄規劃把所有東西放在該放的地方3.1 解壓 .tar.gz 并移動到目標目錄準備工作完畢正式進入安裝流程。cd /usr/local/src tar -xzf mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz ls -ld mysql-8.0.36-linux-glibc2.12-x86_64解壓出來的是一個帶版本號的目錄這個名字太長不好用后續配環境變量、寫腳本都不方便。我習慣把它重命名成mysqlmv mysql-8.0.36-linux-glibc2.12-x86_64 /usr/local/mysql然后設置目錄歸屬chown -R mysql:mysql /usr/local/mysql這里有個細節想多說兩句。我看到有些教程在解壓之后就讓人把 MySQL 文件夾的權限改成777理由是“避免權限報錯”。這完全是在給自己埋雷。777意味著所有用戶都能讀寫執行任何普通用戶都能直接改你的數據庫文件這是災難級的配置。正確做法就是保持mysql:mysql的所有者把權限控制在755或更緊。如果你解壓之后打算用軟鏈接的方式做多版本管理那么把目錄命名為mysql-8.0.36保留版本號再建一個軟鏈接ln -s mysql-8.0.36 /usr/local/mysql也是常見的玩法。但我個人更推薦直接改名為mysql少了軟鏈接這一層排查問題的時候路徑更清晰。3.2 配置環境變量為了讓mysql、mysqldump這些命令在任何目錄下都能直接用需要把 MySQL 的 bin 目錄加入 PATH 環境變量。編輯用戶的~/.bashrc文件vim ~/.bashrc在文件末尾添加export PATH$PATH:/usr/local/mysql/bin:/usr/local/mysql/sbin然后讓配置立即生效source ~/.bashrc驗證一下mysql --version如果輸出mysql Ver 8.0.36 for Linux on x86_64之類的內容說明命令已經可用了。如果你是系統管理員希望所有用戶都能使用 MySQL 命令可以把上面的export寫到/etc/profile里面效果一樣。但我自己更推薦寫在用戶級配置里因為服務器上不是每個人都需要訪問數據庫減少暴露面總是好的。3.3 提前理清 MySQL 的重要目錄結構安裝完 MySQL很多人看/usr/local/mysql目錄一臉懵不知道每個文件夾是干嘛的。這里我把關鍵目錄的作用和是否需要備份列個表目錄/文件作用是否需要備份/usr/local/mysql/bin存放 mysql、mysqldump、mysqladmin 等可執行命令不需要安裝包自帶/usr/local/mysql/lib存放運行所需的庫文件不需要/usr/local/mysql/share存放錯誤信息、字符集等支持文件不需要/data/mysql存放實際數據庫數據文件如果我們配置到這兒需要核心資產/usr/local/mysql/my.cnf自建的主配置文件需要建議納入版本管理/var/log/mysql或/data/mysql/mysql.log錯誤日志和查詢日志視需求決定理清這個結構之后你切換版本或者遷移服務器的時候就會從容很多。數據在/data/mysql配置在/etc/my.cnf程序在/usr/local/mysql三個互不干擾。4. 編寫配置文件 my.cnf這一步決定 MySQL 能不能跑順4.1 最小可用配置是怎么來的MySQL 8.0 的安裝目錄里其實自帶了一份默認配置路徑在/usr/local/mysql/support-files/my-default.cnf。但是說實話那份配置非常保守幾乎等于沒配。而且 8.0 之后MySQL 對配置文件的依賴比舊版本小了很多很多參數都有默認值。你甚至可以不建配置文件直接初始化MySQL 會按照內置默認值運行。但在生產環境或者要通過調試的場景我建議還是手動寫一份。官方讀取配置文件的順序是/etc/my.cnf/etc/mysql/my.cnf/usr/local/mysql/my.cnf~/.my.cnf先讀到的配置生效后面的配置會覆蓋前面相同的配置項。我一般會把主配置放在/etc/my.cnf這樣系統上所有用戶都遵循同一套配置也符合 Linux 的目錄規范。下面是我整理的一份適用于大多數場景的 MySQL 8.0 最小可用配置你可以直接復制然后根據實際情況調整[client] port 3306 socket /data/mysql/mysql.sock [mysql] auto-rehash prompt\\u\\h [\\d] [mysqld] user mysql port 3306 basedir /usr/local/mysql datadir /data/mysql socket /data/mysql/mysql.sock pid-file /data/mysql/mysqld.pid log-error /data/mysql/mysql.err character-set-server utf8mb4 collation-server utf8mb4_0900_ai_ci default-storage-engine InnoDB max_connections 500 back_log 128 wait_timeout 600 interactive_timeout 600 connect_timeout 10 lower_case_table_names 1 sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION我逐項說明一下為什么不寫的參數你可以先不管。basedir和datadir是最核心的兩個路徑分別指程序目錄和數據目錄。寫錯任何一個MySQL 都起不來。socket文件路徑也很關鍵本地通過mysql命令連接的時候走的是 socket 通信不是 TCP所以這個路徑必須和[client]里的保持一致。character-set-server統一設置為utf8mb4這是為了支持 Emoji 表情和大部分特殊字符。MySQL 8.0 默認的 collation 是utf8mb4_0900_ai_ci這個排序規則的性能和準確性都優于舊版不建議改成老的general_ci。lower_case_table_names 1表示表名不區分大小寫這一點在 Windows 開發、Linux 部署的項目里特別重要否則本地建的表叫UserInfoLinux 上報錯找不到表能把人折騰瘋。sql_mode里我只保留了一部分嚴格模式參數。STRICT_TRANS_TABLES開啟后插入非法數據會直接報錯而不是產生警告這能在開發階段就暴露問題而不是把臟數據寫進庫里隱藏起來。4.2 初始化數據目錄的正確姿勢配置寫好之后先別急著啟動因為數據目錄還是空的MySQL 沒法運行。在 8.0 版本中初始化命令整合到了mysqld里面用--initialize參數。這里有一個非常關鍵的選擇——是否使用--initialize-insecure。兩者區別在于--initialize初始化時會生成一個隨機 root 密碼寫進錯誤日志里你需要在日志里找出來。--initialize-insecure初始化后 root 用戶是空密碼可以直接無密碼登錄然后再自行修改。我推薦第一次使用--initialize-insecure。原因很簡單你手動去找日志里的隨機密碼輸錯大小寫、輸錯特殊符號的概率太大了搞半天連不上容易懷疑人生。先用空密碼登錄進去再用 SQL 語句把密碼改掉整個過程清晰可控。執行初始化/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure --usermysql注意指定--usermysql確保初始化生成的文件的屬主是 mysql 用戶。初始化完成后查看數據目錄ls -l /data/mysql/你應該能看到mysql、performance_schema、sys、undo_001、undo_002等目錄和文件。如果這些文件存在說明初始化成功。如果這一步報了錯不要急著重復執行先去看錯誤日志也就是我們在配置里指定的log-error /data/mysql/mysql.err。4.3 配置日志系統和默認目錄的權限問題日志這塊值得單獨說一次。MySQL 8.0 的默認錯誤日志位置挺隱蔽的有人找不到日志就以為程序卡死了。我們在配置文件里把log-error指向了/data/mysql/mysql.err那么注意觀察這個文件是否會自動生成。如果初始化命令提示無法寫入日志文件大概率是目錄權限問題chown -R mysql:mysql /data/mysql還需要注意日志文件會不斷增長不給它做輪轉的話時間長了會占滿磁盤。主流的解決方案是配置logrotate系統自帶的日志輪轉工具就能搞定。創建一個配置文件vim /etc/logrotate.d/mysql內容如下/data/mysql/mysql.err { daily rotate 7 missingok notifempty compress sharedscripts postrotate /bin/systemctl reload mysqld /dev/null 21 || true endscript }意思是每天輪轉一次保留 7 份歷史舊日志壓縮。配置完后可以用logrotate -d /etc/logrotate.d/mysql做一次模擬執行檢查配置有沒有語法錯誤。5. 啟動 MySQL 與 systemd 管理讓它像正規服務一樣工作5.1 手動啟停與后臺運行配置和初始化都到位后第一件事是手動啟動一次確認整個鏈路沒問題/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --usermysql 表示后臺運行。啟動后看進程是否存活ps -ef | grep mysqld或者直接嘗試用客戶端連接/usr/local/mysql/bin/mysql -uroot -S /data/mysql/mysql.sock如果返回了 MySQL 的歡迎界面說明安裝基本成功。但這只是臨時啟動進程在系統重啟之后會消失。要把 MySQL 變成開機自啟的服務需要寫 systemd 服務文件。5.2 編寫并啟用 mysqld.service8.0 的安裝包里自帶了一份 systemd 服務文件在/usr/local/mysql/support-files/mysql.server這是舊版的 SysV 風格腳本。我強烈建議不要直接用這個而是按照 systemd 的方式自己寫一個管理起來更順手。創建服務文件vim /etc/systemd/system/mysqld.service內容如下[Unit] DescriptionMySQL Server 8.0 Documentationhttps://dev.mysql.com/doc/refman/8.0/en/ Afternetwork.target Aftersyslog.target [Install] WantedBymulti-user.target [Service] Usermysql Groupmysql Typeforking PIDFile/data/mysql/mysqld.pid ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --daemonize --pid-file/data/mysql/mysqld.pid ExecReload/bin/kill -s HUP $MAINPID ExecStop/bin/kill -s TERM $MAINPID Restarton-failure RestartSec10 PrivateTmpfalse幾個關鍵點解釋一下。Typeforking表示 mysqld 啟動后會 fork 出一個守護進程systemd 靠 PID 文件來追蹤主進程。所以pid-file路徑必須和 my.cnf 里一致。ExecStart中必須加--daemonize否則 systemd 會因為進程沒退出而認為啟動掛起。Restarton-failure是個保險進程異常退出時能自動重啟避免數據庫服務因為一次崩潰就長時間不可用。配置好后重新加載并啟動systemctl daemon-reload systemctl start mysqld systemctl enable mysqldenable是為了設置開機自啟。最后檢查狀態systemctl status mysqld看到active (running)就是正常了。5.3 用一個快速腳本驗證服務健康在正式投入使用之前我還習慣用腳本快速驗證一下服務是否真的能正常服務客戶端連接。寫一個最簡單的腳本#!/bin/bash # MySQL 健康檢查腳本 MYSQL_USERroot MYSQL_PASSWORDyourpassword MYSQL_SOCKET/data/mysql/mysql.sock MYSQL/usr/local/mysql/bin/mysql if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -S $MYSQL_SOCKET -e SELECT 1 /dev/null 21; then echo MySQL is healthy else echo MySQL is DOWN exit 1 fi把它放進 crontab 里每分鐘執行一次數據庫出問題的時候能在第一時間收到告警。當然你也可以用更完善的監控系統但小項目、個人服務器用這個腳本足夠了。6. 安全配置與客戶端連接新裝的數據庫必須做這幾步6.1 登錄并修改 root 密碼如果你用--initialize-insecure初始化的那么現在 root 密碼為空做安全配置的第一步就是設置密碼。先用 socket 方式登錄mysql -uroot -S /data/mysql/mysql.sock然后執行ALTER USER rootlocalhost IDENTIFIED BY 你的強密碼; FLUSH PRIVILEGES;密碼建議至少 12 位包含大小寫字母、數字和特殊字符。不要用 root 這個用戶名之外還要設置一個同名的遠程賬號后面會說為什么。6.2 創建專用賬號而不是裸奔 root我見過太多人圖省事直接用 root 連應用。這是非常危險的習慣。應用的數據庫賬號應該遵循最小權限原則只給它需要的庫和表的權限。常規做法是為業務單獨建用戶CREATE USER app_userlocalhost IDENTIFIED BY app_password; CREATE USER app_user192.168.1.% IDENTIFIED BY app_password; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO app_userlocalhost; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO app_user192.168.1.%; FLUSH PRIVILEGES;這里192.168.1.%表示只允許來自這個網段的主機連接比%全放開的限制強得多。如果應用在另一臺服務器上把網段改成實際的內網網段。對外網開放 MySQL 端口是火坑除非有嚴格的安全組規則把關否則不建議做。6.3 遠程連接時的常見坑root 不允許遠程、端口沒開很多人在本地用 Navicat 連服務器上的 MySQL連不上就認為是 MySQL 的問題。實際上一半的“連不上”不是 MySQL 的鍋。排查順序應該是檢查 MySQL 是否允許遠程連接。MySQL 8.0 默認 root 只允許localhost連接需要確認你的賬號 host 是不是%或者你的 IP 網段。檢查防火墻是否開放了 3306 端口firewall-cmd --list-ports # CentOS 7 iptables -L -n | grep 3306 # 傳統方式如果沒有放行執行firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload檢查程序監聽地址。MySQL 8.0 默認綁定*也就是所有網卡一般沒問題。但如果你的 my.cnf 里設置了bind-address 127.0.0.1那對不起外部怎么都連不上。需要多網卡時也可以綁定具體 IP。本地客戶端連接時確認 socket 文件和 TCP 連接別混用。Navicat 或 DBeaver 這類圖形工具走的是 TCP不要填 socket 路徑。7. 常見問題與排查技巧實錄這一節是我最想分享的因為每種報錯基本都對應著之前某個配置環節沒做對。我按報錯信息給你列一個速查表。報錯信息原因解決辦法./mysqld: error while loading shared libraries: libaio.so.1缺少 libaio 依賴庫安裝 libaio/libaio1 后重試Cant open the mysql.plugin table數據目錄損壞或初始化不完整刪除 datadir 下內容重新初始化The server quit without updating PID filePID 文件無法寫入或 datadir 權限錯誤檢查/data/mysql的屬主和權限Access denied for user rootlocalhostroot 密碼錯誤用--skip-grant-tables跳過授權表重置密碼Cant connect to local MySQL server through socket /tmp/mysql.sockclient 和 server 的 socket 路徑不一致檢查 my.cnf 中 [client] 和 [mysqld] 的 socket 配置Table xxx doesnt exist但表明明存在表名大小寫敏感問題在 my.cnf 中設置lower_case_table_names 1啟動時提示[ERROR] [MY-010237] Cant start server: Bind on TCP/IP port端口被占用lsof -i:3306或ss -lntp | grep 3306找到占用進程7.1 密碼忘了怎么重置這是所有 DBA 實操中一定會遇到的場景。某天你發現 root 密碼記不清了應用連不上庫又不能貿然重啟服務這時可以用跳過授權表的方式登錄。# 停止服務 systemctl stop mysqld # 以跳過授權表的方式啟動 /usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --skip-grant-tables --skip-networking 跳過授權表后不需要密碼就能登錄mysql -uroot -S /data/mysql/mysql.sock注意登錄后要刷新授權表讓內存中的 grant 表生效FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密碼;然后退出把剛才手動起在后臺的 mysqld 進程殺干凈再通過 systemd 正常啟動。pkill mysqld systemctl start mysqld--skip-networking一定要加這意味著 MySQL 進程只允許本機 socket 連接不允許任何 TCP 連接防止在恢復期間被外部訪問這是一個隱藏的安全開關。7.2 端口被占用的排查思路有時候啟動失敗看日志發現是 bind 端口失敗這時候不要只盯著 MySQL 本身。先用ss -lntp | grep 3306看看 3306 端口上到底是誰。經常會出現一個情況舊版本的 mysqld 進程沒殺干凈或者之前手動啟動過多個實例兩個進程同時爭搶一個端口。這些殘留進程用ps -ef | grep mysqld一查就能發現kill -9干掉之后重新啟動。還有一種情況是其他服務恰好用了 3306 這個端口比如有些業務自己寫的小程序默認也在 3306。這時候要么改 MySQL 端口要么改那個程序的端口。優先改程序端口因為改 MySQL 端口意味著所有應用的連接串都要改牽連太大。7.3 數據目錄初始化失敗后怎么安全重來初始化失敗最大的敵人是“殘留”。如果你第一次初始化失敗直接第二次去執行往往還是失敗因為上一次初始化生成的半成品文件污染了目錄。我重來的步驟是systemctl stop mysqld 2/dev/null rm -rf /data/mysql/* chown -R mysql:mysql /data/mysql/清空數據目錄之后重新初始化/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure --usermysql這一步配合查看錯誤日志的方式基本能定位所有初始化問題。7.4 磁盤空間不足導致啟動失敗的隱蔽問題有一類問題大家很容易忽視——磁盤空間不足。MySQL 啟動時要寫 pid 文件、寫日志、初始化 buffer pool如果磁盤滿了會報一些匪夷所思的錯誤比如Segmentation fault或者Cant create/write to file。用df -h看一下分區使用率另外用du -sh /data/mysql/*查看哪個目錄在快速膨脹。日志文件是最大的嫌疑所以前面特意講了 logrotate 配置。另一個容易被忽視的膨脹源是 binlog二進制日志如果不控制 expire_logs_days 或 binlog_expire_logs_seconds時間一長磁盤會被拖垮。mysql 8.0 可以通過 SQL 直接設置SET GLOBAL binlog_expire_logs_seconds 604800; -- 7天并把配置寫進 my.cnf 里防止重啟后失效。8. 安裝完成之后我還建議你做的幾件事到這里MySQL 已經能正常跑起來了。但安裝一個數據庫只是第一步把它“收拾利索”才算完成。我建議你在安裝完成后把這幾件事也做了備份/etc/my.cnf和初始化配置的 SQL 腳本放到 git 倉庫或者至少打包存一份。新裝服務器的時候可以直接復用省得從頭配一遍。設置好 binlog 的過期時間和備份策略。哪怕是最簡單的mysqldump腳本也要讓數據有個保底。我見過太多開發機沒有備份某天數據誤刪了連哭都找不到地方。修改 MySQL 的歡迎語或版本提示信息減少被外部掃描工具識別的風險。在/data/mysql下留一個readme.txt記錄這個實例是什么時候裝的、配置了什么、改過哪些密碼密碼寫在單獨的文件里并做好權限控制方便下次接手的人快速了解情況。最后說一個我自己的使用習慣。每次裝完 MySQL 之后我都會額外設置一個自定義配置文件片段放在/etc/mysql/mysql.conf.d/下面專門存放一些臨時調優的參數。比如連接數不夠了、緩存大小需要調整直接在這個新文件里修改不影響主配置文件。這樣主配置始終保持著最小化排查問題的時候不用在幾百行配置里翻找。安裝數據庫不是一個高頻操作但每一次都值得認真對待。把流程吃透把每一步為什么要那么做搞清楚比單純記住命令要可靠得多。