0

mysqldumpで生成されたファイルからMySQLデータベースを復元しようとしています。復元計画の各クエリを含むArrayListを使用して実行し、ステートメントを使用して各クエリを実行します。

ただし、プロセスのある時点で停止する場合があります(実行ごとに異なる場合があります)。エラーメッセージは表示されません。ハングするだけです(これが発生した場合、Mysqlサービスを再起動する必要があります)。

これは復元のコードです:

    ArrayList<String> sql;
    int res;

    FileSQLCommandManager fichero = null;
    try {
        if (pass == null)
            conectar(conn);
        else
            conectar(conn, pass);

        Statement st = null;
        st = conn.createStatement();     

        st.executeUpdate("SET FOREIGN_KEY_CHECKS=0");

        PreparedStatement stConstraints = null;

        String cadenaSQL = null;
        String cadenaSQLConstraints = null;
        String cadenaConstraints;
        ResultSet rs;
        boolean ejecutar = false;

        fichero = new FileSQLCommandManager(fic);

        fichero.open();

        sql = fichero.read();

        cadenaSQL = "";

        for (int i = 0; i < sql.size(); i++) {

            cadenaSQL = sql.get(i);
            ejecutar = true;

            if (ejecutar) {                    

                st = null;
                st = conn.createStatement();
                res = st.executeUpdate(cadenaSQL);
                if (res == Statement.EXECUTE_FAILED) {
                    System.out.println("HA FALLADO LA CONSULTA " + cadenaSQL);
                }


            }

        }
                st.executeUpdate("SET FOREIGN_KEY_CHECKS=1");
                st.close();
        fichero.close();

        commit();
        desconectar();
        fichero = null;
        return true;

    } catch (Exception ex) {
        ex.printStackTrace();
        rollback();
        desconectar();
        return false;
    }

}

FileSQLCommandManagerは、ArrayListを埋めるクラスです。これは機能します。ArrayListの内容は問題ありません。クエリのexecuteUpdateで停止します(常にではありませんが、同じSQLファイルで問題なく動作する場合があります)。

最初に、外部キーチェックを無効にします。これは、参照を含むテーブルを削除できるためです(テーブルの再作成の順序はSQLダンプによって設定されます)。

ヒントはありますか?

ありがとう; 私はこれに腹を立てています:(

4

2 に答える 2

1

シンプルな人があなたのためにすべてを復元するのに、なぜあなたはそのすべての仕事をしているmysql < db_backup.dumpのですか?

于 2012-12-14T07:34:02.590 に答える
0

これは本当に復元に役立ちます

 String comando = "C:\\MySQL\\bin\\mysql.exe  --host=localhost --port=3306 --user=root --password=123 < D:\\back.sql";
File f = new File("restore.bat");
FileOutputStream fos = new FileOutputStream(f);
fos.write(comando.getBytes());
fos.close();
Process run = Runtime.getRuntime().exec("cmd /C start restore.bat ");  

そしてバックアップ用

  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.forLanguageTag("ru"));
    java.util.Date currentDate = new java.util.Date();
    Process p = null;
    try {
        Runtime runtime = Runtime.getRuntime();
        p = runtime.exec("C:\\MySQL\\bin\\mysqldump.exe  --default-character-set=utf8 -uroot -p123 -c  -B shch2 -r " + "D:/" + dateFormat.format(currentDate) + "_backup" + ".sql");

// dbpass と dbname を実際の dbpass と dbname に変更します int processComplete = p.waitFor();

        if (processComplete == 0) {

            System.out.println("Backup created successfully!");

        } else {
            System.out.println("Could not create the backup");
        }


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

ただし、mysql.exe および mysqldump.exe への正確なパスを伝える必要があります。

于 2014-08-13T12:15:58.347 に答える