MySQL 启动报错:InnoDB: Unable to lock ./ibdata1 error

发布于 2021-03-17 13:08:52 字数 3512 浏览 1080 评论 0

在 OS X 环境下 MySQL 启动时报错:

016-03-03T00:02:30.483037Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
2016-03-03T00:02:30.483100Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.

终端不断地重复打印上面的错误日志,从错误日志看起来似乎有另外一个 mysqld 进程占用了 ./ibdata1 文件,于是使用 ps 命令查看是否有 mysqld 进程在运行:

ps -ef |grep mysqld
   74  7711     1   0  8:04上午 ??         0:00.34 /usr/local/mysql/bin/mysqld
--user=_mysql --basedir=/usr/local/mysql
--datadir=/usr/local/mysql/data
--plugin-dir=/usr/local/mysql/lib/plugin
--log-error=/usr/local/mysql/data/mysqld.local.err
--pid-file=/usr/local/mysql/data/mysqld.local.pid

发现有一个 7711 的进程在运行,于是强制 kill 掉:

sudo kill -9 7711

再次 ps 查询:

ps -ef |grep mysqld
74  7759     1   0  8:10上午 ??         0:00.29 /usr/local/mysql/bin/mysqld
--user=_mysql --basedir=/usr/local/mysql
--datadir=/usr/local/mysql/data
--plugin-dir=/usr/local/mysql/lib/plugin
--log-error=/usr/local/mysql/data/mysqld.local.err
--pid-file=/usr/local/mysql/data/mysqld.local.pid

发现还在,只不过 pid 由原来的 7711 变成了现在的 7759,那么看看 mysqld 进程打开了哪些文件:

lsof -c mysqld

该进程没有打开任何文件,这就见鬼了。

Mac OS X, lsof only shows your own processes unless running as root with sudo

于是再次运行:

sudo lsof -c mysqld
COMMAND  PID   USER   FD     TYPE             DEVICE  SIZE/OFF    NODE NAME
mysqld  8655 _mysql  cwd      DIR                1,4       544 3090250 /usr/local/mysql/data
mysqld  8655 _mysql  txt      REG                1,4  31130736 3089789 /usr/local/mysql/bin/mysqld

的确发现有一个实实在在的mysqld进程在运行,也占用的这些mysql文件,经过一番Google大法,发现在OS X中启动MySQL跟在Linux中启动方式完全是牛马不相及,在OS X中启动/重启MySQL的正确姿势是:

sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist

此时再来看看是否还有mysqld进程:

ps -ef |grep mysqld

嗯,发现确实没有了,再来启动MySQL:

sudo launchctl load -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist

问题总算解决,但还没完,总得把原理搞清楚才行。

launchd 是什么?

launchd 是 Mac OS X 从 10.4 开始引入,用于用于初始化系统环境的关键进程,它是内核装载成功之后在 OS 环境下启动的第一个进程。传统的 Linux 会使用 /etc/rc.* 或者 /etc/init 来管理开机要启动的服务,而在 OS X 中就是使用 launchd 来管理。采用这种方式来配置启动项很简单,只需要一个 plist 文件。/Library/LaunchDaemons 目录下的 plist 文件都是系统启动后立即启动进程。使用launchctl 命令加载/卸载 plist 文件,加载配置文件后,程序启动,卸载配置文件后程序关闭。

卸载配置文件后又尝试直接用 mysqld 命令来启动mysql进程试试:

/usr/local/mysql/bin/mysqld
2016-03-03T01:35:50.359258Z 0 [ERROR] InnoDB: ./ib_logfile0 can't be opened in read-write mode.
2016-03-03T01:35:50.359283Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2016-03-03T01:35:50.670517Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2016-03-03T01:35:50.670555Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2016-03-03T01:35:50.670568Z 0 [ERROR] Failed to initialize plugins.
2016-03-03T01:35:50.670574Z 0 [ERROR] Aborting

ib_logfile0 不能被打开,猜测是用户权限文件,不能用当前系统用户启动 mysql。那么加上 sudo 看看,用 root 来启动:

2016-03-03T01:38:10.977313Z 0 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

2016-03-03T01:38:10.977339Z 0 [ERROR] Aborting

2016-03-03T01:38:10.977350Z 0 [Note] Binlog end
2016-03-03T01:38:10.977410Z 0 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete

叫我去读 MySQL 的安全手册,还是用 launchd 的方式启动吧。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

文章
评论
84963 人气
更多

推荐作者

微信用户

文章 0 评论 0

小情绪

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

笨死的猪

文章 0 评论 0

彭明超

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文