mysqld使用--skip-grant-tables選項啟動后,端口為“0”解決辦法


注意:全篇基於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”問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM