mahesh
mahesh

Reputation: 597

Execute mysql database import script from java on linux machine

I want to execute database import from .sql file from java program. My program is working fine on windows. But I am facing problem on linux machine.

Code -

    try {




ProcessBuilder builder = new ProcessBuilder("mysql -u root -p password db-name < db_script.sql");
            builder.redirectErrorStream(true);
            Process pr = builder.start();

            InputStream is = pr.getInputStream();

            // Now read from it and write it to standard output.
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

I am getting - java.io.IOException: Cannot run program "mysql -u root -p password db-name < db_script.sql": java.io.IOException: error=2, No such file or directory

The above command is working fine on linux terminal. Some one please advice me on this.

Thanks in advance

Upvotes: 2

Views: 3985

Answers (3)

Alex
Alex

Reputation: 23

A simple way to achieve it.

String DBUSERNAME = "";
String DBUSERPASSWORD = "";
String sqlfilename = "";
PrintWriter writer = new PrintWriter("tmp.dmp", "UTF-8");
writer.println("mysql --user " + DBUSERNAME + " --password=" + DBUSERPASSWORD + " < " + sqlfilename);
writer.close();

runCommand("chmod 777 tmp.dmp");
runCommand("./tmp.dmp");
runCommand("rm tmp.dmp");

public static void runCommand(String command) throws IOException {
    String s = "";
    Process p = Runtime.getRuntime().exec(command);

    BufferedReader stdInput = null;
    BufferedReader stdError = null;
    try {
        stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

        // read the output from the command
        while ((s = stdInput.readLine()) != null) {
            System.out.println(s);
        }

        // read any errors from the attempted command
        while ((s = stdError.readLine()) != null) {
            System.out.println(s);
        }
    } finally {
        if (stdInput != null) {
            stdInput.close();   
        }

        if (stdError != null) {
            stdError.close();                   
        }
    }
}

Upvotes: 0

Maurice Perry
Maurice Perry

Reputation: 32831

The < redirection is a shell thing. Try something like this:

ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "mysql -u root -p password db-name <  b_script.sql");

UPDATE:

Otherwise, if you're using java 7+, you can do the redirection in java:

ProcessBuilder builder = new ProcessBuilder(
        "mysql", "-u", "root", "-p", "password", "db-name");
builder.redirectInput(ProcessBuilder.Redirect.from(new File("b_script.sql")));

Upvotes: 9

Hemant Metalia
Hemant Metalia

Reputation: 30698

have you checked that your code is executed from proper dir??

that if your db_script.sql is inhome then you are running from home as

home>mysql -u root -p password db-name < db_script.sql

or provide full path of db_script.sql in the command

Upvotes: 0

Related Questions