首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 數據目錄重定位完整指南:啟動參數與符號鏈接雙模式實戰

     編輯:MySQL 資料庫相關知識

為什麼要重定位數據目錄?

  • 磁盤空間:默認分區(如 /var/lib/mysql)容量不足,需遷移至大容量掛載點
  • I/O 隔離:數據文件、Redo Log、Binlog、慢查詢日志分散至不同物理磁盤/RAID 組,消除 I/O 爭用
  • 多實例部署:單機運行多個 MySQL 實例,每實例獨立數據目錄,繞過文件描述符限制
  • 規範合規:PID 文件、Socket 文件統一放置 /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❌配置文件參數

方法一:啟動參數重定位(推薦)

1. 修改配置文件 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 表空間

2. 數據遷移標準流程


# 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

⚠️ 符號鏈接限制:

  • MySQL 8.0+ 默認禁用符號鏈接(--symbolic-links=0),需顯式啟用
  • InnoDB 共享表空間 (ibdata1) **不支持** 符號鏈接
  • Windows 下需用 mklink /D 創建目錄連接點
  • 備份工具(如 xtrabackup)可能不識別符號鏈接,導致備份不完整

InnoDB 獨立表空間(File-Per-Table)遷移單表

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 &

避坑檢查清單

  1. ✅ 新目錄擁有者 mysql:mysql,權限 750 (目錄) / 640 (文件)
  2. ✅ SELinux/AppArmor 策略允許新路徑(semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?")
  3. ✅ tmpdir 指向大分區(tmpdir = /data/mysql/tmp)
  4. ✅ 相對路徑 Binlog 索引文件 (mysql-bin.index) 遷移後路徑失效,**建議配置絕對路徑**
  5. ✅ 遷移後執行 ANALYZE TABLE 更新統計信息
  6. ✅ 監控 df -h 確認新分區空間增長符合預期

總結

**啟動參數法** 是現代 MySQL 重定位的標準方式,配置清晰、工具兼容、易於自動化部署。**符號鏈接法** 僅作為舊版本或單庫/單表微調的補充。規劃目錄結構時,遵循「數據、日志、臨時、備份」四分離原則,配合 LVM/RAID/NVMe 分級存儲,構建高性能、可運維的存儲拓撲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved