【问题标题】:Copying specific tables of a MySQL database to a MariaDB database in JDBC将 MySQL 数据库的特定表复制到 JDBC 中的 MariaDB 数据库
【发布时间】:2018-12-08 23:05:42
【问题描述】:

我正在尝试创建一个 Java 程序,它将特定表从一台服务器上的 MySQL 数据库复制到另一台服务器上的 MariaDB。我知道有 mysqldump,但该程序的目的是在不同的机器上运行,即使它们没有安装 mysql。

我创建的内容似乎运行良好,因为生成的 SQL 看起来确实正确并可以执行,例如当我使用 HeidiSQL 连接到 MariaDB 时。但是当我使用.executeQuery 执行 sql 时,我得到一个错误作为响应,我的 SQL 有问题。

代码基本上是:

        import java.sql.*

        public class JdbcTest {     
        Connection conn = null;
        Connection conn_2 = null;
        Statement stmt = null;
        Statement stmt_2 = null;

        //MySQL
        Class.forName("com.mysql.cj.jdbc.Driver");
        //MariaDB
        Class.forName("org.mariadb.jdbc.Driver");

        System.out.println("Connecting to DB1");
        conn = DriverManager.getConnection(jdbc:mysql://server1/database,USER,PASS);

        System.out.println("Connecting to DB2");
        conn_2 = DriverManager.getConnection(jdbc:mariadb://server2/database,USER_2,PASS_2);

        List<String> ConnToTableNames = new ArrayList<String>();
        ConnToTableNames.add("table1");
        ConnToTableNames.add("table2");

        //Create queries for all tables in ConnToTableNames
        stmt = conn.createStatement();
        String exportSql = "";
        for(String table : ConnToTableNames) {
            //getting table structure
            exportSql += "\n" +
                    "-- ----------------------------\n" +
                    "-- Table structure for `" + table+
                    "`\n-- ----------------------------\n"+
                    "DROP TABLE IF EXISTS `"+table+"`;\n";
            ResultSet rs2 = stmt.executeQuery("SHOW CREATE TABLE `" + table + "`");
            rs2.next();
            exportSql += rs2.getString(2) + ";\n" +
                    "-- ----------------------------\n";
            rs2.close();

            //adding the content
            ResultSet rss = stmt.executeQuery("select * from "+table);
            while (rss.next()) {
                int colCount = rss.getMetaData().getColumnCount();
                if (colCount > 0) {
                    exportSql += "INSERT INTO `" + table +"` VALUES(";

                    for (int i = 0; i < colCount; i++) {
                        if (i > 0) {
                        exportSql += ",";
                        }
                            String s = "";
                        try {
                            s += "'";
                            s += rss.getObject(i + 1).toString();
                            s += "'";
                        } catch (Exception e) {
                            s = "NULL";
                        }
                        exportSql += s;
                    }
                    exportSql += ");\n";
                }
            }
            rss.close();
        }

        //putting everything into the VM
        stmt_2 = conn_2.createStatement();
        stmt_2.executeQuery(exportSql);

        stmt.close();
        conn.close();
        stmt_2.close();
        conn_2.close();
        }

我得到的错误是:

java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CREATE TABLE `supplier` (
  `NUMMER` int(10) NOT NULL DEFAULT '0',
  `PRIO` int(' at line 5

真正让我困惑的是:如果我将 exportSql 转储到终端或文件并通过 HeidiSQL 执行它,它可以工作...

一个想法我做错了什么?

提前致谢,周末愉快

【问题讨论】:

  • 您需要单独执行语句。您不能(或至少:默认情况下不能)一次执行多个语句。
  • 如果您发布生成的 SQL 可能会有所帮助。不知道如果没有它,您希望任何人如何提供帮助。
  • 看这个。 stackoverflow.com/questions/10797794/…也许能够告诉 jdbc 连接器在一次调用 executeQuery() 时允许多个语句
  • @JimGarrison:关于您之前关于“此帐户是否被黑客入侵”的评论。不,但是看看他的问题历史,因为他反复问这样的问题,我相信他是一个声望很高的吸血鬼。
  • 谢谢@MarcRotteveel @O.Jones!那是正确的提示。我通过将?allowMultiQueries=true 添加到连接字符串并使用execute() 解决了这个问题。

标签: java mysql database jdbc mariadb


【解决方案1】:

为了解决我的问题,我在连接字符串中添加了?allowMultiQueries=true,并使用了 execute() 而不是 executeQuery()。

【讨论】:

  • 开启它可能是不明智的——它可以帮助黑客更快地进入。
  • 是的,我将重构代码以单独发送每个查询。但是为了快速修复——并且作为公司防火墙后面的纯内部应用程序,我认为它还不错。不过谢谢你的提示!
猜你喜欢
  • 2012-11-20
  • 1970-01-01
  • 2017-02-08
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多