重新定位数据目录后 mysql 无法启动

重新定位数据目录后 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更改了 的访问权限。/web/dbs/mysqlrwxrwxrwx

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

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

更新:
更多信息:
我使用以下命令重试了所有操作:

  • 我关闭了服务器stop mysql
  • 我删除了旧数据rm -r /web/dbs/mysql
  • 我复制使用cp -p -r /var/lib/mysql/ /web/dbs/
  • 我将 my.cnf 中的 datadir 设置为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

因此数据目录设置正确。mysql 用户具有写权限,但 mysql 进程无法创建文件。

可能出了什么问题?

答案1

为了完整性,我们在评论中添加了解决方案作为完整答案......

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

一些 Linux 发行版(如果不是全部?)现在都附带 AppArmor,它限制了可执行文件可以访问的文件/文件夹。

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

答案2

如果没有 AppArmor,请搜索 selinux,因为在大多数基于 rpm 的 Linux 上,您都会看到 selinux。只需将其禁用即可。

#setenforce 0
#getenforce

Getenforce 命令将给予您许可。

相关内容