/var/lib/mysql)容量不足,需遷移至大容量掛載點/var/run/mysqld 符合 FHS 標準| 組件 | 啟動參數 | 符號鏈接 | 推薦方式 |
|---|---|---|---|
| 整個數據目錄 (datadir) | ✅ --datadir=/new/path | ✅ | 啟動參數(明確、可攜帶) |
| 單個數據庫目錄 | ❌ | ✅ | 符號鏈接(僅支持) |
| 單個表 (含 .ibd) | ❌ | ✅ (MySQL 5.6+ DATA DIRECTORY) | 5.6+ 用 DATA DIRECTORY,舊版用符號鏈接 |
| PID 文件 | ✅ --pid-file=/path/mysqld.pid | ❌ | 啟動參數 |
| 一般查詢日志 | ✅ --general-log-file=/path/log | ❌ | 啟動參數 |
| 錯誤日志 | ✅ --log-error=/path/error.log | ❌ | 啟動參數 |
| 慢查詢日志 | ✅ --slow-query-log-file=/path/slow.log | ❌ | 啟動參數 |
| Binlog | ✅ --log-bin=/path/binlog | ❌ | 啟動參數 |
| InnoDB Redo Log | ✅ innodb_log_group_home_dir | ❌ | 配置文件參數 |
| InnoDB 表空間 | ✅ innodb_data_home_dir, innodb_data_file_path | ❌ | 配置文件參數 |
my.cnf
[mysqld]
# 核心數據目錄
datadir = /data/mysql/data
# 日志文件
log-error = /data/mysql/logs/error.log
slow-query-log-file = /data/mysql/logs/slow.log
general-log-file = /data/mysql/logs/general.log
log-bin = /data/mysql/binlog/mysql-bin
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
# InnoDB 專用
innodb_data_home_dir = /data/mysql/data
innodb_log_group_home_dir = /data/mysql/redolog
innodb_undo_directory = /data/mysql/undolog # 5.7+ 獨立 Undo 表空間
# 1. 停止服務
systemctl stop mysqld
# 2. 創建新目錄結構並設置權限
mkdir -p /data/mysql/{data,logs,binlog,redolog,undolog}
chown -R mysql:mysql /data/mysql
# 3. 同步數據(保留屬性、權限、軟鏈接)
rsync -av /var/lib/mysql/ /data/mysql/data/
# 4. 修改配置文件指向新路徑
vim /etc/my.cnf # 更新上述參數
# 5. 清理舊目錄(備份後)
mv /var/lib/mysql /var/lib/mysql.bak.$(date +%F)
# 6. 啟動驗證
systemctl start mysqld
mysql -e "SHOW VARIABLES LIKE 'datadir'; SELECT @@log_bin, @@slow_query_log_file;"
# 停止服務
systemctl stop mysqld
# 移動目標目錄
mv /var/lib/mysql/db1 /data/mysql/db1
# 創建符號鏈接(MySQL 數據目錄下)
ln -s /data/mysql/db1 /var/lib/mysql/db1
# 啟動服務
systemctl start mysqld
⚠️ 符號鏈接限制:
--symbolic-links=0),需顯式啟用ibdata1) **不支持** 符號鏈接mklink /D 創建目錄連接點MySQL 5.6+ 支持 DATA DIRECTORY 子句,無需符號鏈接:
-- 建表時指定
CREATE TABLE t1 (id INT PRIMARY KEY)
DATA DIRECTORY = '/data/mysql/tables/t1';
-- 遷移現有表(5.7+ 線上 DDL)
ALTER TABLE t1 DATA DIRECTORY = '/data/mysql/tables/t1';
-- 實際執行:複製 .ibd 到新路徑,更新元數據,原子切換
適用於將熱點大表遷移至 NVMe/SSD,冷表留 HDD 的分級存儲架構。
# 實例 1:3306
[mysqld3306]
datadir = /data/mysql3306/data
port = 3306
socket = /var/run/mysqld3306.sock
pid-file = /var/run/mysqld3306.pid
log-error = /data/mysql3306/logs/error.log
log-bin = /data/mysql3306/binlog/binlog
# 實例 2:3307
[mysqld3307]
datadir = /data/mysql3307/data
port = 3307
socket = /var/run/mysqld3307.sock
pid-file = /var/run/mysqld3307.pid
log-error = /data/mysql3307/logs/error.log
log-bin = /data/mysql3307/binlog/binlog
# 啟動
mysqld --defaults-file=/etc/my.cnf --defaults-group-suffix=3306 &
mysqld --defaults-file=/etc/my.cnf --defaults-group-suffix=3307 &
mysql:mysql,權限 750 (目錄) / 640 (文件)semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?")tmpdir 指向大分區(tmpdir = /data/mysql/tmp)mysql-bin.index) 遷移後路徑失效,**建議配置絕對路徑**ANALYZE TABLE 更新統計信息df -h 確認新分區空間增長符合預期**啟動參數法** 是現代 MySQL 重定位的標準方式,配置清晰、工具兼容、易於自動化部署。**符號鏈接法** 僅作為舊版本或單庫/單表微調的補充。規劃目錄結構時,遵循「數據、日志、臨時、備份」四分離原則,配合 LVM/RAID/NVMe 分級存儲,構建高性能、可運維的存儲拓撲。