我有一个MySQL数据库,我通过Java JDBC访问它,它在我的本地网络中工作正常(使用localhost
或192.168.*.*
本地地址(。但是我也想从互联网远程访问它,当我使用我的全球地址176.214.186.243
连接到它时(它是 dynamyc 地址,但它在我的尝试中保持静止 2 天(,我得到下一个错误com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
在MySQL工作台中,我在图片上显示了特权(所有内容。 但是我仍然无法使用全局IP连接到数据库。
我做错了什么?
mysql 限制对用户、表和远程地址的任意组合的访问。在您的情况下,用户很可能可以在本地访问所有内容,但不能从 extern 访问(例如,对于 root 来说,这将是一件好事(。这可以通过以下方式更改:
GRANT ALL ON <database>.* TO 'client'@'%.%.%.%' IDENTIFIED BY '<a password for external usage>';
FLUSH PRIVILEGES;
<database>.*
授予对<database>
中的 alle 表的访问权限- 我已经添加了您的用户名,这似乎很
client
%.%.%.%
是指任何 IP 地址,其中 1.-4. 数字可以是任何内容- 也许您可以限制 IP 的范围或使用 FQDN
<a password for external usage>
只是为了这种连接,可以是别的东西。
更多信息在这里
您应该授予指定用户从特定IP地址访问的权限,例如:
授予 [权限|所有权限]在 schema.table 上到 'username'@'hostname' 通过"密码">
与授予选项标识; 刷新权限;
- 权限可以是操作名称,如选择、删除和...或者,如果您想将所有权限授予设置"所有权限"的用户
- schema.table 可以只指定单个表,也可以是类似.以支持所有架构和表。
- 用户名也称为角色是默认的,但它可以是%授予所有用户给定的权限。
- 主机名可以是 IP 或主机名,也可以像用户名一样是 %,以授予指定用户给定的权限。
如需更多信息,请参阅 https://dev.mysql.com/doc/refman/8.0/en/grant.html,https://stackoverflow.com/a/6239145/2137378
mysql文档更受欢迎。 检查您的MySQL版本并继续MySQL上的确切版本文档。
当然,上面的描述是让mysql引擎知道它的远程用户,如果这两者之间存在一些障碍,比如防火墙应该以某种方式解决。 例如,如果您在 Ubuntu 上,您可以通过使用以下方法禁用防火墙来检查防火墙是否是主要问题:
sudo ufw disable
禁用防火墙并授予权限后,远程访问是可以的,然后您就知道防火墙是问题所在。 要使用以下内容启用:
sudo ufw enable