DigitalOcean Droplet部署MariaDB10.2后Yii2数据库连接权限拒绝问题
我之前在DigitalOcean Droplet上部署Yii2+MariaDB时也碰到过几乎一模一样的问题,给你几个实用的排查和解决方向:
先确认Yii2配置的完整性
你贴的配置片段里'usernam...'明显没写完,首先要确保数据库配置里的username字段是完整的'test',password也和你创建test用户时设置的完全一致——别小看拼写错误或者多余的空格,这是最容易踩的坑。完整的配置应该类似:return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=test', 'username' => 'test', 'password' => '你的test用户密码', 'charset' => 'utf8', ];检查MariaDB用户的认证插件
MariaDB 10.2及以上版本,默认可能给localhost用户启用了unix_socket认证插件——这种情况下,你通过控制台登录时用的是Unix socket认证(不需要密码或者自动匹配系统用户),但Yii2应用用的是密码认证,就会触发1045错误。
登录MariaDB控制台执行以下命令查看插件:SELECT user, host, plugin FROM mysql.user WHERE user = 'test';如果返回的
plugin是unix_socket,就把它改成mysql_native_password:ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的test用户密码'; FLUSH PRIVILEGES;之后重启MariaDB服务:
sudo systemctl restart mariadb,再测试Yii2的连接。调整Yii2的DSN连接方式
在MySQL/MariaDB里,localhost会优先走Unix socket连接,而127.0.0.1会强制用TCP/IP连接,两者的认证规则可能不一样。你可以试试两种修改方式:- 强制用TCP/IP连接,把DSN里的
localhost改成127.0.0.1:'dsn' => 'mysql:host=127.0.0.1;dbname=test', - 直接指定Unix socket路径(路径可能因系统不同而异,比如
/var/run/mysqld/mysqld.sock或者/var/lib/mysql/mysql.sock):'dsn' => 'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=test',
- 强制用TCP/IP连接,把DSN里的
重新确认用户权限
虽然你说已经授予了test数据库的访问权限,但还是建议再验证一下权限是否生效:
登录MariaDB控制台执行:SHOW GRANTS FOR 'test'@'localhost';确保输出里包含
GRANT ALL PRIVILEGES ONtest.* TO 'test'@'localhost'(或者你需要的具体权限)。如果没有,重新执行授权命令:GRANT ALL PRIVILEGES ON test.* TO 'test'@'localhost' IDENTIFIED BY '你的test用户密码'; FLUSH PRIVILEGES;临时排查SELinux或防火墙干扰
如果以上方法都不行,可以临时关闭SELinux测试(仅用于排查):sudo setenforce 0如果关闭后能正常连接,再调整SELinux规则允许Yii2访问数据库;DigitalOcean Droplet默认的UFW防火墙一般不会拦截localhost的连接,但也可以检查一下UFW状态:
sudo ufw status,确保3306端口的本地连接是允许的。
内容的提问来源于stack exchange,提问作者user1184294

