How to restore a MySQL database backup using Java

I was able to create a backup of my current mysql database as .SQL file using the mysqldump.exe with the help of the following java code.

 Process runProcess = Runtime.getRuntime().exec("C:\\SCM Files\\SQL Backup\\mysqldump.exe -uroot -p123 rr -r\"C:\\SCM Files\\SQL Backup\\RR.sql");

Now I want to restore this same .SQL Backup file to mysql database using java code similar to above on the event of a button clicked.

Thanks a lot 🙂

So now I tried this ;
Process runProcess = Runtime.getRuntime().exec("C:\\SCM Files\\SQL Backup\\mysqldump.exe -uroot -p123 rr < C:\\SCM Files\\SQL Backup\\RR.sql");
Still it didn’t work :/

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

public static boolean restoreDB(String dbName, String dbUserName, String dbPassword, String source) {  
String[] executeCmd = new String[]{"mysql", "--user=" + dbUserName, "--password=" + dbPassword, dbName,"-e", " source "+source};  
Process runtimeProcess;  
try {  
runtimeProcess = Runtime.getRuntime().exec(executeCmd);  
int processComplete = runtimeProcess.waitFor();  
if (processComplete == 0) {  
    System.out.println("Backup restored successfully");  
    return true;  
}  
} else {  
     System.out.println("Could not restore the backup");  
       }  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
        return false;  
}  

source example : “E:\\My Backup\\Test\\file.sql”

Solution 2

Runtime.getRuntime().exec("mysql -u username -ppassword database_name  FILE.sql")

This statement will regenerate database from the file

Solution 3

You have to use java swings where you can design forms. Here is some code which can do that.

import javax.swing.JFrame;

public final class RestoreMySQLDatabase extends JFrame {
    private static final long serialVersionUID = 1L;
    public static void main(String[] args) {
        RestoreMySQLDatabase restoreMySQL = new RestoreMySQLDatabase();
        restoreMySQL.setTitle("Restore mysql database");
        javax.swing.JButton butRestore = new javax.swing.JButton("Restore");
        butRestore.addActionListener(new java.awt.event.ActionListener(){
            public void actionPerformed(java.awt.event.ActionEvent event){
                try{
                    Runtime.getRuntime().exec("C:\\SCM Files\\SQL Backup\\mysqldump.exe -uroot -p123 rr -r\"C:\\SCM Files\\SQL Backup\\RR.sql");
                    javax.swing.JOptionPane.showMessageDialog((javax.swing.JButton)event.getSource(), "Successfully restored");
                }catch(java.lang.Exception e){
                    javax.swing.JOptionPane.showMessageDialog((javax.swing.JButton)event.getSource(), "Not able to restore");
                }
            }
        });
    }

}

Solution 4

I tried this code and works as perfect!

String[] restoreCmd = new String[]{"mysql ", "--user=" + DB.DB_USERNAME, "--password=" + DB.DB_PASSWORD, "-e", "source " + pathToFile};
    try {
        Process runtimeProcess = Runtime.getRuntime().exec(restoreCmd);
        int processComplete = runtimeProcess.waitFor();
        if (processComplete == 0) {
            System.out.println("Done");
        } else {
            System.out.println("Failed");
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

Solution 5

You should try DbUnit for backup and restore of database.Here is the demo code for that:

    try {
        Class.forName(DBDRIVER);
        Connection jdbcConnection = DriverManager.getConnection(DBURL, DBUSERNAME, DBPASSWORD);
        IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
        connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
                    new MySqlDataTypeFactory());

         //////// Database backup
        ITableFilter filter = new DatabaseSequenceFilter(connection);
        IDataSet dataset = new FilteredDataSet(filter, connection.createDataSet());

        ExcludeTableFilter excludeFilter = new ExcludeTableFilter();
        excludeFilter.excludeTable("DATABASECHANGELOG*");
        IDataSet excludedataset = new FilteredDataSet(excludeFilter, dataset);
        FlatXmlDataSet.write(excludedataset, new FileOutputStream(backupfilename));

        System.out.println("\n Complete backup successful.");
         //////// Database backup


         //////// Database restore
        IDataSetProducer producer = new FlatXmlProducer(new InputSource(restoreFileName));
        IDataSet dataSet = new StreamingDataSet(producer);

        TransactionOperation operation = new TransactionOperation(DatabaseOperation.INSERT);
        operation.execute(connection, dataSet);
         //////// Database restore
    } catch (DatabaseUnitException e) {
        e.printStackTrace();
        flag = false;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }

Solution 6

Use the same dump to import like this.

Process runProcess = Runtime.getRuntime().exec("C:\\SCM Files\\SQL Backup\\mysqldump.exe -uroot -p123 rr  database_name < "C:\\SCM Files\\SQL Backup\\RR.sql");

Solution 7

For restore use the executeCmd in the form m.Torkashvand provided (array of strings). A working example on how to use these commands from JSP code can be found here

Solution 8

public static void mysqlExport(String host, String port, String user, String password, String dbname, String table, String folder, String query) {

    System.out.println("------ Exporting "+dbname+"."+table+" at "+folder+"---------------------------");
    try {
        String command = "mysqldump --host=" + host + " --port=" + port + " --user=" + user + " --password=" + password + " " + dbname + " " + table + " --where=\"" + query + "\" > " + folder + table + ".sql";
        System.out.println(command);
        int returnValue = executeCommand(Arrays.asList("mysqldump", "--host="+host, "--port="+port, "--user="+user, "--password="+password, dbname, table, "--where="+query), folder + table + ".sql");
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

public static void mysqlImport(String host, String port, String user, String password, String dbname, String table, String folder) {

    System.out.println("------ Importing "+dbname+"."+table+" at "+folder+"---------------------------");
    try {
        String command = "mysql --host=" + host + " --port=" + port + " --user=" + user + " --password=" + password + " " + dbname + " " + table + " < " + folder + table + ".sql";
        System.out.println(command);
        int returnValue = executeCommand(new String[]{"mysql", "--host="+host, "--port="+port,  "--user=" + user, "--password=" + password, dbname, "-e", "source " + folder + table + ".sql"});
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

public static int executeCommand(String[] commands) throws IOException
{
    System.out.println(commands.toString());
    Process process = Runtime.getRuntime().exec(commands);
    return dumpProcess(process);
}

public static int executeCommand(List<String> commands, String folder) throws IOException
{
    ProcessBuilder builder = new ProcessBuilder(commands);
    System.out.println(builder.command());
    builder.redirectOutput(new File(folder));
    Process process = builder.start();
    return dumpProcess(process);
}

public static int dumpProcess(Process process) throws IOException
{
    int returnValue = -1;
    try {
        String s = null;
        process.waitFor();
        returnValue = process.exitValue();
        if (returnValue == 0) {
            System.out.println("Command successful !!");
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
            System.out.println("Here is the standard output of the command:\n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }
        } else {
            System.out.println("Command failed. Exist Status code = "+returnValue);
            BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            System.out.println("Here is the standard error of the command (if any):\n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }
        }

    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return returnValue;
}

Solution 9

This is working code

public class Recover {

final static String filepath = "/home/shubhampanchal/Downloads/backup/configuration_files.sql";

public static void main(String[] args) throws Exception {
    try {
        
        String[] restoreCmd = new String[]{"mysql", "-uroot", "-p1", "Student", "-e", "source " + filepath};
        Runtime rt =Runtime.getRuntime();
        rt.exec(restoreCmd);
        System.out.println("Restored successfully!");
        
    } catch(Exception e) {
        e.printStackTrace();
    }
}

}

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply