mysql迁移后打不开,90%是datadir权限未对齐:需先查真实datadir路径,再递归执行chown -r mysql:mysql和chmod 750,同时检查selinux/apparmor上下文及实际生效的my.cnf路径。

MySQL迁移后打不开,90%是datadir权限没对齐——不是配置错了,是系统直接拒绝访问文件。
确认真实datadir路径和当前属主
别凭印象改/var/lib/mysql,先查MySQL实际读的是哪个目录:
- 停服务:
sudo systemctl stop mysql(或mysqld,看服务名) - 查路径:
sudo mysqld --verbose --help 2>/dev/null | grep "datadir",输出类似datadir /opt/mysql/data - 看现状:
ls -ld /opt/mysql/data和ls -l /opt/mysql/data/mysql/ | head -3,重点看第一列(属主)和第三列(属组),常见是root:root或backup:backup
必须用mysql:mysql递归重设属主
MySQL 8.0+ 启动时会校验整个datadir树的归属,只改顶层没用:
- 执行:
sudo chown -R mysql:mysql /opt/mysql/data(路径替换成你上一步查到的) - 如果系统没有
mysql用户(极少见),先创建:sudo useradd -r -s /bin/false mysql - 严禁用
root:mysql或mysql:root——InnoDB初始化阶段会卡在mysql.plugin表加载,报Can't open the mysql.plugin table
权限值必须是750,不能755也不能777
MySQL 8.0+ 对datadir权限变严格了,宽松值会直接拒绝启动:
- 设权限:
sudo chmod 750 /opt/mysql/data -
750含义:属主可读写执行、属组可读执行、其他人无任何权限 - 严禁
chmod 777——错误日志里会出现secure-file-priv警告,服务秒退 - 子目录(如
mysql/、sys/)会继承父目录权限,不用单独chmod
SELinux 或 AppArmor 开启时需额外补上下文
即使chown和chmod全对,Linux安全模块仍可能静默拦截:
- 查状态:
sestatus(CentOS/RHEL)或aa-status(Ubuntu) - SELinux启用时补上下文:
sudo chcon -R -t mysqld_db_t /opt/mysql/data - AppArmor启用时,需确保
/etc/apparmor.d/usr.sbin.mysqld里包含该路径的读写规则 - Windows用户注意:
NETWORK SERVICE账户必须有“完全控制”权限,不是当前登录用户
最容易被忽略的是配置文件加载顺序——你以为改了/etc/my.cnf,但MySQL实际读的是/www/server/mysql/my.cnf(宝塔)或~/.my.cnf(用户级),务必用mysqld --verbose --help | grep "Default options"确认生效路径。











