【问题标题】:mysql command prints out help menu when ran from java programmysql命令从java程序运行时打印出帮助菜单
【发布时间】:2018-03-07 20:57:42
【问题描述】:

我的 mysql 命令正在从 java 程序内部运行并打印出帮助菜单,但是当我在终端中运行完全相同的命令时,它工作正常。不太清楚为什么。

String shellCommand = "mysql -u root < " + destinationDirectory+"/"+ filename;
executeCommand(shellCommand);

执行命令方法如下:

public static void executeCommand(String command) {

    StringBuffer output = new StringBuffer();

    Process process;
    try {
        process = Runtime.getRuntime().exec(command);
        JOptionPane.showMessageDialog(null, "COMMAND: "+ command);

        process.waitFor();
        BufferedReader reader =
            new BufferedReader(new InputStreamReader(process.getInputStream()));

        String line = "";
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.toString());

        e.printStackTrace();
    }

    System.out.println(output.toString());
}  

编辑: 这是另一种方法,但它给了我这个错误我尝试运行实际的 mysql 命令而不是像原来那样使用休眠但仍然无济于事。等待是为了给恢复一些时间来到达由于锁而挂起的位置,然后关闭程序以便释放锁和数据库:

// JDBC driver name and database URL
  final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
  final String DB_URL = "jdbc:mysql://" + HOST + "/" + DATABASE;


   Connection conn = null;
   final Statement stmt;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to a selected database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      System.out.println("Connected database successfully...");

      //STEP 4: Execute a query
      stmt = conn.createStatement();
        Services.endServices();

        Thread progress = new Thread() {
            @Override
            public void run() {

              try {
                  String sql = "source /mount/mf/outbox/b3sql.sql";
                  stmt.executeUpdate(sql);
                  System.out.println("Database loaded successfully...");

              }catch(SQLException se){
              //Handle errors for JDBC
              se.printStackTrace();
           }
        }

        };
        progress.start();
        TimeUnit.SECONDS.sleep(15);
        System.exit(0); 
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{

            conn.close();
      }catch(SQLException se){
      }// do nothing
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try

-

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'source /mount/mf/outbox/b3sql.sql'

【问题讨论】:

  • 这种方式只能执行SQL命令,不能执行mysql命令。看看 b3sql.sql,里面的命令。
  • 那么我应该从我的 .sql 文件中读取每一行 SQL 命令并将其作为语句执行吗?或者有没有更好的方法在程序运行时从代码内部启动恢复数据库,然后让它继续执行?
  • 你可以试试,但我不知道b3sql.sql里面有什么命令。如果您在我的回答中按照我的说明进行操作,您的 java 程序将执行 mysql 并获取 b3sql.sql。如果这是您的数据库的一次性恢复,为什么不从命令行运行它?
  • 我不认为它是一次恢复,因为它永远不会再次完成,它是我的程序的一项功能,能够恢复/加载任何旧的 sql 文件,而程序启动然后重新启动程序
  • 当您尝试我的回答时,您只是说“它无法恢复”。如果您添加了错误处理,您应该已经看到脚本的标准输出或标准错误。请举一个这样的脚本的例子。

标签: java mysql shell


【解决方案1】:

您的 shell 理解输入重定向“

String shellCommand[] =
      {"/usr/bin/mysql", "-h", "127.0.0.1",
       "-u", "myDBuser",
       "--password=aMeHoElA",
       "-e",  "source /here/is/myscript.sql" };
executeCommand(shellCommand);

并修改(命令现在是一个字符串数组):

public static void executeCommand(String command[]) {

别忘了阅读错误输出,它会对你有所帮助:

    BufferedReader ereader =
        new BufferedReader(new InputStreamReader(process.getErrorStream()));
    String eline = "";
    while ((eline = ereader.readLine())!= null) {
        output.append("ERROR: " + eline + "\n");

MySQL 需要“source myscript.txt”作为单个参数。当您将它与命令的其余部分放在一个字符串中时,Java 将它作为两个参数传递,这是无法避免的。

【讨论】:

  • 所以现在它不再打印菜单,但它也不会像预期的那样替换当前数据库。
  • 它应该这样做吗?
  • 如果你从 shell 中尝试会发生什么?
  • 从外壳它工作,但 mysql 需要“source myscript.txt”作为单个参数。当你把它放在一个字符串中时,Java 将它作为两个参数传递,这是不可避免的。
  • 它仍然没有恢复数据库。我不确定为什么它在终端而不是 irl 中有效。如果我必须这样做,也不知道如何删除当前数据库。
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2012-04-10
  • 2018-07-24
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多