艺仔咕咕机 發表於 2025-12-29 23:38:00

MySQL客户端连接MySQL8.x出现"错误码2058"(Windows环境)

<p>MySQL客户端登录 MySQL8 时,出现如下登录问题:</p>
<p><img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229204624419-2080287248.png"></p>
<p><strong>原由</strong><br>
从 MySQL 8.0.4 开始,MySQL 默认身份验证插件从 <code>mysql_native_password</code>改为 <code>caching_sha2_password</code> 。相应地,<code>libmysqlclient</code> 也使用 <code>caching_sha2_password</code> 作为默认的身份验证机制。</p>
<p>在这之前 MySQL 5.6/5.7 使用的默认密码插件是 <code>mysql_native_password</code>。<code>mysql_native_password</code> 的特点是不需要加密的连接。该插件验证速度特别快,但是不够安全,因为,<code>mysql_native_password</code> 使用的是于 SHA1 算法,NIST(美国国家标准与技术研究院)在很早之前就已建议停止使用 SHA1 算法,因为 SHA1 和其他哈希算法(例如 MD5)容易被破解。</p>
<p>其实从 MySQL 5.6 开始就引入了更安全的认证机制:<code>ha256_password</code> 认证插件。它使用一个加盐密码(salted password)进行多轮 SHA256 哈希(数千轮哈希,暴力破解更难),以确保哈希值转换更安全。但是,建立安全连接和多轮 hash 加密很耗费时间。虽然安全性更高,但是验证速度不够快。</p>
<p>MySQL 试图结合二者的优点。于是在 MySQL-8.0.3引入了一个新的身份验证插件 <code>caching_sha2_password</code> ,作为<code>sha256_password</code>的代替方案,在<code>sha256_password</code> 的基础上进行了改进补上了短板,既解决安全性问题又解决性能问题。与此同时 <code>sha256_password</code>将退出时代的浪潮。MySQL 预计在未来版本中将其删除。使用 <code>sha256_password</code> 进行身份验证的 MySQL 账户建议转为 <code>caching_sha2_password</code>。</p>
<p>所以,当你使用旧版MySQL客户端连接MySQL8服务时,由于旧版客户端不支持该插件,导致连接失败。下面是解决该问题的方案。</p>
<h4 id="解决方案">解决方案</h4>
<h5 id="方案1更新mysql客户端推荐">方案1:更新MySQL客户端(推荐)</h5>
<p>升级支持MySQL8.x身份认证插件<code>caching_sha2_password</code>的MySQL客户端。</p>
<h5 id="方案2修改用户认证插件">方案2:修改用户认证插件</h5>
<p>要解决这个问题,可以将 MySQL 数据库用户的认证插件修改为 <code>mysql_native_password</code>。</p>
<ol>
<li>使用cmd登录MySQL</li>
</ol>
<pre><code class="language-cmd"># 登录MySQL
C:\Users\lenovo&gt;mysql -u root -P 3306 -h localhost -p
</code></pre>
<ol start="2">
<li>查看当前用户的认证插件</li>
</ol>
<pre><code class="language-sql"># 查看root用户的认证插件
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
</code></pre>
<ol start="3">
<li>修改已创建用户密码和身份认证插件</li>
</ol>
<pre><code class="language-sql"># 修改`root`@`localhost`用户的密码和身份认证插件
# 语法如下:
# ALTER USER 'your_username'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';

mysql&gt; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
</code></pre>
<blockquote>
<p><strong>说明:</strong><br>
your_username 是你连接的 MySQL 用户名<br>
your_password 是你该用户的登录密码<br>
'%' 表示允许任意主机访问该用户<br>
'localhsot' 表示访问本地用户</p>
</blockquote>
<p><img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229214207009-162544397.png"></p>
<ol start="4">
<li>创建新用户并使用 <code>mysql_native_password</code> 插件<br>
如果你不想修改已有用户,也可以创建一个新用户并指定使用兼容插件:</li>
</ol>
<pre><code class="language-sql">mysql&gt; CREATE USER 'sql_user'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

# 授予指定用户的所有数据库的所有权限
mysql&gt; GRANT ALL PRIVILEGES ON *.* TO 'username'@'host' WITH GRANT OPTION;

# 授予特定数据库的所有权限
mysql&gt; GRANT ALL PRIVILEGES ON `database_name`.* TO 'username'@'host' WITH GRANT OPTION;

# 授予特定表的权限
mysql&gt; GRANT ALL PRIVILEGES ON `database_name`.`table_name` TO 'username'@'host' WITH GRANT OPTION;

</code></pre>
<blockquote>
<p>说明:<br>
这里,<code>username</code> 是用户名,<code>host</code> 是用户可以从哪个主机连接(例如 <code>localhost</code> 或 <code>%</code> 表示任何主机)。<br>
<code>WITH GRANT OPTION</code> 允许该用户将他们拥有的权限授予其他用户。<br>
<code>database_name</code> 是数据库的名称。</p>
</blockquote>
<ol start="5">
<li>撤销权限</li>
</ol>
<pre><code class="language-sql">mysql&gt; REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'host';
</code></pre>
<ol start="6">
<li>刷新权限<br>
不管是更新或撤销身份验证权限,一定要刷新权限,使其生效。</li>
</ol>
<pre><code class="language-sql">mysql&gt; FLUSH PRIVILEGES;
</code></pre>
<h4 id="方案3修改-mysql-配置文件可选">方案3:修改 MySQL 配置文件(可选)</h4>
<p>如果您希望所有新用户默认使用 <code>mysql_native_password</code> 插件,可以修改 MySQL 的配置文件<code>my.ini</code>来设置默认插件为 <code>mysql_native_password</code>:</p>
<ol>
<li>打开 MySQL 配置文件。文件所在位置 C:\ProgramData\MySQL\MySQL Server X.Y\my.ini。</li>
<li>在 部分下添加或修改以下行:</li>
</ol>
<pre><code class="language-txt">
default-authentication-plugin=mysql_native_password
</code></pre>
<ol start="3">
<li>保存文件并重启 MySQL 服务以应用更改:</li>
</ol>
<pre><code class="language-cmd">net stop MySQL &amp;&amp; net start MySQL
</code></pre>
<h4 id="使用方案2可能出现的问题">使用方案2可能出现的问题</h4>
<p>修改用户密码和加密规则时会出现如下问题:</p>
<p><img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229211136295-1779824877.png"></p>
<p>原因是:<code>mysql_native_password</code> 插件(模式)在新版本中被弃用了,新插件为<code>caching sha2 password</code>,需要启用一下旧插件。</p>
<ol>
<li>检查插件是否已安装<br>
首先,你需要确认 <code>mysql_native_password</code> 插件是否已经安装在服务器上。你可以通过以下 SQL 命令查看所有已安装的插件:</li>
</ol>
<pre><code class="language-sql">mysql&gt; SHOW PLUGINS;
</code></pre>
<p>查找 <code>Name: mysql_native_password</code> 的行,看它的 Status 是否为 ACTIVE。如果不是,你需要启用它。此时可以看到如下图没有启动插件:<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229211807720-108618283.png"></p>
<ol start="2">
<li>启动插件<br>
如果插件未激活,需要将插件状态改为【ACTIVE】;<br>
先打开my.ini文件,在下面添加如下:</li>
</ol>
<pre><code class="language-txt">
mysql_native_password=ON
</code></pre>
<ol start="3">
<li>重启MySQL服务<br>
在安装或启用插件后,重新启动 MySQL 服务以确保更改生效。这可以通过以下命令完成(具体命令取决于你的操作系统):</li>
</ol>
<pre><code class="language-cmd">net stop MySQL &amp;&amp; net start MySQL
</code></pre>
<ol start="4">
<li>验证更改<br>
重新启动服务后,再次运行<code>SHOW PLUGINS;</code> 命令,检查 <code>mysql_native_password</code> 的状态是否为 <code>ACTIVE</code>。<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229225841819-1824213060.png"></li>
</ol><br><br>
来源:https://www.cnblogs.com/lisong0626/p/19418251
頁: [1]
查看完整版本: MySQL客户端连接MySQL8.x出现"错误码2058"(Windows环境)