如何修复 MariaDB 中的"访问被拒绝"错误

本文将介绍如何解决 MariaDB 中的"访问被拒绝"错误,包括常见原因和解决方案。

发布于

在使用 MariaDB 时,“访问被拒绝”(Access Denied)错误是最常见的连接问题之一。这个错误通常发生在用户尝试登录数据库但提供的凭据不正确,或者用户没有足够的权限执行特定操作时。本文将详细介绍这个错误的各种成因以及对应的解决方法,帮助你快速恢复数据库访问权限。

理解错误信息

首先我们需要准确识别错误信息。典型的 MariaDB 访问拒绝错误会显示以下内容:

ERROR 1045 (28000): Access denied for user 'username'@'hostname' (using password: YES/NO)

这个错误包含几个关键信息:

  • 1045 是错误代码
  • username 是尝试登录的用户名
  • hostname 是客户端的主机名
  • 括号内会提示是否使用了密码

检查登录凭据

最常见的错误原因是输入了错误的用户名或密码。首先确认:

  1. 是否使用了正确的用户名(区分大小写)
  2. 密码是否正确(注意特殊字符)
  3. 是否正确指定了主机名

可以通过命令行显式指定这些参数进行测试:

mysql -u username -p -h hostname

如果忘记 root 密码,需要使用 --skip-grant-tables 参数启动 MariaDB 进行密码重置。

验证用户权限

即使用户名和密码正确,用户可能没有从特定主机访问的权限。检查用户权限:

SELECT host, user FROM mysql.user WHERE user='username';
SHOW GRANTS FOR 'username'@'hostname';

如果发现用户权限仅限于本地主机(localhost),而你在远程连接,就需要修改权限:

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

检查绑定地址

MariaDB 默认只监听本地连接。如果尝试远程连接,需要确认 /etc/mysql/my.cnf 文件中 bind-address 设置:

[mysqld]
bind-address = 0.0.0.0

修改后需要重启 MariaDB 服务:

sudo systemctl restart mariadb

防火墙和网络问题

有时问题不在 MariaDB 本身,而是网络或防火墙阻止了连接。检查:

  1. 防火墙是否允许 3306 端口
  2. 网络是否通畅
  3. 云服务的安全组规则

可以使用 telnet 测试端口连通性:

telnet server_ip 3306

密码插件问题

MariaDB 10.4 及以上版本默认使用 unix_socket 插件认证 root 用户,可能导致密码登录失败。解决方法:

ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('new_password');

总结

“访问被拒绝"错误虽然常见,但通过系统性的排查可以快速解决。首先确认凭据是否正确,然后检查用户权限和主机限制,接着查看网络和防火墙设置,最后考虑 MariaDB 的特殊认证机制。掌握这些排查步骤,你就能轻松应对大多数访问权限问题。