重定位数据目录后,mysql不会启动

我有一个web服务器,默认安装的mysql把它所有的数据库文件放在/var/lib/mysql 。 安装/var的分区只有2GB的空间,所以在运行空间问题之后,我决定重新定位mysql的数据目录。

我的天真做法是将/var/lib/mysql目录完全复制到/web/dbs/mysql ,并更改/etc/mysql/my.cnf以便读取

 datadir = /web/dbs/mysql 

但是,重新启动后,我在mysql错误日志中得到以下错误,并且服务器将无法启动。

 130130 9:59:23 [Note] Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13) 130130 9:59:23 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 130130 9:59:23 InnoDB: Initializing buffer pool, size = 8.0M 130130 9:59:23 InnoDB: Completed initialization of buffer pool 130130 9:59:23 InnoDB: Operating system error number 13 in a file operation. InnoDB: The error means mysqld does not have the access rights to InnoDB: the directory. InnoDB: File name ./ibdata1 InnoDB: File operation call: 'open'. InnoDB: Cannot continue operation. 

所有文件和目录都属于mysql:mysql 。 为了testing,我甚至改变了/web/dbs/mysql的访问权限,现在是rwxrwxrwx

是的,/ /web/dbs/mysql/mysql/plugin.frm确实存在。

这里可能是什么问题? 我错过了什么吗? 是否有更详细的输出日志可用?

更新:
一些更多的信息:
我用以下命令重试了一切:

  • 我closures了服务器, stop mysql
  • 我删除了旧的数据rm -r /web/dbs/mysql
  • 我复制使用cp -p -r /var/lib/mysql/ /web/dbs/
  • 我将my.cnf中的datadir = /web/dbs/mysql设置为datadir = /web/dbs/mysql
  • 我重新启动了服务器。 同样的错误

特权:

 drwxr-xr-x 4 mysql mysql 34 2013-01-30 15:55 /web/dbs drwx------ 19 mysql mysql 4096 2013-01-30 15:44 /web/dbs/mysql drwx------ 2 mysql mysql 4096 2012-10-11 11:25 /web/dbs/mysql/mysql -rw-rw---- 1 mysql mysql 8586 2012-08-14 19:15 /web/dbs/mysql/mysql/plugin.frm 

当我将datadir重置为datadir = /var/lib/mysql服务器启动没有问题

试过以下几点:

 root:/# su - mysql mysql:~$ /usr/sbin/mysqld --verbose 130130 16:01:05 [Warning] Can't create test file /web/dbs/mysql/s15800994.lower-test 130130 16:01:05 [Warning] Can't create test file /web/dbs/mysql/s15800994.lower-test mysql:~$ touch /web/dbs/mysql/s15800994.lower-test mysql:~$ ls -l /web/dbs/mysql/s15800994.lower-test -rw-r--r-- 1 mysql mysql 0 2013-01-30 16:01 /web/dbs/mysql/s15800994.lower-test 

所以数据目录设置correclty。 mysql用户有写权限,但是mysql进程不能创build这些文件。

什么可能是错的?

添加解决scheme,我们来评论作为一个完整的完整答案…

使用su / sudo进行testing表明,虽然mysqld抱怨权限错误,但mysql用户确实可以成功写入该文件夹,使得清除这不是文件系统权限问题。 (如果面临类似的问题,这是一个有用的第一步)

现在,AppArmor的一些发行版本(如果不是全部的话)随之出现,它限制了可执行文件被允许访问的文件/文件夹。

在这种情况下,解决scheme是简单地将新path添加到/etc/apparmor.d/usr.sbin.mysqld策略文件。