配置.env后报数据库Access denied(using password:NO)如何解决
故障现象
服务运行时抛出数据库连接错误:SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)
当前使用的.env数据库配置如下:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=databasename DB_USERNAME=username DB_PASSWORD="thismypass"
已尝试的修复操作均无效:
- 已为数据库连接用户授予全部权限
- 已重置数据库用户密码
- 已新建数据库、配置全新用户用于连接
报错始终提示连接时未携带密码,无法定位故障原因。
排查修复步骤
按以下顺序逐一排查,绝大多数场景下可定位问题:
- 清除框架配置缓存
从配置格式判断使用的是Laravel类框架,这类框架会将配置编译缓存到文件中,修改.env后如果不刷新缓存,会一直使用旧的空密码配置。在项目根目录执行以下命令:
生产环境清完缓存可执行php artisan config:clear php artisan cache:clearphp artisan config:cache重新生成配置缓存,执行完先重试数据库连接。 - 修正
.env配置格式问题
当前DB_PASSWORD的值外层包裹了双引号,部分.env解析组件会因为引号处理逻辑异常,将密码值识别为空字符串,或者将引号本身作为密码内容,直接把该行修改为无引号格式:
修改时注意检查行尾不要有多余空格、不可见特殊字符,改完重新执行一次配置清除命令。DB_PASSWORD=thismypass - 检查数据库配置文件的硬编码值
打开项目config/database.php文件,找到mysql连接对应的配置段,检查username、password字段是否被硬编码为空值,硬编码的配置优先级高于.env读取值,会直接覆盖.env中填写的参数。 - 手动验证数据库账号有效性
在服务器命令行执行以下命令,手动用配置的账号密码连接数据库,验证账号密码本身是否正确:
回车后输入配置的密码mysql -u username -p -h 127.0.0.1 -P 3306thismypass:- 如果能正常登录,说明账号密码本身有效,故障出在框架配置读取环节
- 如果无法登录,说明数据库侧用户配置有误:注意MySQL中
'username'@'localhost'和'username'@'127.0.0.1'是两个独立的用户身份,如果之前只给localhost维度的用户授权,用127.0.0.1连接时会匹配不到对应账号,需要重新给'username'@'127.0.0.1'授权,或直接将用户host设置为%覆盖所有连接来源。
- 检查系统级环境变量覆盖
如果是用PHP-FPM、Docker部署的服务,检查FPM进程池配置、容器环境变量中是否提前定义了空值的DB_PASSWORD,系统级环境变量优先级高于.env文件配置,会导致.env中填写的密码不生效。
内容的提问来源于stack exchange,提问作者Yamin
相关产品推荐
相关产品推荐

