errno 11 是 eagain,表示资源暂时不可用,根本原因是文件锁竞争,即另一个 mysqld 进程已独占锁定 ibdata1;需先排查残留进程、pid 文件和 inode 耗尽,再检查 selinux 或只读挂载。

为什么 error: 11 不是磁盘满或权限错?
这个错误日志里写的 error: 11 看起来像“空间不足”,但 Linux 下 errno 11 实际是 EAGAIN(资源暂时不可用),对应文件锁竞争——不是磁盘满了,也不是 chmod 没设对。InnoDB 在启动时调用 flock() 尝试独占锁定 ibdata1,失败就报这个错。真正原因几乎总是:另一个 mysqld 进程已经打开了这个文件。
怎么快速确认是不是有残留 mysqld 进程?
别只看 systemctl status mysqld,它可能显示 inactive,但实际还有进程挂着。执行这两条命令:
-
ps aux | grep mysqld | grep -v grep—— 查所有疑似 mysqld 的进程,尤其注意不同用户(如 root、mysql)启的、带--defaults-file或自定义--datadir的实例 -
lsof -p $(cat /var/run/mysqld/mysqld.pid 2>/dev/null) 2>/dev/null | grep ibdata1—— 如果 pid 文件还存在,直接查它是否真在用ibdata1
常见陷阱:Docker 容器没删干净、mysqld_safe 启动后崩溃但子进程没退出、手动用 mysqld --datadir=... 启过测试实例却忘了关。
my.cnf 配置哪些项必须唯一?
多实例共存时,光改 port 和 socket 不够。以下路径类配置必须各自独立,否则仍会抢 ibdata1:
-
datadir—— 必须指向不同目录,不能只是子目录嵌套(比如/var/lib/mysql和/var/lib/mysql/instance2仍可能冲突) -
innodb_data_home_dir和innodb_data_file_path—— 如果显式设置,也要隔离;默认值.表示相对datadir,所以只要datadir隔离了,通常不用额外设 -
tmpdir—— 多实例共用同一tmpdir可能导致临时表空间文件冲突,建议设为实例专属路径,如/var/lib/mysql/tmp1/ -
innodb_temp_data_file_path—— 默认是ibtmp1,放在datadir下;如果多个实例共享datadir(绝对禁止),这个参数也得改
Kubernetes 场景下,volumeClaimTemplates 必须启用,否则 StatefulSet 多副本会挂同一个 PVC,必然报错。
SELinux 或文件系统只读会触发这个错误吗?
会,但表现不同:SELinux 拒绝时,dmesg | tail 通常能看到 avc denied 日志;文件系统只读则 MySQL 启动初期就会卡在 open() 阶段,报错更早(如 errno: 30)。但它们都可能导致 ibdata1 锁定失败,因为 InnoDB 无法完成初始化流程。排查顺序应该是:
- 先杀进程、清 pid 文件、确认无残留
- 再检查
mount | grep $(dirname /var/lib/mysql)是否 ro - 最后测 SELinux:
sudo setenforce 0后重启 mysqld,若成功,再用semanage fcontext修复上下文
真正容易被忽略的是:ibdata1 所在分区 inode 耗尽(df -i),也会让 flock() 失败并返回 errno 11 —— 这个比磁盘满更隐蔽,务必一起查。











