# SQL-Dump nach MariaDB laden?



## ruutaiokwu (29. Okt 2019)

Hallo zusammen

Folgende Codes verursachen Fehler bei mir:

```
package main;

import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class MySQLImport {
    public static void main(final String[] args) throws Exception {
        if (args == null || args.length == 0) {
            System.out.println("Please specify path");
            System.exit(0);
        } else {
            if (args == null || args.length == 1) {
                System.out.println("Please specify username");
                System.exit(0);
            } else {
                if (args == null || args.length == 2) {
                    System.out.println("Please specify password");
                    System.exit(0);
                } else {
                    if (args == null || args.length == 3) {
                        System.out.println("Please specify host");
                        System.exit(0);
                    } else {
                        if (args.length == 4) {
                            String path = args[0];
                            String username = args[1];
                            String password = args[2];
                            String host = args[3];
                            Connection connection = DriverManager.getConnection("jdbc:mariadb://" + host
                                    + ":3306/mysql?user=" + username + "&password=" + password);

                            try (BufferedReader br = new BufferedReader(new FileReader(path))) {
                                StringBuilder sb = new StringBuilder();
                                String line = br.readLine();

                                while (line != null) {
                                    sb.append(line);
                                    sb.append(System.lineSeparator());
                                    line = br.readLine();
                                }

                                String everything = sb.toString();
                                Statement stmt = connection.createStatement();

                                // stmt.execute(everything);

                                stmt.executeQuery(everything);

                                stmt.close();
                                connection.close();
                            }
                        } else {
                            System.out.println("Too many arguments: " + args.length);
                        }
                    }
                }
            }
        }
    }
}
```


Ausgabe:

```
Exception in thread "main" java.sql.SQLSyntaxErrorException: (conn=24) 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 'DROP DATABASE IF EXISTS relay;

    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:238)
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:171)
    at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:243)
    at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:332)
    at org.mariadb.jdbc.MariaDbStatement.executeQuery(MariaDbStatement.java:506)
    at main.MySQLImport.main(MySQLImport.java:50)
Caused by: 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 'DROP DATABASE IF EXISTS relay;
CREATE DATABASE IF NOT EXISTS relay' at line 2
Query is: SET SQL_NOTES = 0;
DROP DATABASE IF EXISTS relay;
CREATE DATABASE IF NOT EXISTS relay;

java thread: main
    at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:121)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:233)
    at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:326)
    ... 2 more

```


SQL, welches ich versuche reinzuladen:

```
SET SQL_NOTES = 0;
DROP DATABASE IF EXISTS relay;
CREATE DATABASE IF NOT EXISTS relay;
```


...scheinbar ist es nicht fähig mit `SET SQL_NOTES = 0;` richtig umzugehen. Warum?

HeidiSQL kann das ja schliesslich auch (libmariadb), wo sollte also das Problem liegen?


----------



## Thallius (29. Okt 2019)

SQL und mySQL (auf welchem MariaDB aufsetzt) sind halt verschiedene Dialekte und nicht 100% kompatibel.


----------



## ruutaiokwu (29. Okt 2019)

Verstehe das nicht ganz, deine Aussage...

Fakt ist: Das gleiche SQL ist mit HeidiSQL ausführbar, mit JDBC aber nicht.

Und der ZIELSERVER ist der gleiche. JDBC scheint ein Problem mit mehreren SQL-Statement auf einmal zu haben, eher das scheint Stand der Dinge zu sein..


----------



## ruutaiokwu (29. Okt 2019)

Problem gelöst...


----------



## krgewb (29. Okt 2019)

Bitte immer in Code-Tags posten

```
package main;

import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class MySQLImport {
    public static void main(final String[] args) throws Exception {
        if (args == null || args.length == 0) {
            System.out.println("Please specify path");
            System.exit(0);
        } else {
            if (args == null || args.length == 1) {
                System.out.println("Please specify username");
                System.exit(0);
            } else {
               if (args == null || args.length == 2) {
                   System.out.println("Please specify password");
                   System.exit(0);
              } else {
                  if (args == null || args.length == 3) {
                      System.out.println("Please specify host");
                      System.exit(0);
                  } else {
                       if (args.length == 4) {
                           String path = args[0];
                           String username = args[1];
                           String password = args[2];
                           String host = args[3];
                           Connection connection = DriverManager.getConnection("jdbc:mariadb://" + host + ":3306/mysql?user=" + username + "&password=" + password);

                           try (BufferedReader br = new BufferedReader(new FileReader(path))) {
                               StringBuilder sb = new StringBuilder();
                               String line = br.readLine();

                               while (line != null) {
                                   sb.append(line);
                                   sb.append(System.lineSeparator());
                                   line = br.readLine();
                               }

                              String everything = sb.toString();
                              Statement stmt = connection.createStatement();

                              // stmt.execute(everything);

                              stmt.executeQuery(everything);

                              stmt.close();
                              connection.close();
                            }
                        } else {
                            System.out.println("Too many arguments: " + args.length);
                        }
                    }
                }
            }
        }
    }
}
```

Ausgabe:


```
Exception in thread "main" java.sql.SQLSyntaxErrorException: (conn=24) 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 'DROP DATABASE IF EXISTS relay;

at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:238)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:171)
at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:243)
at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:332)
at org.mariadb.jdbc.MariaDbStatement.executeQuery(MariaDbStatement.java:506)
at main.MySQLImport.main(MySQLImport.java:50)
Caused by: 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 'DROP DATABASE IF EXISTS relay;
CREATE DATABASE IF NOT EXISTS relay' at line 2
Query is: SET SQL_NOTES = 0;
DROP DATABASE IF EXISTS relay;
CREATE DATABASE IF NOT EXISTS relay;

java thread: main
at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:121)
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:233)
at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:326)
... 2 more
```



SQL, welches er versucht reinzuladen:


```
SET SQL_NOTES = 0;
DROP DATABASE IF EXISTS relay;
CREATE DATABASE IF NOT EXISTS relay;
```


----------



## kneitzel (29. Okt 2019)

jmar83 hat gesagt.:


> Problem gelöst...


Da wäre es ja schön gewesen, wenn Du mitgeteilt hättest, was denn die Lösung war ...

Ich würde tippen: allowMultiQueries=true

Hintergrund: Die JDBC Treiber von mariadb und mysql erlauben pro Statement nur eine Query. Wenn man dieses Verhalten nicht will, dann kann im Connection String allowMultiQueries=true mitgegeben werden und schon kann man mehrere Queries in einem Statement absetzen.

Ansonsten findet man auf SO viele Ideen und Vorschläge. Man kann das natürlich Splitten in mehrere Statements und diese als Batch absetzen. Oder man baut eine Stored Procedure mit dem Inhalt und führt diesen dann aus.... Das ist so, was ich als Ideen vermuten würde...


----------



## ruutaiokwu (29. Okt 2019)

*



			"allowMultiQueries=true"
		
Zum Vergrößern anklicken....

*
Exakt...


----------

