mysql 把数据库移动到/data/mysql目录
要将 MySQL 的数据目录(datadir)从默认位置(通常是 /var/lib/mysql)安全迁移到 /data/mysql,请严格按照以下步骤操作。此方法适用于 Ubuntu/Debian/CentOS 等 Linux 系统 + MySQL 5.7 / 8.0+。
⚠️ 重要前提:
你有 root 权限
/data 分区有足够空间
操作前务必备份数据库!
✅ 完整迁移步骤
🔒 第 1 步:停止 MySQL 服务
Bash
sudo systemctl stop mysql
# 或
sudo systemctl stop mysqld
确认已停止:
Bash
sudo systemctl status mysql
📦 第 2 步:复制现有数据到新位置(保留权限)
Bash
# 创建目标目录
sudo mkdir -p /data/mysql
# 复制所有数据(-a 保留权限、属主、时间等)
sudo rsync -av /var/lib/mysql/ /data/mysql/
# 或使用 cp(确保保留属性)
# sudo cp -ar /var/lib/mysql/* /data/mysql/
💡 推荐用 rsync,更安全可靠。
👮 第 3 步:修改目录权限
Bash
sudo chown -R mysql:mysql /data/mysql
sudo chmod 750 /data/mysql
✅ MySQL 进程必须对 /data/mysql 有读写权限。
📝 第 4 步:修改 MySQL 配置文件
编辑配置文件(路径可能因系统而异):
Bash
# Ubuntu/Debian 通常在这里
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# CentOS/RHEL 可能在
# sudo nano /etc/my.cnf
找到 [mysqld] 段落,修改或添加:
Ini
[mysqld]
datadir = /data/mysql
socket = /data/mysql/mysql.sock
⚠️ 同时建议修改 socket 路径,避免旧 socket 文件冲突。
🔧 第 5 步:更新 AppArmor(仅 Ubuntu/Debian)
Ubuntu 使用 AppArmor 限制 MySQL 访问路径,需更新策略:
Bash
sudo nano /etc/apparmor.d/usr.sbin.mysqld
找到类似行:
Apparmor
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
添加新路径:
Apparmor
/data/mysql/ r,
/data/mysql/** rwk,
然后重新加载 AppArmor:
Bash
sudo systemctl reload apparmor
# 或
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
❌ 如果跳过此步,MySQL 会因权限拒绝而启动失败!
🔄 第 6 步:更新 systemd socket(可选但推荐)
如果使用 socket 连接,建议让 systemd 知道新 socket 位置:
编辑 service 文件(不推荐直接改,而是 override):
Bash
sudo systemctl edit mysql
添加(防止与 systemd 冲突):
Ini
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld –datadir=/data/mysql
大多数情况下只需改配置文件即可,此步可省略。
▶️ 第 7 步:启动 MySQL 并验证
Bash
sudo systemctl start mysql
sudo systemctl status mysql # 确认 active (running)
检查是否使用新目录:
Bash
sudo mysql -e “SHOW VARIABLES LIKE ‘datadir’;”
预期输出:
Text
+—————+————–+
| Variable_name | Value |
+—————+————–+
| datadir | /data/mysql/ |
+—————+————–+
🧪 第 8 步:测试数据库功能
Bash
mysql -u root -p -e “SHOW DATABASES;”
确保所有数据库和表正常访问。
🗑️ 第 9 步:清理旧数据(确认无误后)
Bash
# 先保留几天备份
sudo mv /var/lib/mysql /var/lib/mysql.bak
# 确认系统稳定运行一周后,再删除
# sudo rm -rf /var/lib/mysql.bak
❌ 常见错误 & 解决
错误 原因 解决
Can’t start server: Bind on unix socket socket 目录权限或路径错 检查 /data/mysql 权限,确保 mysql 用户可写
Permission denied (AppArmor) AppArmor 未放行 /data/mysql 更新 /etc/apparmor.d/usr.sbin.mysqld
启动成功但连不上 客户端仍找旧 socket 在 [client] 段加 socket = /data/mysql/mysql.sock,或用 -S /data/mysql/mysql.sock 连接
💡 额外建议
在 /etc/mysql/mysql.conf.d/client.cnf 中也指定 socket,方便命令行连接:
Ini
[client]
socket = /data/mysql/mysql.sock
如果使用 PHP/Python 等应用,确保它们也使用新 socket 或 TCP 连接(127.0.0.1 而非 localhost)。
完成以上步骤后,你的 MySQL 数据就安全迁移到 /data/mysql 了!

