我正在尝试从使用 mysqldump 生成的文件中恢复 MySQL 数据库。我使用包含恢复计划的每个查询的 ArrayList 来执行此操作,并使用 Statement 执行每个查询。
但有时,它会在进程的某个点停止(在不同的执行中可能会有所不同)。它不显示任何错误消息;它只是挂起(发生这种情况时,我需要重新启动 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 转储设置)。
有什么提示吗?
谢谢; 我对此很生气:(