先说结论:这种情况要么是账号密码不对,要么是账号权限不对!
下面来复现问题。
MySQL服务正常启动,创建了一个 user1 账号,密码为 user123,访问数据库 test1。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class MySQLConnection {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test1";
String user = "user1";
String password = "user123";
try {
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("Connected to the database successfully!");
} catch (SQLException e) {
System.out.println("SQL error: " + e.getMessage());
}
}
}
运行报以下错误:
也就是 user1 账号通过 ip:112.17.x.x 去访问 MySQL 服务被拒。
情况1:账号访问权限
默认创建的账号权限仅能通过当前 127.0.0.1 客户端去访问 MySQL 服务。
Host列指定了允许用户登录所使用的 IP,比如user=root、Host=192.168.111.101。这里的意思就是说root用户只能通过 192.168.111.101 的客户端去访问服务。
mysql> use mysql;
Database changed
mysql> select user,host from user where user = 'test1';
+-------+-----------+
| user | host |
+-------+-----------+
| test1 | 127.0.0.1 |
| test1 | localhost |
+-------+-----------+
2 rows in set (0.03 sec)
这种情况可以设置当前 user1 用户可以通过所有 IP 的客户端去访问,设置如下(要刷新权限):
mysql> update user set host = '%' where user = 'user1' and host = '127.0.0.1';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> FLUSH PRIVILEGES;
再试下,连接成功:
情况2:账号密码不正确
如果使用错误的密码去访问 MySQL 服务,也会报相同的错误:
情况3:账号访问数据库权限不足
还有一种情况是账号对当前库的操作权限不足,首先查看下当前账号 user1 所具有的操作权限:
mysql> SHOW GRANTS FOR 'user1'@'%';
+--------------------------------------------------+
| Grants for user1@% |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'%' |
| GRANT ALL PRIVILEGES ON `test1`.* TO 'user1'@'%' |
+--------------------------------------------------+
2 rows in set (0.10 sec)
显示对 test1 库是有权限的,我们移除相关权限,并刷新权限:
mysql> REVOKE ALL PRIVILEGES ON test1.* FROM 'user1'@'%';
Query OK, 0 rows affected (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)
此时输出入正确的用户名密码仍然不能访问:
我们再把权限赋予 user1:
mysql> GRANT ALL PRIVILEGES ON test1.* TO 'user1'@'%' IDENTIFIED BY 'user123';
Query OK, 0 rows affected (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)
这时候又可以正常连接了:
参考: