Windows 下將 MySQL 安裝至 D:\mysql(非默認 C:\mysql),雙擊 mysqld.exe 或啟動服務報錯:Can't find file: '.\mysql\host.frm' (errno: 2) 或服務啟動即停止。
MySQL 啟動時會讀取配置文件 my.ini (或 my.cnf) 確定 basedir (安裝根目錄) 和 datadir (數據目錄)。若配置文件缺失或路徑錯誤,服務器找不到系統表(mysql 库)而啟動失敗。
1. %WINDIR%\my.ini (C:\Windows\my.ini)
2. %WINDIR%\my.cnf
3. 安裝目錄\my.ini (D:\mysql\my.ini)
4. 安裝目錄\my.cnf
5. 基於 basedir 推導的路徑
建議:直接在 C:\Windows\my.ini (或 C:\my.ini) 創建,優先級最高,不受安裝路徑變動影響。
[mysqld]
# 基礎路徑(正斜槓或雙反斜槓均可)
basedir = D:/mysql
datadir = D:/mysql/data
# 基礎性能參數(可選)
port = 3306
default_storage_engine = InnoDB
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
# 日誌與錯誤
log_error = D:/mysql/logs/error.log
slow_query_log = 1
slow_query_log_file = D:/mysql/logs/slow.log
long_query_time = 1
# InnoDB 基礎
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
innodb_file_per_table = 1
# 以管理員身份打開 CMD
mkdir D:\mysql\data
mkdir D:\mysql\logs
mkdir D:\mysql\tmp
# 初始化數據目錄(MySQL 5.7.6+ / 8.0)
cd D:\mysql\bin
mysqld --initialize-insecure --basedir=D:\mysql --datadir=D:\mysql\data
# --initialize-insecure:生成隨機 root 密碼並寫入 .err 日志;不加 insecure 則無密碼
# 5.7.5 及更早
mysql_install_db --basedir=D:\mysql --datadir=D:\mysql\data
# 註冊服務(服務名自定)
mysqld --install MySQL_D_Drive --defaults-file=C:\Windows\my.ini
# 啟動
net start MySQL_D_Drive
# 或
sc start MySQL_D_Drive
mysql -u root -p -h 127.0.0.1 -P 3306
# 輸入初始密碼(查看 .err 日志)或直接回車(insecure 模式)
-- 修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;
| 現象 | 原因 | 解決 |
|---|---|---|
| 服務啟動後秒停 | datadir 無 mysql 系統表 | 執行 mysqld --initialize 初始化 |
Can't create test file | 數據目錄權限不足 | 確保 MySQL 服務賬號對 D:\mysql\data 有完全控制權 |
| 端口衝突 3306 | 已有 MySQL 實例運行 | netstat -ano | findstr 3306 找 PID 殺掉,或改 port=3307 |
| 配置不生效 | 讀取了錯誤的 my.ini | mysqld --help --verbose 2>&1 | findstr -i "my.ini" 確認實際讀取路徑 |
| 中文亂碼 | 字符集未統一 | 配置 character_set_server=utf8mb4,連接串加 characterEncoding=utf8 |
同機運行多個 MySQL(如 3306、3307):
[mysqld_3306]
basedir = D:/mysql_3306
datadir = D:/mysql_3306/data
port = 3306
socket = D:/mysql_3306/mysql.sock
log_error = D:/mysql_3306/logs/error.log
[mysqld_3307]
basedir = D:/mysql_3307
datadir = D:/mysql_3307/data
port = 3307
socket = D:/mysql_3307/mysql.sock
log_error = D:/mysql_3307/logs/error.log
啟動:mysqld --defaults-file=C:\Windows\my.ini --defaults-group-suffix=_3306。
非默認目錄安裝 MySQL 核心在於 「顯式指定 basedir/datadir → 初始化數據目錄 → 註冊服務指定配置文件」。將 my.ini 放在 C:\Windows\ 並寫入正確路徑,是最穩健、最不易因升級/遷移失效的做法。完成上述步驟,D 盤 MySQL 即可像 C 盤一樣穩定運行。