Fork me on GitHub
Suzf  Blog

Mysql Warning Can't create test file xxx.lower-test

在 Ubuntu 中 使用 apt-get  安装的Mysql. 打算换一下 数据目录,初始化数据的时候却遇到下面错误。数据目录可读可写, mysql 配置文件也已经更新。初始化数据综总是失败。
# cat /etc/mysql/my.cnf | grep datadir
#datadir        = /var/lib/mysql
datadir        = /data/mysql-drbd
# ll /data/| grep mysql
drwxr-xr-x  5 mysql mysql 4096 Jun 28 16:05 mysql-drbd/
#mysql_install_db --user=mysql --datadir=/data/mysql-drbd/
...
160628 15:50:21 [Note] /usr/sbin/mysqld (mysqld 5.5.49-0ubuntu0.14.04.1) starting as process 8813 ...
160628 15:50:21 [Warning] Can't create test file /data/mysql-drbd/eva.lower-test
160628 15:50:21 [Warning] Can't create test file /data/mysql-drbd/eva.lower-test
...
曾经初学的时候 被 selinux 坑了无数回。 默认  Ubuntu selinux 是不安装的。 setenforce 0 临时关闭 因为这里没有 安装 selinux 所以直接略过。 目录权限正确 selinux 也没开。 究竟是什么比 selinux 还坑。 借助 Google 很快得到了答案 AppArmor。 某度百科是这样说的
AppArmor是一个高效和易于使用的Linux系统安全应用程序。AppArmor对操作系统和应用程序所受到的威胁进行从内到外的保护,甚至是未被发现的0day漏洞和未知的应用程序漏洞所导致的攻击。AppArmor安全策略可以完全定义个别应用程序可以访问的系统资源与各自的特权。AppArmor包含大量的默认策略,它将先进的静态分析和基于学习的工具结合起来,AppArmor甚至可以使非常复杂的应用可以使用在很短的时间内应用成功。
它也对mysql所能使用的目录权限做了限制 在 /etc/apparmor.d/usr.sbin.mysqld 这个文件中
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
将新的数据目录 追加到后面
# grep data -B 2 /etc/apparmor.d/usr.sbin.mysqld
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /data/mysql-drbd/ r,
  /data/mysql-drbd/** rwk,
这里一定要设置 和初始 数据目录一样的权限, 否则你很有可能得到下面的错误
$perror 13
OS error code  13:  Permission denied
确定配置文件正确之后,重启 apparmor。
service apparmor restart
如果 Mysql 还不能成功启动  请检查 mysql 数据目录是否正确配置 [rwx, apparmor] ~ END ~