我有大约 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 被启动或终止。
大约在同一时间检查您的系统日志。