如何把ubuntu 22.04下安装的mysql 8 的 数据目录迁移到另一个磁盘目录

在 Ubuntu 22.04 上迁移 MySQL 8 的数据目录到另一个磁盘,一般可以分为 停库 → 拷贝数据 → 修改配置 → 改权限 → 启动验证 这几个步骤。

我给你一个详细且可回滚的方案(不会直接覆盖旧数据,确保安全)。


1. 检查 MySQL 数据目录位置

默认在 /var/lib/mysql

bash 复制代码
sudo systemctl status mysql
# 或
sudo mysql -e "SHOW VARIABLES LIKE 'datadir';"

2. 停止 MySQL 服务

bash 复制代码
sudo systemctl stop mysql

确保停掉后,ps -ef | grep mysql 没有残留的 mysqld 进程。


3. 拷贝数据到新磁盘目录

假设你要迁移到 /mnt/data/mysql(新磁盘已经挂载好并有足够空间):

bash 复制代码
# 创建新目录
sudo mkdir -p /mnt/data/mysql
sudo chown mysql:mysql /mnt/data/mysql
sudo chmod 750 /mnt/data/mysql

# 使用 rsync 保持权限和软链接
sudo rsync -av --progress /var/lib/mysql/ /mnt/data/mysql/

注意

  • rsync 的末尾 / 不能省,否则会多一层 mysql 目录。
  • -a 会保留所有权限和时间戳。

4. 修改 MySQL 配置

MySQL 8 在 Ubuntu 22.04 下通常用 mysqld.cnf

bash 复制代码
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到:

复制代码
datadir = /var/lib/mysql

改成:

复制代码
datadir = /mnt/data/mysql

如果 MySQL 使用了 socket 文件路径(socket=/var/run/mysqld/mysqld.sock),一般不用改,但如果你的新磁盘不在 /var/run,就要确保 socket 目录权限正确。


5. 更新 AppArmor 配置(Ubuntu 特有)

Ubuntu 默认用 AppArmor 限制 MySQL 访问路径,你需要给新目录放行。

编辑:

bash 复制代码
sudo nano /etc/apparmor.d/usr.sbin.mysqld

找到类似:

复制代码
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,

在下面加:

复制代码
/mnt/data/mysql/ r,
/mnt/data/mysql/** rwk,

保存后重载 AppArmor:

bash 复制代码
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

6. 权限确认

bash 复制代码
sudo chown -R mysql:mysql /mnt/data/mysql
sudo chmod 750 /mnt/data/mysql

7. 启动 MySQL

bash 复制代码
sudo systemctl start mysql

检查是否正常:

bash 复制代码
sudo systemctl status mysql
sudo mysql -e "SELECT @@datadir;"

8. 验证无误后删除旧目录

bash 复制代码
sudo mv /var/lib/mysql /var/lib/mysql.bak   # 先备份
# 等一两天确认没问题再删除
sudo rm -rf /var/lib/mysql.bak

可能的坑

  1. 忘记更新 AppArmor → MySQL 启动报错"Permission denied"。
  2. 权限不对mysqld 无法访问目录。
  3. SELinux(CentOS)的问题 → Ubuntu 默认没有 SELinux,所以不用处理。
  4. socket 路径问题 → 迁移后客户端连接失败,需要确认 /var/run/mysqld 存在并有 mysql:mysql 权限。

如果你愿意,我可以帮你写一个 一键迁移脚本 ,执行后会自动完成拷贝、改配置、更新 AppArmor、验证,并且支持回滚到原目录。

这样就不用担心操作出错。

相关推荐
xuyanqiangCode1 分钟前
Ubuntu二进制安装Apache Doris(2.1版本)
linux·ubuntu·apache
q***498621 分钟前
MySQL数据的增删改查(一)
android·javascript·mysql
q***06479 小时前
MySQL的UPDATE(更新数据)详解
数据库·mysql
8***B9 小时前
MySQL性能
数据库·mysql
Warren9811 小时前
Python自动化测试全栈面试
服务器·网络·数据库·mysql·ubuntu·面试·职场和发展
HIT_Weston11 小时前
39、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(二)
linux·前端·ubuntu
kka杰12 小时前
MYSQL 表的增删查改-更新/删除
数据库·mysql
。puppy13 小时前
MySQL 远程登录实验:通过 IP 地址跨机器连接实战指南
android·adb
深藏bIue13 小时前
linux服务器mysql目录下的binlog文件删除
linux·服务器·mysql
甜鲸鱼13 小时前
Java与MySQL中的枚举(Enum)
java·mysql