快速提示:
在wsl2下,不允许在外部使用root来登录mysql,所以必须使用非root的帐号来登录
所以,如果明白如何做了,下面的步骤就不必看了。
下面是,给小白用户的教程:
步骤 1: 首先,使用 WSL 命令行,并检查wsl2下安装的情况:
你可以直接使用 WSL 终端来管理和查看 MySQL 服务。这包括启动 WSL、连接到 MySQL、启动或停止 MySQL 服务等。
- 打开 WSL:
- 打开命令提示符或 PowerShell,输入
wsl
回车,或直接打开你的 WSL 终端。
c:\windows>wsl
- 检查 MySQL 服务状态:
sudo service mysql status
得到类似如下信息:
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2024-04-23 11:46:41 CST; 2h 56min ago
Process: 258229 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, stat>
Main PID: 258237 (mysqld)
Status: "Server is operational"
Tasks: 40 (limit: 9453)
Memory: 406.6M
CGroup: /system.slice/mysql.service
└─258237 /usr/sbin/mysqld
Apr 23 11:46:41 hdh-macbookpro2 systemd[1]: Starting MySQL Community Server...
Apr 23 11:46:41 hdh-macbookpro2 systemd[1]: Started MySQL Community Server.
lines 1-13/13 (END)
说明mysql server 已正确启动
提示:**启动/停止 MySQL 服务**:
sudo service mysql start # 启动 MySQL
sudo service mysql stop # 停止 MySQL
sudo service mysql restart # 重启 MySQL
- 尝试在wsl2中,使用mysql 登录 mysql service:
使用root
用户登录到你的 MySQL 服务器。
mysql -u root -p
输入root帐号对应的密码,回车,如果出现下面的信息,说明登录成功
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 45
Server version: 8.0.36-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
步骤 2:更改mysql service 的配置信息,以支持从外部访问:
-
修改 MySQL 配置文件,以监听所有地址:
- 在 WSL 中编辑 MySQL 的配置文件
my.cnf
(通常/etc/mysql/mysql.conf.d/mysqld.cnf
),找到bind-address
参数,并设置为0.0.0.0
,对mysqlx-bind-address参数,相同设置为0.0.0.0
:[mysqld] bind-address = 0.0.0.0 mysqlx-bind-address = 0.0.0.0
- 保存文件并退出编辑器。
- 在 WSL 中编辑 MySQL 的配置文件
-
重启 MySQL 服务:
sudo service mysql restart
步骤3: 为mysql service创建一个新的非root用户
创建一个新的 MySQL 用户并允许该用户从 Windows 主机连接到 WSL2 中的 MySQL 实例,需要在 WSL2 的 MySQL 服务中进行操作。以下是在 MySQL 中创建新用户并授权的步骤:
-
在 WSL2 中打开终端。
-
连接到 MySQL:
执行以下命令以使用root
用户登录到 MySQL。mysql -u root -p
输入
root
用户的密码。 -
创建新用户:
使用以下 SQL 命令创建一个新用户。将newusername
和newpassword
分别替换为你希望设定的用户名和密码。
注意:mysql的密码策略可能要求你,大小写与非字母混合,否则创建失败
CREATE USER 'newusername'@'%' IDENTIFIED BY 'newpassword';
这里
@'%'
表示新用户可以从任何 IP 地址连接到 MySQL 服务器。 -
授予权限:
为新用户授予必要的权限。下面的命令授予所有数据库的所有权限,但在实际情况中,你应根据需要授予适当的权限。GRANT ALL PRIVILEGES ON *.* TO 'newusername'@'%' WITH GRANT OPTION;
使用
GRANT
语句可以具体地授予特定的数据库和表的权限。 -
刷新权限:
使权限更改立即生效。FLUSH PRIVILEGES;
-
退出 MySQL:
exit;
步骤4: 从宿主window中,使用mysql客户端工具连接
-
从 Windows 主机连接:
在 Windows 中,打开命令提示符或 PowerShell,使用新创建的用户信息尝试连接到 WSL2 中的 MySQL。假设 WSL2 的 IP 地址为172.20.10.2
,则命令如下:mysql -u newusername@localhost -p
输入新用户的密码。
正常情况,你已经能正确登录
其它技巧与知识:
1) mysql密码丢失,如何修改
方法一:在wsl下,可以使用 MySQL 客户端免密登录时:
-
启动 MySQL 客户端:
mysql
如登录成功
-
在 MySQL 提示符下,运行
ALTER USER
命令来更改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
将
newpassword
替换为您想要的新密码。 -
刷新权限并退出:
FLUSH PRIVILEGES; exit;
方法二:在wsl下,无法访问当前密码
如果您忘记了当前的 root 密码,您需要以无密码模式启动 MySQL 服务来重置密码。按照以下步骤进行:
-
停止正在运行的 MySQL 服务(如果已启动):
sudo service mysql stop
-
启动 MySQL 服务,跳过权限表:
sudo mysqld_safe --skip-grant-tables &
-
现在您可以登录到 MySQL 服务器而不需要密码:
mysql -u root
-
使用以下 SQL 命令重置 root 密码:
USE mysql; UPDATE user SET authentication_string=PASSWORD('newpassword') WHERE User='root'; FLUSH PRIVILEGES; exit;
-
重启 MySQL 服务:
sudo service mysql restart
请根据您的 MySQL 版本替换相应的密码字段,较新版本的 MySQL 可能使用 authentication_string
而不是 password
字段。
2) 查看mysql 内的所有数据库
在 MySQL 中查看当前所有数据库是一个常见的操作,可以通过 MySQL 命令行界面轻松完成。如果你已经有了对 MySQL 的访问权限,可以按照以下步骤查看所有的数据库列表:
步骤 1: 登录到 MySQL
mysql -u username -p
这里 username
是你的 MySQL 用户名。在运行该命令后,系统会提示你输入密码。确保使用具有足够权限的用户账号登录。
步骤 2: 查看数据库列表
成功登录到 MySQL 后,使用以下 SQL 命令列出所有数据库:
SHOW DATABASES;
此命令会显示 MySQL 服务器上所有的数据库名称。你将能看到类似下面的输出:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| your_database_name |
+--------------------+
这个列表包括所有你有权限查看的数据库。information_schema
, mysql
, performance_schema
, 和 sys
是 MySQL 默认的系统数据库,用于存储服务器运行时的元数据和信息。
3) 查看mysql当前登录帐号
在 Windows Subsystem for Linux (WSL) 中运行的 MySQL 实例中查询当前登录账户的信息可以通过几种方法来完成。通常,我们使用 SQL 命令来查询当前用户的信息。以下是几个查询当前登录账户的 SQL 命令:
方法 1: 使用 USER() 和 CURRENT_USER() 函数
在 MySQL 中,USER()
和 CURRENT_USER()
是两个非常有用的函数,可以帮助你识别当前的用户会话。
-
USER()
函数 返回当前 MySQL 会话的用户名和主机名,格式为 ‘user_name@host_name’。这显示的是用于连接 MySQL 服务器的用户。 -
CURRENT_USER()
函数 返回被授予连接权限的 MySQL 账户。在有些情况下,这可能与USER()
返回的值不同,尤其是在权限代理的情况下。
打开你的 WSL 终端,连接到 MySQL,并执行以下命令:
SELECT USER() AS user, CURRENT_USER() AS current_user;
这将显示当前会话的登录用户名以及该会话被授权的用户名。
方法 2: 使用系统变量
你还可以查询系统变量来获得当前用户信息:
SELECT @@session.user;
这个命令将返回当前会话的用户名称和主机,类似于 USER()
函数。
示例过程
-
打开 WSL 终端:
打开 Windows 的开始菜单,搜索 “WSL” 并打开它。 -
连接到 MySQL:
使用下面的命令连接到 MySQL 服务器。替换<username>
为你的 MySQL 用户名。mysql -u <username> -p
系统会提示你输入密码。
-
执行查询命令:
在 MySQL 提示符下,输入前面提到的 SQL 查询命令之一。SELECT USER() AS user, CURRENT_USER() AS current_user;
-
查看结果:
MySQL 将返回当前登录的用户信息和被授予权限的用户信息。
使用这些方法,你可以轻松地在 WSL 上运行的 MySQL 中识别当前登录的用户账户。这对于进行安全审核、监控或仅仅是验证当前会话的权限非常有用。
4) 查看wsl下的ip地址
由于 WSL2 使用与 Windows 主机不同的 IP 地址
ip addr show eth0
5) 查看 网络打开的端口,是否存在3306
- 在wsl控制台内查看
使用 netstat -antp,得到
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 258237/mysqld
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 437/redis-server 12
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 483/sshd: /usr/sbin
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 115/systemd-resolve
tcp 0 0 0.0.0.0:33060 0.0.0.0:* LISTEN 258237/mysqld
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 257510/php
tcp 0 0 127.0.0.1:3306 127.0.0.1:46986 ESTABLISHED 258237/mysqld
tcp 0 0 127.0.0.1:46986 127.0.0.1:3306 ESTABLISHED -
tcp 0 0 127.0.0.1:33060 127.0.0.1:43738 ESTABLISHED 258237/mysqld
tcp 0 0 127.0.0.1:32844 127.0.0.1:3306 ESTABLISHED -
tcp 0 0 127.0.0.1:3306 127.0.0.1:32844 ESTABLISHED 258237/mysqld
tcp 0 0 127.0.0.1:43738 127.0.0.1:33060 ESTABLISHED -
tcp6 0 0 ::1:6379 :::* LISTEN 437/redis-server 12
tcp6 0 0 :::80 :::* LISTEN 495/apache2
tcp6 0 0 :::22 :::* LISTEN 483/sshd: /usr/sbin
发现,wsl中,已正确打开了 0.0.0.0:3306 端口,此外,33060也打开了
2. **在宿主机的控制台内查看**
使用 netstat -atn,得到
活动连接
协议 本地地址 外部地址 状态 卸载状态
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING InHost
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING InHost
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING InHost
TCP 0.0.0.0:5040 0.0.0.0:0 LISTENING InHost
TCP 0.0.0.0:5357 0.0.0.0:0 LISTENING InHost
TCP 0.0.0.0:54950 0.0.0.0:0 LISTENING InHost
TCP 127.0.0.1:22 0.0.0.0:0 LISTENING InHost
TCP 127.0.0.1:3306 0.0.0.0:0 LISTENING InHost
TCP 127.0.0.1:3306 127.0.0.1:50899 ESTABLISHED InHost
TCP 127.0.0.1:3306 127.0.0.1:52787 ESTABLISHED InHost
TCP 127.0.0.1:4000 0.0.0.0:0 LISTENING InHost
TCP 127.0.0.1:4000 127.0.0.1:64648 ESTABLISHED InHost
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING InHost
TCP 127.0.0.1:8680 0.0.0.0:0 LISTENING InHost
TCP 127.0.0.1:33060 0.0.0.0:0 LISTENING InHost
TCP 127.0.0.1:33060 127.0.0.1:52760 ESTABLISHED InHost
TCP 127.0.0.1:49214 127.0.0.1:49215 ESTABLISHED InHost
TCP 127.0.0.1:64648 127.0.0.1:4000 ESTABLISHED InHost
TCP 127.0.0.1:65123 0.0.0.0:0 LISTENING InHost
TCP 172.22.240.1:139 0.0.0.0:0 LISTENING InHost
TCP 172.24.16.1:139 0.0.0.0:0 LISTENING InHost
TCP 192.168.167.29:139 0.0.0.0:0 LISTENING InHost
TCP 192.168.167.29:52611 157.148.61.140:80 ESTABLISHED InHost
TCP 192.168.167.29:52742 210.61.249.41:443 CLOSE_WAIT InHost
TCP 192.168.167.29:60676 183.47.121.90:80 CLOSE_WAIT InHost
TCP 0.0.0.0:49215 0.0.0.0:0 BOUND InHost
同样发现,在host主机中,已正确打开了 127.0.0.1:3306 端口,此外,33060也打开了
- 在宿主机使用 telnet 检查mysql端口打开的情况
在cmd下,
telnet localhost 3306
得到,以下信息
[
8.0.36-0ubuntu0.22.04.1.0b.93P0l7Ds
PVNLcaching_sha2_password
说明端口是打开的,否则,检查 宿主机与wsl2内的防火墙是否正确添加。