如何把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、验证,并且支持回滚到原目录。

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

相关推荐
yumgpkpm1 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
程序员云帆哥2 小时前
MySQL JDBC Driver URL参数配置规范
数据库·mysql·jdbc
三三木木七4 小时前
mysql拒绝连接
数据库·mysql
唐古乌梁海4 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql
꒰ঌ 安卓开发໒꒱4 小时前
Mysql 坏表修复
android·mysql·adb
野犬寒鸦5 小时前
从零起步学习MySQL || 第五章:select语句的执行过程是怎么样的?(结合源码深度解析)
java·服务器·数据库·后端·mysql·adb
一匹电信狗8 小时前
【MySQL】数据库表的操作
linux·运维·服务器·数据库·mysql·ubuntu·小程序
Cory.眼8 小时前
Monkey测试Bug排查全攻略
adb·monkey·bug排查·健壮性测试
白衣鸽子8 小时前
MySQL 时间类型深度解析:精度、时区陷阱与版本兼容
数据库·后端·mysql
冲上云霄的Jayden8 小时前
MySQL InnoDB 状态(SHOW ENGINE INNODB STATUS)深度分析与性能优化建议
数据库·mysql·性能优化·innodb