Pessoal, estou com dificuldades para conseguir restaurar um backup do firebird.
Abaixo o código que estou utilizando:
privatevoidjbtRestaurarActionPerformed(java.awt.event.ActionEventevt){EntityManagerem=FabricaConexao.getConexao();em.clear();try{FabricaConexao.desligarBancoDados();FBBackupManagerbackup=newFBBackupManager();backup.setUser("SYSDBA");backup.setPassword("masterkey");backup.setPort(3050);backup.setHost("127.0.0.1");backup.setDatabase("C:/bd/Mais_Saber.FDB"); backup.setBackupPath(getRestaurado());//getRestaurado é o caminho onde o arquivo de backup está backup.setVerbose(true); backup.setRestoreReplace(true); backup.restoreDatabase(); JOptionPane.showMessageDialog(null, "Restauraçãoconcluídacomsucesso!"); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "Erro:"+e.getMessage());}}
Acontece que ao ser executado aparece a seguinte mensagem:
Erro: GDS Exception. 336330985. could not drop database C:/bd/MaisSaber.fdb (database might be in use)
Estou trabalhando com JPA.
Alguém sabe como posso resolver? Teria que desconectar do banco, fazer o backup… se for isso mesmo, como conectar novamente ao final da restauração?
Sim, você precisa estar totalmente desconectado ao realizar a restauração. Uma das coisas chatas do Firebird é que as vezes a conexão fica ativa, mesmo os datasets e connecttions estando fechados.
O erro apresentado é exatamente porque o Firebird não conseguiu apagar o arquivo do banco, que está em uso. Como o backup do Firebird apaga o arquivo antes de iniciar (não é um método muito interessante, mas enfim), acaba tendo problemas como esse.
Supondo que sua FabricaConexao realiza a conexão sob demanda, para reconectar é só abrir a conexão novamente após o término do backup, do mesmo jeito que você fez ao iniciar o programa.
Abraço.
marcos3
Caro colega, desde já, obrigado por responder.
Você comentou aqui:
Poderia me sugerir (ou mesmo indicar um link) outro de modo de implementar a rotina de restauração do bakcup?
TerraSkilll
Me referia ao método de backup/restore que o Firebird adota, que é basicamente apagar o arquivo original e criar um novo no lugar. Pra mim, parece uma operação meio perigosa. Já tive problemas com o restore não funcionar e ficar sem o banco por um tempo (afinal, o arquivo original foi apagado). Tem umas outras opções (backups incrementais), mas nunca testei.
O que você pode testar para saber se o banco está em uso é fazer o restore pela linha de comando usando a ferramenta gbak (que é o que FBBackupManager deve usar por baixo dos panos). Assim, na sua aplicação, você cria um botão grande e amarelo que fecha as conexões, daí você tenta rodar o gbak. Se falhar, é porque ele ainda está com conexões ativas.
O Firebird tem uns outros utilitários para verificar conexões abertas, dê uma pesquisada. Pode ser que ajude.
Abraço.
marcos3
TerraSkilll, contínuo com problemas!
Veja só, antes da iniciar o backup peço a JPA que feche a EntityManagerFactory e EntityManager, assim a restauração está acontecendo normalmente, mas aí logo após o término eu chamo o método que obtém (ou deveria obter) nova conexão com o banco de dados.