生產環境常需在單台伺服器運行多個 MySQL 實例(不同版本、不同業務隔離、不同端口)。本文記錄 MySQL 5.1.49 於 Fedora 12 以源碼編譯方式安裝多實例的完整流程,涵蓋編譯參數、目錄規劃、配置檔隔離、啟動腳本、系統服務註冊等關鍵步驟,並針對常見坑點(innodb 引擎缺失、my.cnf 讀取失敗、socket 衝突)給出解決方案。
mysql-5.1.49.tar.gz
tar -zxvf mysql-5.1.49.tar.gz
cd mysql-5.1.49
./configure --prefix=/test/mysql \
--with-charset=gbk \
--with-plugins=innobase \
--with-extra-charsets=all
關鍵參數:
--with-plugins=innobase:5.1+ 版本必須顯式指定,否則缺少 InnoDB 會導致 mysql_install_db 報錯--with-charset=gbk:預設字符集,生產建議 utf8mb4
make && make install
# 若重新編譯:make clean && make && make install
groupadd mysql
useradd -g mysql -s /sbin/nologin mysql
cd /test/mysql
mkdir -p var/data var/log var/run var/tmp
cp share/mysql/my-medium.cnf my.cnf
chown -R mysql:mysql var
chown -R root:mysql .
chmod 750 var
[client]
port = 3306
socket = /test/mysql/var/run/mysql3306.sock
default-character-set = utf8mb4
[mysqld]
port = 3306
socket = /test/mysql/var/run/mysql3306.sock
basedir = /test/mysql
datadir = /test/mysql/var/data
pid-file = /test/mysql/var/run/mysqld.pid
log-error = /test/mysql/var/log/error.log
slow_query_log_file = /test/mysql/var/log/slow.log
# InnoDB 專用路徑
innodb_data_home_dir = /test/mysql/var/data
innodb_data_file_path = ibdata1:100M:autoextend
innodb_log_group_home_dir = /test/mysql/var/data
innodb_log_file_size = 64M
innodb_buffer_pool_size = 128M
# 基礎優化
key_buffer_size = 32M
sort_buffer_size = 256K
read_buffer_size = 256K
thread_cache_size = 8
query_cache_type = 1
query_cache_size = 16M
max_connections = 200
/test/mysql/bin/mysql_install_db --defaults-file=/test/mysql/my.cnf --user=mysql
必須指定 --defaults-file,否則會讀取 /etc/my.cnf 導致初始化到錯誤目錄。
chown -R root:mysql /test/mysql
chown -R mysql:mysql /test/mysql/var
/test/mysql/bin/mysqld_safe --defaults-file=/test/mysql/my.cnf --user=mysql &
/test/mysql/bin/mysql -u root -S /test/mysql/var/run/mysql3306.sock --defaults-file=/test/mysql/my.cnf
cp /test/mysql/share/mysql/mysql.server /etc/init.d/mysql3306
chmod 755 /etc/init.d/mysql3306
# 修改腳本內 basedir、datadir、pid_file 指向實例路徑
chkconfig --add mysql3306
chkconfig mysql3306 on
service mysql3306 start
同源碼目錄重新配置不同 --prefix,或直接複製實例 1 目錄並修改配置:
# 複製目錄
cp -r /test/mysql /test/mysql3310
chown -R mysql:mysql /test/mysql3310
# 修改 my.cnf 關鍵差異
[client]
port = 3310
socket = /test/mysql3310/var/run/mysql3310.sock
[mysqld]
port = 3310
socket = /test/mysql3310/var/run/mysql3310.sock
basedir = /test/mysql3310
datadir = /test/mysql3310/var/data
pid-file = /test/mysql3310/var/run/mysqld.pid
# InnoDB 路徑同步修改
innodb_data_home_dir = /test/mysql3310/var/data
innodb_log_group_home_dir = /test/mysql3310/var/data
重新初始化:mysql_install_db --defaults-file=/test/mysql3310/my.cnf --user=mysql
註冊服務:cp .../mysql.server /etc/init.d/mysql3310 並修改路徑。
| 現象 | 原因 | 解決 |
|---|---|---|
mysql_install_db 報錯 unknown variable 'innodb=ON' |
未編譯 InnoDB 插件 | ./configure --with-plugins=innobase |
啟動讀取錯誤的 my.cnf |
未指定 --defaults-file |
啟動、初始化、客戶端連線皆加 --defaults-file=... |
| Socket 連線失敗 | 多實例 socket 路徑衝突 | 各實例獨立 socket = /path/to/instance.sock |
| 端口衝突 | 多實例未修改 port | 各實例獨立 port(3306、3310、3311...) |
| 資料目錄找不到 | datadir 指向錯誤或未初始化 |
檢查 my.cnf 路徑,重跑 mysql_install_db |
mysqld_multi 管理多實例(官方工具,支援統一啟停)cgroups 限制 CPU/記憶體,避免單實例佔滿資源mysqld_exporter 指定不同 --collect.global_status 端口多實例部署核心在於「五隔離」:目錄、端口、Socket、配置檔、資源。掌握源碼編譯參數與 --defaults-file 機制,即可靈活應對各種隔離部署場景。