You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过JDBC连接远程MySQL数据库?解析连接报错问题

解决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

火山引擎 最新活动