MySQL skip-grant-tables修改密码后1045_密码策略与权限设置_常见原因汇总
MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)是MySQL登录时最常见的错误之一。这个错误表示使用root用户从localhost连接MySQL时,访问被拒绝,且没有使用密码(using password: NO)。原因可能是root密码错误、root用户不存在、权限表损坏、MySQL配置错误、匿名用户干扰等。本文详细讲解这个错误的原因分析和解决方法。
原因一:命令行登录时没有输入密码。直接输入mysql命令登录,默认使用当前系统用户名作为MySQL用户名,且不发送密码。如果MySQL的root用户设置了密码,直接输入mysql会提示1045 (using password: NO)。正确的登录命令是:mysql -u root -p,执行后提示输入密码,输入正确密码后登录。-u指定用户名,-p表示需要密码验证。如果密码在命令行直接输入:mysql -u root -p你的密码,注意-p和密码之间没有空格。
原因四:匿名用户干扰。MySQL中可能存在匿名用户(''@'localhost'或''@'%'),当从localhost连接时,如果用户名不匹配,会匹配到匿名用户,导致密码验证失败。使用skip-grant-tables启动后,查询并删除匿名用户:DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;。匿名用户是MySQL安装时默认创建的,用于测试,生产环境应该删除。同时确认mysql.user表中没有其他异常用户。
原因五:MySQL 8.0的密码插件问题。MySQL 8.0默认使用caching_sha2_password认证插件,而旧版本客户端使用mysql_native_password,可能导致认证失败。如果使用旧客户端连接MySQL 8.0,修改root用户的认证插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码'; FLUSH PRIVILEGES;。或者升级客户端到支持caching_sha2_password的版本。MySQL 8.0的密码字段是authentication_string,PASSWORD()函数在8.0中已废弃,使用ALTER USER修改密码更安全。
原因六:配置文件中的密码不匹配。网站程序(如WordPress、dedecms)的数据库配置文件中填写的密码与MySQL实际密码不一致,会导致1045错误。检查配置文件中的数据库密码,如WordPress的wp-config.php中的DB_PASSWORD,dedecms的data/common.inc.php中的数据库密码。确认配置文件中的密码与MySQL实际密码一致。如果修改了MySQL密码,需要同步更新所有使用该数据库的程序配置文件。同时检查配置文件中的数据库用户名、主机名、数据库名是否正确。
真实经历:网站迁移后数据库连接1045,检查配置文件密码正确,后来发现是MySQL中root用户的host是'%',没有'root'@'localhost',而程序配置的数据库主机是localhost。创建了'root'@'localhost'用户后问题解决。MySQL的用户是用户名+主机名的组合,这个细节很容易忽略。
操作提醒:重置MySQL密码时,skip-grant-tables方式启动后任何人都可以无密码登录,操作完成后立即移除配置并重启。修改密码后执行FLUSH PRIVILEGES刷新权限。MySQL 8.0使用ALTER USER修改密码,不要使用废弃的PASSWORD()函数。

更新时间:2026-08-26 21:54:57
上一篇:宝塔宝塔面板打不开_安全与备份