Backup: java + firebird

4 respostas
marcos3

Pessoal, estou com dificuldades para conseguir restaurar um backup do firebird.

Abaixo o código que estou utilizando:

private void jbtRestaurarActionPerformed(java.awt.event.ActionEvent evt) {                                             
            EntityManager em = FabricaConexao.getConexao();
            em.clear();
            try {
                FabricaConexao.desligarBancoDados();
                FBBackupManager backup = new FBBackupManager();
                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ção concluída com sucesso!");
                
            } 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?

4 Respostas

TerraSkilll

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 :smile: 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.

Só que aí o sistema retorna a seguinte mensagem:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: EntityManagerFactory is closed
	at org.hibernate.jpa.internal.EntityManagerFactoryImpl.validateNotClosed(EntityManagerFactoryImpl.java:367)	at org.hibernate.jpa.internal.EntityManagerFactoryImpl.validateNotClosed(EntityManagerFactoryImpl.java:367)
	at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:316)
	at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:286)
	at util.FabricaConexao.getConexao(FabricaConexao.java:49)
	at view.Backup_Restaurar.jbtRestaurarActionPerformed(Backup_Restaurar.java:165)
	at view.Backup_Restaurar.access$100(Backup_Restaurar.java:31)
	at view.Backup_Restaurar$2.actionPerformed(Backup_Restaurar.java:96)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6525)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6290)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
	at java.awt.Container.dispatchEventImpl(Container.java:2278)
	at java.awt.Window.dispatchEventImpl(Window.java:2750)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
	at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:184)
	at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:229)
	at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:227)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:227)
	at java.awt.Dialog.show(Dialog.java:1084)
	at java.awt.Component.show(Component.java:1654)
	at java.awt.Component.setVisible(Component.java:1606)
	at java.awt.Window.setVisible(Window.java:1014)
	at java.awt.Dialog.setVisible(Dialog.java:1005)
	at view.Principal.jMenuItem14ActionPerformed(Principal.java:679)
	at view.Principal.access$3200(Principal.java:37)
	at view.Principal$34.actionPerformed(Principal.java:468)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
	at java.awt.Component.processMouseEvent(Component.java:6525)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6290)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
	at java.awt.Container.dispatchEventImpl(Container.java:2278)
	at java.awt.Window.dispatchEventImpl(Window.java:2750)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Estou achando que meu problema todo está na configuração da minha fábrica de conexões. Alguma conexão está ficando em aberto e por isso o problema.

Você poderia me passar alguma dica/sugestão sobre o que poderia fazer para eliminar este problema?

Desde já, obrigado pela atenção.

Criado 22 de fevereiro de 2017
Ultima resposta 24 de fev. de 2017
Respostas 4
Participantes 2