注意:全篇基于mysql8.0 + windows10,其余版本可能略有不同,请参阅各个版本官方说明文档。

问题描述

在mysql安装过程中通过配置文件(my.ini或my.cnf)或命令行 使用--skip-grant-table选项免密登陆中,发现mysqld启动后端口为“0”,下面为启动mysqld输出:

E:\software\mysql-8.0.20-3307> bin\mysqld --console
2021-04-13T09:41:51.890231Z 0 [System] [MY-010116] [Server] E:\software\mysql-8.0.20-3307\bin\mysqld.exe (mysqld 8.0.20) starting as process 13572
2021-04-13T09:41:51.914498Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-04-13T09:41:52.778184Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-04-13T09:41:53.117237Z 0 [Warning] [MY-011311] [Server] Plugin mysqlx reported: 'All I/O interfaces are disabled, X Protocol won't be accessible'
2021-04-13T09:41:53.352061Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-04-13T09:41:53.395742Z 0 [System] [MY-010931] [Server] E:\software\mysql-8.0.20-3307\bin\mysqld.exe: ready for connections. Version: '8.0.20'  socket: ''  port: 0  MySQL Community Server - GPL.

问题排查

1、查看mysqld进程是否存在
windows命令窗口输入tasklist|findstr "mysqld",linux系统输入ps -ef|grep mysqld,输出如下:

PS E:\software\mysql-8.0.20-3307> tasklist|findstr "mysqld"
mysqld.exe                   13572 Console                    1    137,916 K

可以看到mysqld其实启动成功了。

2、接着查看配置文件(确保此配置文件生效)。

可以看到端口配置确实是3307。

3、查看使用的端口是否被监听
windows命令窗口输入netstat -aon|findstr "3307",linux系统输入netstat -lanp|grep 3306netstat -naop | grep 3306输出如下:

E:\software\mysql-8.0.20-3307> netstat -ano|findstr "3307"
E:\software\mysql-8.0.20-3307>

可以看到3307端口确实没有被监听。

4、登陆mysql确定port值
此时是免密登陆可以命令行输入mysql -u root -p,连续回车即可,linux可以通过socket文件登录成功mysql -u root -p -S /tmp/XXX.sock。

mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 0     |
+---------------+-------+
1 row in set, 1 warning (0.05 sec)

mysql>

果然 端口变成了“0”

7.查看错误日志
mysqld在启动时如果没有指定--console选项,会在数据目录生成一个.err文件。若使用--console选项,直接在控制台查看消息。
可以看到这条警告信息

Plugin mysqlx reported: 'All I/O interfaces are disabled, X Protocol won't be accessible'

意思就是:mysqlx插件报告:'所有I/O接口被禁用,X协议将无法访问'。
此时并无清晰解决办法。

由于是使用--skip-grant-table配置,导致问题,可以去官网查看此选项说明。

首先去官网查看--skip-grant-table选项介绍

| Command-Line Format | --skip-grant-tables[={OFF|ON}] |
| ------------------- 😐 ------------------------------: |
| Type | Boolean |
| Default Value | OFF |
该选项影响服务器启动顺序:

  • --skip-grant-tables导致服务器不读取mysql系统模式中的grant表,从而在不使用权限系统的情况下启动。这使得任何可以访问服务器的人都可以无限制地访问所有数据库。

    因为使用--skip-grant-tables启动服务器会禁用身份验证检查,所以在这种情况下,服务器也会通过启用skip_networking来禁用远程连接。

    为了使服务器以--skip-grant-tables启动,在运行时加载grant表,执行一个权限刷新mysql>flush privileges;操作,可以通过以下方式完成:

    • 在连接到服务器后发出一个mysql>flush privileges;语句。
    • 从命令行执行mysqladmin flush-privilegesmysqladmin reload命令。

    在启动后执行的其他操作也可能隐式地导致特权刷新,从而导致服务器使用grant表启动。例如,如果服务器在启动顺序期间执行升级,则刷新特权。

skip_networking系统变量简介:

| Command-Line Format | --skip-networking[={OFF|ON}] |
| --------------------: |----------------------------: |
| System Variable | skip_networking |
| Scope | Global |
| Dynamic | No |
| SET_VAR Hint Applies | No |
| Type | Boolean |
| Default Value | OFF |
这个变量控制服务器是否允许TCP/IP连接。默认情况下,它是被禁用的(允许tcp/ip连接)。
如果启用,服务器只允许本地(非tcp /IP)连接,所有与mysqld的交互必须使用命名管道(named pipes)或共享内存(shared memory)(在Windows上)或Unix套接字文件(socket file)(在Unix上)。对于只允许使用本地客户机的系统,强烈建议使用此选项。

因为使用--skip-grant-tables启动服务器会禁用身份验证检查,所以在这种情况下,服务器也会通过启用skip_networking来禁用远程连接。

问题解决方案:

方案一:由于此时是安装mysql,免密登陆后,也就是需要修改root账号密码,那么在端口为0的情况下,既然可以成功登陆mysql,那么进行修改root账户密码后,关闭mysql服务器,把配置文件中的--skip-grant-tables注掉重新启动即可。

方案二:关闭服务器,删除数据目录,重新初始化数据目录,但一定要使用--initialize选项生成root账号随机密码。然后启动mysql服务器

注意:既然官方文档说使用--skip-grant-tables启动服务器会禁用身份验证检查,所以在这种情况下,服务器也会通过启用skip_networking来禁用远程连接。那么是否可以在配置文件中配置skip_networking=OFF,解决端口为“0”问题?

通过测试,在配置文件以及通过命令行使用skip_networking=OFF并没有解决端口为“0”问题。

posted on 2021-04-14 14:21  哑吧  阅读(2542)  评论(1编辑  收藏  举报