如何通过JDBC连接远程MySQL数据库?解析连接报错问题
先帮你拆解下遇到的两个问题,再一步步教你怎么连接远程MySQL:
一、错误含义解析
1. SSL连接警告
Tue Apr 09 14:34:46 IST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set...
这个警告是因为你的MySQL版本(5.5.45+/5.6.26+/5.7.6+)默认要求SSL加密连接,但你的JDBC URL里没明确配置SSL相关参数。MySQL为了兼容旧应用,自动把verifyServerCertificate设为false跳过证书验证,但这种做法存在安全风险,所以抛出警告提示。
解决起来很简单:测试环境可以在JDBC URL里加上useSSL=false明确禁用SSL;如果是生产环境需要安全连接,就配置信任证书并设置useSSL=true。
2. Access Denied权限错误
java.sql.SQLException: Access denied for user 'sql12287303'@'localhost' (using password: YES)
这个错误有两层原因:一是你的JDBC URL写的是localhost,但你要连接的是远程服务器,地址明显不对;二是你的sql12287303用户目前只被授予了本地(localhost)访问权限,无法从外部IP连接远程MySQL。
另外从你的执行结果看,本地运行代码能成功创建表,说明本地的sql12287303用户权限没问题,但远程服务器的用户配置是独立的,需要单独设置。
二、连接远程MySQL的完整步骤
1. 给远程MySQL用户授权远程访问
先登录到你的远程MySQL服务器,执行以下SQL语句(替换成你的用户名和密码):
-- 允许用户从任意IP访问,%代表所有IP,也可以指定具体IP比如192.168.1.100提升安全性 GRANT ALL PRIVILEGES ON sql12287303.* TO 'sql12287303'@'%' IDENTIFIED BY '54hBDtsfPg'; -- 刷新权限使配置立即生效 FLUSH PRIVILEGES;
2. 修改JDBC代码的连接参数
把JDBC URL里的localhost替换成远程服务器的公网IP/域名,同时加上useSSL=false消除警告,MySQL 8.0+版本还要加上时区参数避免时区错误。另外你原代码里的create table语句少了闭合括号,我也帮你修正了:
public class JDBCDemo { public static void main(String[] args) { String TableName; try{ // 替换成远程服务器的实际IP或域名,比如123.45.67.89 String url="jdbc:mysql://123.45.67.89:3306/sql12287303?useSSL=false&serverTimezone=UTC"; String username="sql12287303"; String password="54hBDtsfPg"; // MySQL 8.0+推荐用com.mysql.cj.jdbc.Driver,旧版本用com.mysql.jdbc.Driver Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection(url, username, password); System.out.println ("Database connection established"); System.out.println(con); Statement smt = con.createStatement(); // 修正了create table语句的语法错误 smt.execute("create table flames(id Integer primary key,fname varchar(20),sname varchar(20))"); smt.execute("show tables"); ResultSet rs = smt.getResultSet(); while(rs.next()){ TableName = rs.getString(1); System.out.println("Table Name:"+TableName); } // 记得关闭资源,避免内存泄漏 rs.close(); smt.close(); con.close(); }catch(Exception e){ e.printStackTrace(); // 用printStackTrace比直接打印e更方便排查问题 } } }
3. 检查远程服务器的网络配置
- 如果是云服务器,要在安全组里开放3306端口;如果是物理服务器,要在防火墙里放行3306端口
- 检查MySQL配置文件(Linux是
/etc/my.cnf,Windows是my.ini),把bind-address改成0.0.0.0(允许所有IP访问),然后重启MySQL服务
三、额外提醒
- 生产环境不建议用
%授权所有IP访问,最好指定具体的客户端IP,降低安全风险 - 尽量避免用
root用户远程访问,用权限最小的专用用户连接数据库 - 如果遇到连接超时,优先检查远程服务器的网络是否可达、端口是否开放
内容的提问来源于stack exchange,提问作者Purna Mahesh




