mysql启动失败怎么办_mysql启动日志排查

2次阅读

mysql启动失败时应先查看错误日志(Error log),默认路径包括/var/log/mysql/error.log、/var/log/mysqld.log或数据目录下的hostname.err,可通过grep -i “log_error”查找配置确认。

mysql启动失败怎么办_mysql启动日志排查

MySQL 启动失败时,先看哪个日志文件

默认情况下,MySQL 启动失败不会直接报错到终端,而是把关键信息写进错误日志(error log)。这个文件位置取决于配置,常见路径有:/var/log/mysql/error.log/var/log/mysqld.log/usr/local/mysql/data/hostname.err。如果不确定,查 my.cnflog_error 的值:

grep -i "log_error" /etc/my.cnf /etc/mysql/my.cnf /usr/my.cnf 2>/dev/null

。找不到配置项时,MySQL 通常会 fallback 到数据目录下的 hostname.err 文件。

常见 error log 报错及对应处理

打开日志后,重点盯以下几类错误行:

  • Can't start server: Bind on TCP/IP port: Address already in use:端口被占,用 lsof -i :3306netstat -tuln | grep :3306 查进程,杀掉或改 my.cnf 中的 port
  • InnoDB: Unable to lock ./ibdata1 error: 11:文件被其他 mysqld 进程锁住,确认无残留进程(ps aux | grep mysql),再删 ibdata1 前务必确认没在运行且已备份
  • Unknown/unsupported storage engine: InnoDBmy.cnf 里误加了 skip-innodb 或引擎插件未加载,注释掉相关行,或检查 plugin_dir 路径是否正确
  • table 'mysql.plugin' doesn't exist:数据目录不完整,可能是初始化没做或误删系统表,需用 mysqld --initialize --user=mysql --datadir=/path/to/data 重初始化(注意:这会清空原有数据)

mysqld_safe 和 mysqld 启动方式差异影响排查

很多系统用 mysqld_safe 包装启动,它会自动重启崩溃的 mysqld,反而掩盖真实错误。临时绕过它直接运行 mysqld 更利于定位问题:

  • 停服务:systemctl stop mysqlservice mysqld stop
  • 手动启动并前台输出:mysqld --user=mysql --datadir=/var/lib/mysql --basedir=/usr --console(路径按实际调整)
  • 此时所有错误直接打印到终端,包括配置语法错误(如 my.cnf 中多了一个逗号)、权限拒绝(chown -R mysql:mysql /var/lib/mysql 常漏)

SElinux 或 AppArmor 拦截导致静默失败

Linux 发行版如 centos/RHEL 默认启用 SELinux,ubuntu/debian 可能启用了 AppArmor,它们可能阻止 mysqld 访问数据目录或 socket 文件,但 error log 里往往只显示“Permission denied”,不提安全模块。

  • 临时禁用测试:setenforce 0(SELinux)或 sudo systemctl stop apparmor
  • 若禁用后启动成功,说明是策略问题,不要长期关闭,应生成对应策略:ausearch -c 'mysqld' --raw | audit2allow -M mypolicy,再 semodule -i mypolicy.pp
  • 检查上下文:ls -Z /var/lib/mysql,正确应为 system_u:object_r:mysqld_db_t:s0

MySQL 启动失败真正卡点,往往不在配置语法本身,而在权限、端口、文件锁、安全模块这些“看不见的依赖”上。日志里一行 Permission denied 可能背后是 SELinux、用户组归属、或挂载选项(如 noexec)三者之一,得逐层排除。

text=ZqhQzanResources