MySQL 由于 InnoDB 表太多而启动失败?

MySQL 由于 InnoDB 表太多而启动失败?

我有大约 6000 个 InnoDB 表,分布在 15 个数据库中,并且使用 表 1. innodb_file_per_table,我发现每次重新启动 Ubuntu 服务器时,MySQL 都无法启动,并出现错误。

Version: '5.1.56-rel12.7-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Percona Server (GPL), 12.7, Revision 224)
111106  5:09:00  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 ./db1/tbl182.ibd
InnoDB: File operation call: 'open'.

由于有问题的表(即 tbl182.ibd)的文件名每次都不一样,所以我怀疑是不是因为 MySQL 对所有表做了什么?

然而,当我使用命令(sudo /etc/init.d/mysql restart)重新启动时,MySQL 可以成功启动。这很奇怪!

我的环境:MySQL 版本:5.1.56-rel12.7-log(Ubuntu 10.04 LTS + Percona)

更新

通过删除大量表解决了问题,因此它应该与文件限制有关,而不是权限。

我已经将 /etc/init.d/mysql 更改为硬编码值ulimit -n 50000,当我创建大量表格时仍然没有帮助。

答案1

问题不在于文件句柄的限制。那应该是错误 24,而不是 13。问题在于它所说的内容:权限。我已经见过几十次了,即使人们认为一切都设置正确并具有正确的权限,但每次都是权限问题,而且总有人会发现他们错过了什么 :) 要么是权限设置错误,要么是出现了以下情况:

  • 更高级别的目录设置了奇怪的权限,例如 / 受到限制。(这有时很重要。)
  • 您有另一个进程(例如 mysqld 的两个实例)正在运行并干扰权限。
  • SELinux 或 AppArmor 正在干扰。

您通过删除大量表“解决”了该问题——我认为这并不是真正的解决方案。您可能只是删除了一些设置了错误权限的表 :)

答案2

我建议您检查数据库文件所在目录中数据库用户的写权限。

答案3

这是 AppArmor 的问题吗?可能是在您重新启动和尝试手动启动之间,AppArmor 被启动或终止。

大约在同一时间检查您的系统日志。

相关内容