You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu20.04配置MySQL报ERROR1045访问拒绝问题排查

问题原因
  • Ubuntu 20.04官方源提供的MySQL 8.0版本,安装完成后root@localhost用户默认使用auth_socket认证插件,该插件仅校验当前操作系统登录用户是否为系统root,不校验MySQL层面设置的密码。执行mysql_secure_installation时直接为root用户设置密码,但没有同步修改认证插件为密码认证模式,会导致认证逻辑不匹配,无论是否输入密码、输入的密码是否正确,都会抛出ERROR 1045错误。
  • 重置密码时使用的systemctl set-environment MYSQLD_OPTS方法,在Ubuntu打包的MySQL版本中不生效。该版本的systemd服务单元默认不会加载用户手动设置的MYSQLD_OPTS环境变量,配置的--skip-grant-tables --skip-networking参数根本没有被mysqld进程读取,跳过权限表的逻辑未生效,因此无密码登录依然会被拒绝。
修复步骤
  1. 彻底停止MySQL服务,清理残留进程
    执行命令停止服务:
    sudo systemctl stop mysql.service
    执行命令确认服务已完全停止:
    sudo systemctl is-active mysql.service
    如果返回值不是inactive,直接强制杀死所有mysqld残留进程:
    sudo pkill -9 mysqld

  2. 手动启动MySQL到跳过权限校验模式
    不要通过systemd传参,直接手动启动mysqld进程,加载跳过权限表、禁止网络连接的参数:
    sudo mysqld --skip-grant-tables --skip-networking &
    等待2-3秒让进程完成初始化。

  3. 无密码登录MySQL并重置root认证配置
    执行以下命令直接登录root账户,此时不需要输入密码:
    sudo mysql -u root
    登录成功进入MySQL shell后,首先重载权限表:

    FLUSH PRIVILEGES;
    

    接下来根据使用习惯二选一配置root账户的认证方式:

    • 方式一:密码认证(适配远程连接、第三方工具连接场景),执行以下SQL,将你的自定义root密码替换为实际要使用的密码:
      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的自定义root密码';
      
    • 方式二:保持系统默认的socket认证(本地sudo登录无需输密码,安全性更高),执行以下SQL:
      ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
      

    配置完成后退出MySQL shell:

    exit
    
  4. 恢复MySQL正常启动模式
    杀死之前手动启动的mysqld进程:
    sudo pkill mysqld
    等待2秒后,通过systemd正常启动MySQL服务:
    sudo systemctl start mysql.service

登录验证
  • 如果选择了密码认证方式,执行sudo mysql -u root -p,输入之前设置的密码即可正常登录。
  • 如果选择了socket认证方式,直接执行sudo mysql即可无密码登录。

注意:后续在Debian/Ubuntu系系统上操作MySQL服务时,不要依赖systemctl set-environment MYSQLD_OPTS的方式传启动参数,该方法仅适用于RHEL/CentOS系的官方MySQL包,Ubuntu/Debian打包的MySQL不会读取该环境变量。

内容的提问来源于stack exchange,提问作者Santhosh Dhaipule Chandrakanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:24:25