有时候我们需要迁移Mysql的数据存储目录, 网上有很多类似的教程,具体的不赘述。 但是我们在迁移的时候,经常会碰到迁移之后,mysql无法正常启动, 查看启动日志发现报了 “errno:13  ”的错误, 对照错误表,我们能够知道这个其实是一个权限的问题。

但是就像很多教程中所写的那样,我们在迁移mysql的数据目录之后,已经执行了操作  

chrown -R mysql.myql 

那么为什么已经修改了权限,仍旧会报错,不能正常启动呢。

其实Ubuntu下默认安装了并存在一个AppArmor的服务,这个服务是用于访问控制的。在以apt-get安装mysql时,在AppArmor的配置中也写入了针对mysql的权限控制的配置,导致mysqld_safe与mysqld进程无法读写新移植的datadir目录中的文件,也同样导致了mysql_install_db无法在对应的mysql schema下创建文件。

所以相应的, 我们只需要修改对应的配置文件,然后重新写加载AppArmor就可以了。我们通过

vi /etc/apparmor.d/usr.sbin.mysqld

然后修改mysql部分中,将原来的数据目录替换成迁移后的新目录

#/var/lib/mysql/ r,
#/var/lib/mysql/** rwk,
/data/mysql_data/ r,
/data/mysql_data/** rwk,

然后重新加载AppArmor

/etc/init.d/apparmor reload

之后再重新启动mysql服务就可以了。