在同一台服務器存在多個 MySQL 版本(如 RPM 安裝 5.0.96、二進制安裝 5.5.39)時,mysql 命令實際調用哪個版本的客戶端,完全取決於 PATH 環境變量中目錄的順序。本文通過一個真實案例,演示問題現象、根因分析與永久修復方法。
/opt/mysql/mysql-5.5.39-linux2.6-i686/bin/mysql,通過軟鏈 /usr/local/mysql/bin/mysql 訪問。/usr/bin/mysql。/usr/local/mysql 軟鏈,預期調用 5.0.96 客戶端,實際報錯:bash: /usr/local/mysql/bin/mysql: No such file or directory。Shell 會緩存命令的完整路徑(hash 表)。當首次執行 mysql 時,Shell 按 PATH 順序查找並記錄絕對路徑。後續執行直接使用緩存路徑,不再搜索 PATH。
查看 PATH:
echo $PATH # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin
發現 /usr/local/mysql/bin 在 /usr/bin 之前。初次安裝 5.5.39 時,Shell 緩存了 /usr/local/mysql/bin/mysql。刪除軟鏈後,緩存路徑失效,但 Shell 仍嘗試調用該路徑,導致報錯。
/usr/bin/mysql(5.0.96)優先被找到,連接成功。hash -d mysql # 刪除 mysql 命令緩存 # 或 hash -r # 清除所有命令緩存
export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/local/mysql/bin:/usr/bin:/root/bin # 將期望優先的目錄前移
編輯 ~/.bash_profile(或 /etc/profile 全局生效):
# 原內容 PATH=$PATH:$HOME/bin export PATH # 修改為顯式指定優先順序 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/local/mysql/bin:/usr/bin:/root/bin export PATH
使其生效:
source ~/.bash_profile
此後無論是否重新登入,mysql 命令將按指定順序解析。需切換版本時,調整 PATH 中目錄順序並 source 即可。
ln -s /opt/mysql/mysql-5.5.39-linux2.6-i686/ /usr/local/mysql/usr/local/mysql/bin 置於 /usr/bin 之前。source ~/.bash_profile 或重新登入。mysql,\s 顯示 Ver 14.14 Distrib 5.5.39,確認生效。mysqlenv、dbenv、Docker 容器化隔離版本。/usr/local/mysql/bin/mysql,不依賴 PATH。echo $PATH | tr ':' '\n' 逐行查看優先級。hash、type -a mysql 可查看實際解析路徑。MySQL 多版本共存時,PATH 順序與 Shell 命令緩存共同決定 mysql 命令行客戶端的實際版本。問題排查關鍵在於:用 type -a mysql 查看所有可用路徑、用 hash 管理緩存、在 ~/.bash_profile 顯式固化 PATH 優先級。規範環境變量管理是多版本共存穩定運行的基石。