关于WSL2下安装的mysql sever服务,如何在host或外部连接使用的问题

快速提示:

在wsl2下,不允许在外部使用root来登录mysql,所以必须使用非root的帐号来登录

所以,如果明白如何做了,下面的步骤就不必看了。

下面是,给小白用户的教程:

步骤 1: 首先,使用 WSL 命令行,并检查wsl2下安装的情况:

你可以直接使用 WSL 终端来管理和查看 MySQL 服务。这包括启动 WSL、连接到 MySQL、启动或停止 MySQL 服务等。

  1. 打开 WSL:
  • 打开命令提示符或 PowerShell,输入 wsl 回车,或直接打开你的 WSL 终端。
bash 复制代码
c:\windows>wsl
  1. 检查 MySQL 服务状态:
bash 复制代码
sudo service mysql status

得到类似如下信息:

bash 复制代码
● 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 服务**:
bash 复制代码
sudo service mysql start   # 启动 MySQL
sudo service mysql stop    # 停止 MySQL
sudo service mysql restart # 重启 MySQL
  1. 尝试在wsl2中,使用mysql 登录 mysql service :
    使用 root 用户登录到你的 MySQL 服务器。
bash 复制代码
 mysql -u root -p

输入root帐号对应的密码,回车,如果出现下面的信息,说明登录成功

bash 复制代码
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 的配置信息,以支持从外部访问:

  1. 修改 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:

      ini 复制代码
      [mysqld]
      bind-address = 0.0.0.0
      mysqlx-bind-address = 0.0.0.0
    • 保存文件并退出编辑器。

  2. 重启 MySQL 服务:

    bash 复制代码
    sudo service mysql restart

步骤3: 为mysql service创建一个新的非root用户

创建一个新的 MySQL 用户并允许该用户从 Windows 主机连接到 WSL2 中的 MySQL 实例,需要在 WSL2 的 MySQL 服务中进行操作。以下是在 MySQL 中创建新用户并授权的步骤:

  1. 在 WSL2 中打开终端

  2. 连接到 MySQL

    执行以下命令以使用 root 用户登录到 MySQL。

    bash 复制代码
    mysql -u root -p

    输入 root 用户的密码。

  3. 创建新用户

    使用以下 SQL 命令创建一个新用户。将 newusernamenewpassword 分别替换为你希望设定的用户名和密码。
    注意:mysql的密码策略可能要求你,大小写与非字母混合,否则创建失败

    sql 复制代码
    CREATE USER 'newusername'@'%' IDENTIFIED BY 'newpassword';

    这里 @'%' 表示新用户可以从任何 IP 地址连接到 MySQL 服务器。

  4. 授予权限

    为新用户授予必要的权限。下面的命令授予所有数据库的所有权限,但在实际情况中,你应根据需要授予适当的权限。

    sql 复制代码
    GRANT ALL PRIVILEGES ON *.* TO 'newusername'@'%' WITH GRANT OPTION;

    使用 GRANT 语句可以具体地授予特定的数据库和表的权限。

  5. 刷新权限

    使权限更改立即生效。

    sql 复制代码
    FLUSH PRIVILEGES;
  6. 退出 MySQL

    sql 复制代码
    exit;

步骤4: 从宿主window中,使用mysql客户端工具连接

  1. 从 Windows 主机连接

    在 Windows 中,打开命令提示符或 PowerShell,使用新创建的用户信息尝试连接到 WSL2 中的 MySQL。假设 WSL2 的 IP 地址为 172.20.10.2,则命令如下:

    bash 复制代码
    mysql  -u newusername@localhost -p

    输入新用户的密码。

    正常情况,你已经能正确登录

其它技巧与知识:

1) mysql密码丢失,如何修改

方法一:在wsl下,可以使用 MySQL 客户端免密登录时:

  1. 启动 MySQL 客户端:

    bash 复制代码
    mysql 

    如登录成功

  2. 在 MySQL 提示符下,运行 ALTER USER 命令来更改密码:

    sql 复制代码
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

    newpassword 替换为您想要的新密码。

  3. 刷新权限并退出:

    sql 复制代码
    FLUSH PRIVILEGES;
    exit;

方法二:在wsl下,无法访问当前密码

如果您忘记了当前的 root 密码,您需要以无密码模式启动 MySQL 服务来重置密码。按照以下步骤进行:

  1. 停止正在运行的 MySQL 服务(如果已启动):

    bash 复制代码
    sudo service mysql stop
  2. 启动 MySQL 服务,跳过权限表:

    bash 复制代码
    sudo mysqld_safe --skip-grant-tables &
  3. 现在您可以登录到 MySQL 服务器而不需要密码:

    bash 复制代码
    mysql -u root
  4. 使用以下 SQL 命令重置 root 密码:

    sql 复制代码
    USE mysql;
    UPDATE user SET authentication_string=PASSWORD('newpassword') WHERE User='root';
    FLUSH PRIVILEGES;
    exit;
  5. 重启 MySQL 服务:

    bash 复制代码
    sudo service mysql restart

请根据您的 MySQL 版本替换相应的密码字段,较新版本的 MySQL 可能使用 authentication_string 而不是 password 字段。

2) 查看mysql 内的所有数据库

在 MySQL 中查看当前所有数据库是一个常见的操作,可以通过 MySQL 命令行界面轻松完成。如果你已经有了对 MySQL 的访问权限,可以按照以下步骤查看所有的数据库列表:

步骤 1: 登录到 MySQL

bash 复制代码
mysql -u username -p

这里 username 是你的 MySQL 用户名。在运行该命令后,系统会提示你输入密码。确保使用具有足够权限的用户账号登录。

步骤 2: 查看数据库列表

成功登录到 MySQL 后,使用以下 SQL 命令列出所有数据库:

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,并执行以下命令:

sql 复制代码
SELECT USER() AS user, CURRENT_USER() AS current_user;

这将显示当前会话的登录用户名以及该会话被授权的用户名。

方法 2: 使用系统变量

你还可以查询系统变量来获得当前用户信息:

sql 复制代码
SELECT @@session.user;

这个命令将返回当前会话的用户名称和主机,类似于 USER() 函数。

示例过程

  1. 打开 WSL 终端

    打开 Windows 的开始菜单,搜索 "WSL" 并打开它。

  2. 连接到 MySQL

    使用下面的命令连接到 MySQL 服务器。替换 <username> 为你的 MySQL 用户名。

    bash 复制代码
    mysql -u <username> -p

    系统会提示你输入密码。

  3. 执行查询命令

    在 MySQL 提示符下,输入前面提到的 SQL 查询命令之一。

    sql 复制代码
    SELECT USER() AS user, CURRENT_USER() AS current_user;
  4. 查看结果

    MySQL 将返回当前登录的用户信息和被授予权限的用户信息。

使用这些方法,你可以轻松地在 WSL 上运行的 MySQL 中识别当前登录的用户账户。这对于进行安全审核、监控或仅仅是验证当前会话的权限非常有用。

4) 查看wsl下的ip地址

由于 WSL2 使用与 Windows 主机不同的 IP 地址

bash 复制代码
ip addr show eth0

5) 查看 网络打开的端口,是否存在3306

  1. 在wsl控制台内查看
    使用 netstat -antp,得到
bash 复制代码
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,得到
bash 复制代码
活动连接

协议  本地地址          外部地址        状态           卸载状态

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也打开了

  1. 在宿主机使用 telnet 检查mysql端口打开的情况

在cmd下,

bash 复制代码
telnet localhost 3306

得到,以下信息

bash 复制代码
[
 8.0.36-0ubuntu0.22.04.1.0b.93P0l7Ds

                                       PVNLcaching_sha2_password

说明端口是打开的,否则,检查 宿主机与wsl2内的防火墙是否正确添加。

相关推荐
Mike117.4 小时前
GBase 8a 日期边界写法和时间窗口取数偏差
数据库
SPC的存折6 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
透明的玻璃杯9 小时前
window环境下使用类似tail的命令跟踪滚动的日志
windows
私人珍藏库9 小时前
【windows】跨平台 Android 刷机Root工具箱
android·windows·工具·刷机·软件·多功能
MatrixOrigin10 小时前
数据库没有死,只是范式变了
数据库·oracle
羊小蜜.11 小时前
Mysql 13: 触发器全解——创建、查看、使用与注意事项
数据库·mysql·触发器
阿里加多11 小时前
第 1 章:Go 并发编程概述
java·开发语言·数据库·spring·golang
ShiJiuD66688899911 小时前
Mysql 进阶
数据库·mysql