必须先查清当前datadir路径和空间瓶颈:执行select @@datadir;获真实路径,结合df -h确认分区使用率超95%且目标盘空间充足才迁移;停库后用rsync -av --delete-after --exclude='*.sock'迁移,同步更新my.cnf中socket、pid-file、log-error路径,并修复selinux上下文与mysql用户权限。

确认当前datadir位置和空间瓶颈
别猜,直接进 MySQL 查:SELECT @@datadir;。输出结果就是你当前真实的数据路径,比如 /var/lib/mysql 或 /data/mysql-8.0.20/data。同时用 df -h 看对应分区使用率——如果超过 95%,且目标盘(如 /mnt/data)剩余空间充足,迁移才有意义。
常见误区是只看 du -sh /var/lib/mysql 却忽略 LVM 或 overlayfs 层级占用;建议配合 lsof +L1 检查是否有被删除但仍被 mysqld 占用的文件句柄,这类“幽灵占用”会导致复制后启动失败。
停库后用rsync而非cp做数据迁移
cp -r 简单但风险高:不保留 socket 文件权限、不跳过已打开的临时表、不校验一致性。必须用 rsync -av --delete-after /var/lib/mysql/ /mnt/data/mysql/(注意末尾斜杠!)。
- 加
--delete-after避免新目录残留旧残留文件 - 加
--exclude='*.sock' --exclude='mysql.sock'防止迁移运行时套接字 - 迁移完立刻执行
rsync -av --checksum /var/lib/mysql/ /mnt/data/mysql/做二次校验
修改my.cnf前必须处理SELinux和权限
CentOS/RHEL 默认开启 SELinux,datadir 改到非标准路径后,mysqld 会因策略拒绝访问而报错 [ERROR] [MY-011011] Failed to find valid data directory。
两种选择:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 临时关闭:
setenforce 0(仅测试用) - 永久放行(推荐):
semanage fcontext -a -t mysqld_db_t "/mnt/data/mysql(/.*)?",再restorecon -Rv /mnt/data/mysql
权限必须是 mysql:mysql,且目录权限为 750;特别注意 /mnt/data 父目录不能是 777,否则 mysqld 拒绝启动。
启动失败时优先检查socket和pid-file路径
改了 datadir 后,常漏改配套路径,导致 systemctl start mysqld 报错:The server quit without updating PID file。
在 [mysqld] 段里必须同步更新:
socket=/mnt/data/mysql/mysql.sockpid-file=/mnt/data/mysql/mysqld.pid-
log-error=/mnt/data/mysql/error.log(若配置了)
启动前手动创建空日志文件并授权:touch /mnt/data/mysql/error.log && chown mysql:mysql /mnt/data/mysql/error.log。启动后立刻验证:mysql -S /mnt/data/mysql/mysql.sock -e "SELECT 1;"。
真正麻烦的不是复制或改配置,而是新路径下 mysqld 对文件系统特性的隐式依赖——比如 XFS 的 reflink、ext4 的 dax 模式、或挂载选项 noexec 会静默阻止 innodb 初始化。迁移前务必确认目标分区挂载参数不含 noexec、nosuid,且文件系统支持大文件和硬链接。










