簡體   English   中英

如何使用Java恢復MySQL數據庫備份

[英]How to restore a MySQL database backup using Java

我可以使用mysqldump.exe在以下Java代碼的幫助下以.SQL文件的形式創建當前mysql數據庫備份

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

現在,我想在單擊按鈕時使用與上面類似的java代碼將相同的.SQL Backup文件還原到mysql數據庫。

非常感謝 :)

所以現在我嘗試了; Process runProcess = Runtime.getRuntime().exec("C:\\\\SCM Files\\\\SQL Backup\\\\mysqldump.exe -uroot -p123 rr < C:\\\\SCM Files\\\\SQL Backup\\\\RR.sql"); 仍然沒有用:/

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;  
}  

源示例:“ E:\\\\ My Backup \\\\ Test \\\\ file.sql”

您必須使用Java swing來設計表單。 這是一些可以做到的代碼。

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");
                }
            }
        });
    }

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

該語句將從文件重新生成數據庫

為了進行恢復,請使用提供的m.Torkashvand形式(字符串數組)的executeCmd 這里可以找到有關如何從JSP代碼使用這些命令的工作示例。

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;
}

我嘗試了這段代碼,效果完美!

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();
    }

您應該嘗試使用DbUnit進行數據庫的備份和還原,這是該示例代碼:

    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();
    }

使用相同的轉儲以這種方式導入。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM