mysql 把数据库移动到/data/mysql目录

作者: adm 分类: mysql 发布时间: 2025-04-06

要将 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 了!

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!