測試新版本、支援多租戶、模擬主從環境等場景常需在單機運行多個 MySQL 實例。核心原則:每個實例獨佔 TCP 埠、Unix Socket、資料目錄、設定檔、啟動腳本。
./configure \
--with-tcp-port=3307 \
--with-unix-socket=/tmp/mysql3307.sock \
--prefix=/usr/local/mysql-3307
--with-tcp-port:指定預設監聽埠。--with-unix-socket:指定預設 Socket 檔案路徑。--prefix:安裝根目錄隔離,避免二進位檔、支援檔案衝突。驗證現有實例埠與 Socket:
mysqladmin -h hostname --port=3306 variables | grep -E 'port|socket'
/path/to/mysqld_safe \
--socket=/tmp/mysql3307.sock \
--port=3307 \
--datadir=/data/mysql3307 \
--log-error=/var/log/mysql3307/error.log \
--pid-file=/var/run/mysql3307.pid \
--defaults-file=/etc/mysql/3307/my.cnf
--datadir:獨立資料目錄(嚴禁多實例共用同一 datadir,除非採用共享儲存叢集方案)。--log-error、--pid-file:避免日誌與 PID 檔衝突。--defaults-file:指定專屬設定檔,集中管理所有參數。| 方式 | 範例 |
|---|---|
| 命令列指定埠 | mysql -h 127.0.0.1 --port=3307 -u root -p |
| 命令列指定 Socket | mysql --socket=/tmp/mysql3307.sock -u root -p |
| C API / Connector | 連線參數傳遞 port、unix_socket |
| 環境變數 | export MYSQL_TCP_PORT=3307; export MYSQL_UNIX_PORT=/tmp/mysql3307.sock |
選項檔 ~/.my.cnf | [client]\nport=3307\nsocket=/tmp/mysql3307.sock |
/etc/init.d/mysql 或建立 systemd 單元 mysql@3307.service,支援 systemctl start mysql@3307。EnvironmentFile=/etc/mysql/3307/my.cnf、ExecStart=/usr/bin/mysqld --defaults-file=/etc/mysql/3307/my.cnf。嚴禁兩個實例對同一資料目錄寫入資料! 若作業系統檔案鎖定機制失效(NFS、某些虛擬化環境),將導致資料損毀、索引不一致、甚至磁碟層面損壞。多實例必須嚴格隔離
datadir。
單機多實例的核心在於「四獨立」:獨立埠、獨立 Socket、獨立資料目錄、獨立設定檔。推薦使用 mysqld_safe 運行時參數覆蓋法,配合 systemd 模板化部署,實現輕量、可維運的多實例管理。