適用場景
- 開發/測試環境需隔離多版本或多專案資料庫。
- 單伺服器資源充足(記憶體 8GB+、多核 CPU)。
- 避免 Docker/虛擬機開銷,追求原生效能。
部署前提
- OS: Windows Server 2003 / 2008 / 2012 / 2016 / 2019 / 10 / 11
- MySQL 5.5 / 5.6 / 5.7 / 8.0(二進位免安裝版或 MSI 安裝版均可)
- 管理員權限
步驟總覽
- 正常安裝第一個實例(預設埠 3306、資料目錄
C:\ProgramData\MySQL\MySQL Server 5.5\data)。
- 停止第一個服務:
net stop MySQL 或服務管理器。
- 複製整個 MySQL 安裝目錄到新位置(如
E:\MySQL\MySQL Server 5.5)。
- 建立第二個實例專用
my.ini,修改關鍵路徑與埠號。
- 註冊 Windows 服務(
mysqld --install)。
- 修正註冊表
ImagePath 指向正確 my.ini。
- 啟動第二個服務,驗證連線。
關鍵配置檔(E:\MySQL\mysql_base\ini\my.ini)
[client]
port=3307
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
port=3307
basedir="E:/MySQL/MySQL Server 5.5/"
datadir="E:/MySQL/MySQL Server 5.5/data/"
socket=MySQL2
# 效能基礎調整
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
innodb_flush_log_at_trx_commit=2
innodb_flush_method=unbuffered # Windows 建議
max_connections=200
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# 避免與第一實例衝突
tmpdir="E:/MySQL/MySQL Server 5.5/tmp/"
log-error="E:/MySQL/MySQL Server 5.5/logs/error.log"
slow-query-log-file="E:/MySQL/MySQL Server 5.5/logs/slow.log"
服務註冊與註冊表修正
REM 1. 以管理員身分執行 CMD
cd /d "E:\MySQL\MySQL Server 5.5\bin"
REM 2. 註冊服務(指定預設檔路徑)
mysqld --install MySQL2 --defaults-file="E:\MySQL\mysql_base\ini\my.ini"
REM 3. 修正註冊表 ImagePath(關鍵步驟,否則服務啟動讀取預設 my.ini 導致路徑錯誤)
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\MySQL2" \
/v ImagePath /t REG_EXPAND_SZ \
/d "\"E:\MySQL\MySQL Server 5.5\bin\mysqld\" --defaults-file=\"E:\MySQL\mysql_base\ini\my.ini\" MySQL2" /f
REM 4. 啟動服務
net start MySQL2
REM 5. 驗證連線
mysql -uroot -p -P3307 -h127.0.0.1
常見坑與解決
| 現象 | 原因 | 解決 |
| 服務啟動即停止 | ImagePath 未指定 --defaults-file,讀取預設 my.ini 導致 datadir 錯誤 | 按上述 REG ADD 修正 |
| 連線報錯 Can't connect to MySQL server | 防火牆攔截 3307;或 bind-address 限制 | 開放埠;my.ini 設 bind-address=0.0.0.0 |
| 資料目錄初始化失敗 | datadir 非空或權限不足 | 確保目錄空、SYSTEM/Administrators 完全控制 |
| 字元集亂碼 | 兩實例 character-set-server 不一致 | 統一設 utf8mb4 |
多實例管理腳本(PowerShell)
# start-mysql.ps1 -InstanceName MySQL2
param([string]$InstanceName='MySQL2')
$svc = Get-Service $InstanceName -ErrorAction SilentlyContinue
if ($svc -and $svc.Status -ne 'Running') { Start-Service $InstanceName }
elseif (-not $svc) { Write-Error "Service $InstanceName not found" }
else { Write-Host "$InstanceName already running" }
資源隔離建議
- 記憶體:兩實例
innodb_buffer_pool_size 總和 ≤ 物理記憶體 70%。
- CPU:MySQL 5.7+ 支援
innodb_numa_interleave,或用 Windows 工作管理器設定處理器親和性。
- 磁碟:兩實例資料目錄放不同實體磁碟/RAID 陣列,避免 I/O 爭用。
- 備份:分不同時段排程,避免
mysqldump 併發衝擊。