作者:姚远
专一于 Oracle、MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6,5.7,8.0 OCP。当初鼎甲科技任技术顾问,为共事和客户提供数据库培训和技术支持服务。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
MySQL 启动失败的最常见的起因有两类,别离是无法访问系统资源和参数设置谬误造成的,上面别离剖析如下。
一、无法访问系统资源
MySQL 不能拜访启动须要的资源是造成而 MySQL 无奈启动的一个常见起因,如:文件,端口等。因为 linux 中用于启动 mysqld 过程的 mysql 用户通常是不能登陆的,能够应用相似上面的命令查看文件的拜访权限。
sudo -u mysql touch /var/lib/mysql/b
找出问题后,批改对应文件或目录的权限或属主后通常能够解决问题。但有时 mysql 用户有拜访文件和目录的权限,但依然会被回绝拜访,例如上面这个例子:
mysql> system sudo -u mysql touch /home/mysql/data/a
mysql> create table t1 (id int primary key,n varchar(10) data directory
ERROR 1030 (HY000): Got error 168 from storage engine
测试阐明 mysql 用户有这个目录的拜访权限,但创立文件还是失败,这种状况让很多人困惑,这个时候通常是 mysqld 过程的拜访被 linux 的 selinux 或 apparmor 给阻止了,大家能够看到创立的表不是在 mysql 的默认目录上面,因而 selinux 或 apparmor 的 policy 外面没有蕴含这个目录的拜访权限,此时只有对应的批改 policy 就行了,当然把 selinux 或 apparmor 停了也行。
有时尽管对系统资源有拜访的权限,但系统资源曾经被占用:
mysqld --no-defaults --console --user mysql
2020-11-03T03:36:07.519419Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 21171
2020-11-03T03:36:07.740347Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
这个故障产生的起因是另外一个 mysqld 过程曾经启动并占用了对应的文件。
二、参数设置谬误
参数设置谬误造成 MySQL 无奈启动的起因也十分常见,此时先要查看 MySQL 启动时会调用的参数,上面的命令能够查问 MySQL 启动时调用参数文件的程序:
$ mysqld --verbose --help | grep "Default options" -A 1
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
晓得了 MySQL 参数文件的调用程序,咱们就能够查看对应的参数文件,找出其中的谬误,如果感觉参数文件的可读性不强,能够应用上面的命令显示 mysqld 程序将要调用的参数:
$ mysqld --print-defaults
/usr/sbin/mysqld would have been started with the following arguments:
......
留神这个命令显示完参数后就退出,不会真正运行 mysqld。这个命令和 my_print_defaults mysqld 齐全是等价的,只不过后者的显示方式是一行一个参数。
而后开始对可疑的参数进行调试,我集体喜爱加的参数和程序如下:
- 在 mysqld 后加上第一个参数 –no-defaults,这个参数的作用是告诉 mysqld 在启动的时候不要读任何参数文件;
- 第二个参数是 –console,这个参数会把错误信息输入到屏幕上,这个参数带来的一个弊病是所有的信息都输入到屏幕上,让屏幕显得比拟乱,但对于咱们调试却是很不便的;
- 第三个参数是 –log-error-verbosity=3,这个参数会显示具体的日志;
- 而后再在前面加上有把握的参数,能够一次只加一个参数,而后启动 mysqld,采纳排除法逐渐找出谬误的参数。
看这个例子:
mysqld --no-defaults --console --log-error-verbosity=3 --user mysql --gtid_mode=on
2020-11-03T07:14:20.384223Z 0 [Note] [MY-010949] [Server] Basedir set to /usr/.
2020-11-03T07:14:20.384254Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 22617
2020-11-03T07:14:20.400221Z 0 [Note] [MY-012366] [InnoDB] Using Linux native AIO
……
2020-11-03T07:14:21.632851Z 0 [ERROR] [MY-010912] [Server] GTID_MODE = ON requires ENFORCE_GTID_CONSISTENCY = ON.
2020-11-03T07:14:21.634183Z 0 [ERROR] [MY-010119] [Server] Aborting
……
2020-11-03T07:14:23.026551Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
root@scutech:~#
看这个例子,咱们很容易晓得是须要咱们同时设置参数 GTID_MODE 和 ENFORCE_GTID_CONSISTENCY 同时为 on 才行。