mysql 服务器在新安装的 ubuntu 8.04 上运行。(我想将 mysql 服务器移到 KVM。KVM 本身在 ubuntu 10.04 上运行。)
/mysql 属于 mysql:mysql 并且可以访问。所有子文件也可以访问
我已经设置了/etc/security/limits.conf为以下值:
* soft nofile 65535
* hard nofile 65535
当我尝试启动时出现以下错误:
110406 10:34:45 [Warning] Could not increase number of max_open_files to more than 1024 (request: 2858)
110406 10:34:45 [Warning] Can't create test file /mysql/datadir/dbslave3.lower-test
110406 10:34:45 [Warning] Can't create test file /mysql/datadir/dbslave3.lower-test
/usr/sbin/mysqld: File '/mysql/logs/mysql-slow.log' not found (Errcode: 13)
110406 10:34:45 [ERROR] Could not use /mysql/logs/mysql-slow.log for logging (error 13). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.
/usr/sbin/mysqld: File '/mysql/logs/mysql-bin.index' not found (Errcode: 13)
110406 10:34:45 [ERROR] Aborting
110406 10:34:45 [Note] /usr/sbin/mysqld: Shutdown complete
当我进入ulimit -n 65535
并尝试启动服务器时,出现以下错误:
110406 10:41:43 [Warning] Can't create test file /mysql/datadir/dbslave3.lower-test
110406 10:41:43 [Warning] Can't create test file /mysql/datadir/dbslave3.lower-test
/usr/sbin/mysqld: File '/mysql/logs/mysql-slow.log' not found (Errcode: 13)
110406 10:41:43 [ERROR] Could not use /mysql/logs/mysql-slow.log for logging (error 13). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.
/usr/sbin/mysqld: File '/mysql/logs/mysql-bin.index' not found (Errcode: 13)
110406 10:41:43 [ERROR] Aborting
110406 10:41:43 [Note] /usr/sbin/mysqld: Shutdown complete
那么这里出了什么问题?当执行时su - mysql -s /bin/bash
,我可以创建文件并打开它们。
是不是因为我把 mysql 移到了 KVM 中?
编辑:我还将磁盘从 /dev/vda (VirtIO) 更改为 /dev/sda (IDE)。但行为仍然相同。也许这不是 KVM,只是客户机本身出了问题。
再见,
答案1
首先,在ubuntu下,有3个可以限制文件访问:
- 文件系统访问权限(但您已经说过,事实并非如此)
- ulimit nofile(但此错误消息:
Can't create test file /mysql/datadir/dbslave3.lower-test
出现在启动中,mysql 会检查您的文件系统是否区分大小写。因此 mysql 还没有创建那么多句柄!) - 装甲!(这应该是你的问题。特别是因为你已经移动了你的数据目录!)
要解决此问题,您必须/mysql/** rwk,
配置/etc/apparmor.d/usr.sbin.mysqld
答案2
我猜测这是 MySQL 子目录之一的权限或所有权问题,可能是在数据文件目录中。
错误消息显示“Errcode: 13”。您可以使用错误检查与此特定错误相关的消息并确认这确实是某处的权限错误。
shell> perror 13
error code 13: Permission denied
确保 MySQL 用户可以访问数据文件目录并在其中写入。这似乎是问题所在。
另一方面,有时日志文件会产生误导,或者不够准确。在这种情况下,斯特拉斯来救援。strace 是一个非常强大的系统跟踪器,可以监视进程进行的所有系统调用。
它的使用很简单:
strace -f -o strace.output /etc/init.d/mysql.server start
这将在名为 strace.output 的文件中打印启动 MySQL 服务器时进行的所有系统调用。
希望这可以帮助。
答案3
检查文件夹的读/写权限,大多数错误似乎是由于写入失败造成的。确保分区或磁盘不是只读模式,并且 mysql 文件夹可写。尝试使用 vi、nano/pico 创建测试文件,以尝试复制读/写问题。
答案4
在 Linux 中,限制由 PAM (pam_limits) 在登录时配置,并应用于每个进程。您有 2 个限制,一个是硬限制,另一个是软限制。进程可以更改软限制,并增加软限制,直到达到硬限制。
您可以使用以下方法找到正在运行的进程的限制:
cat /proc/<PID>/limits
要查找当前 shell 的限制,您可以使用:
ulimit -a #soft limits
ulimit -Ha #hard limits
您还可以查看strace
该过程并了解为什么打开了这么多文件描述符(可以是套接字、文件、管道......):
strace -f mysql_start_script 2> strace.log
strace -e 'open,socket,pipe,accept' -f mysql_start_script 2> strace.log # To have only the calls that generates file descriptors
在strace.log
文件中搜索open
、socket
、pipe
。
对于正在运行的进程,你可以使用以下命令查看文件描述符:
ls -l /proc/<PID>/fd
确保你有/mysql/logs/
文件夹。日志应该在里面的某个地方。/var/log/
希望能帮助到你。