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ダンプによって設定されます)。
ヒントはありますか?
ありがとう; 私はこれに腹を立てています:(