Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-06-2008
marlulipe marlulipe is offline
No confirmado
 
Registrado: jun 2007
Posts: 16
Poder: 0
marlulipe Va por buen camino
Question Back Up y Restore con Firebird

Hola, estoy desarrollando una app con Delphi 5 y Firebird 1.5. Quiero que el usuario pueda realizar un back up desde la app para lo cual uso el gbak de Firebird. Esto es lo que hago, desde un menu contextual el usuario pide realizar una copia de seguridad:

Código:
procedure RealizarBackup (Base,Destino:string);
var RutaGbak,Params:String;
begin
   if FileExists(ExtractFilePath(Application.ExeName) + 'gbak.exe') then begin
       RutaGbak := ExtractFilePath(Application.ExeName)+ 'gbak.exe';
       Params := ' -b ';
       Params := Params + ' -user SYSDBA -password masterkey ';
       Params := Params + AnsiQuotedStr(Base,'"');
       Params := Params + ' ' + AnsiQuotedStr(Destino,'"');
       ShellExecute(Application.Handle, nil,Pchar(RutaGbak), Pchar(Params),Pchar(ExtractFilePath(RutaGbak)), 0);
   end;
end;
Donde Base=PathAplicacion+'BD.GDB' y Destino es el path donde guardo mi backup cone extensión 'hbkp'
Luego RutaGbak es el path donde está mi gbak.exe y además copié en la misma carpeta fbclient.dll

El archivo se genera sin problemas. Pero cuando lo restaura en realidad los cambios no se reflejan, o sea si modifico algo a propósito y luego restauro la copia anterior sigo viendo la modificación no se restaura la copia realmente. Esto es lo que hago para restaurar:

Código:
procedure RestaurarBackup (Origen,BaseDestino:String);
var RutaGbak, Params: String;
begin
   if FileExists(ExtractFilePath(Application.ExeName) + 'gBak.exe') then begin
       RutaGbak:=ExtractFilePath(Application.ExeName) + 'gBak.exe';
       Origen:=ExtractShortPathName(Origen);
       Params := ' -r ';
       Params := Params + ' -user SYSDBA -password masterkey ';
       Params := Params + AnsiQuotedStr(Origen,'"');
       Params := Params + ' ' + AnsiQuotedStr(BaseDestino,'"');
       ShellExecute(Application.Handle, nil,Pchar(RutaGbak), Pchar(Params),Pchar(ExtractFilePath(RutaGbak)), 0);
   end;
end;
Donde Origen es donde está el archivo '.hbkp' y BaseDestino es el nombre que debe tener la BD: PathAplicacion+'BD.gdb'

Este metodo RestaurarBackUp es llamado desde este:

Código:
procedure TFormPrincipal.RestaurarBasedeDatos1Click(Sender: TObject);
begin
   if MessageDlg('Ud está por restaurar la Base de Datos. ¿Desea continuar?',mtWarning,[mbOk,mbNo],0)=mrOk then begin
      FormPrincipal.BD.Close;
      OpenDAbrir.InitialDir:=PathAplicacion;
      if OpenDAbrir.Execute then begin
         RestaurarBackup(OpenDAbrir.FileName,PathAplicacion+'BDHome.gdb');
         FormPrincipal.BDHome.Open;
         if FormPrincipal.BD.TestConnected then begin
            FormPrincipal.BD.Open;
        ShowMessage('La Base de Datos se restauró correctamente.');
         end
         else
            ShowMessage('La Base de Datos no pudo restaurarse.');
      end;
   end;
end;
Donde cierro la base, y luego la vuelvo a abrir y testear la conexión.

¿Qué puede suceder que no restaure la copia? Si alguien me puede dar una mano estaré muy agradecida!!

Saludos!
Responder Con Cita
  #2  
Antiguo 20-06-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Supongo que el problema es que el backup o el restore no termina bien.

El comando GBAK tiene un parámetro -Y con el que puedes guardar el log del restore.
Código:
gbak -r origen.gbk destino.gdb -user SYSDBA -pass masterkey -Y restore.log
Lo mismo con el backup:
Código:
gbak -b origen.gdb destino.gbk -user SYSDBA -pass masterkey -Y backup.log
Lee el backup.log / restore.log. Si está vacío el gbak ha sido exitoso. Si no, encontraras el mensaje de error.
Responder Con Cita
  #3  
Antiguo 20-06-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Hola

He visto que esto de los Backup y Restore es muy común.

Pues nada, les dejo un enlace a un pequeño programa que he hecho para realizar estas tareas sin usar la consola de comandos.

FBBackRest.zip

Espero les sea de utilidad.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #4  
Antiguo 21-06-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: may 2004
Ubicación: Valencia - España
Posts: 141
Poder: 20
Angel Fernández Va por buen camino
Gracias egostar. Lo he bajado y ya lo voy probando.

Un saludo.
Responder Con Cita
  #5  
Antiguo 21-06-2008
marlulipe marlulipe is offline
No confirmado
 
Registrado: jun 2007
Posts: 16
Poder: 0
marlulipe Va por buen camino
Unhappy

Cita:
Empezado por duilioisola Ver Mensaje
Supongo que el problema es que el backup o el restore no termina bien.

El comando GBAK tiene un parámetro -Y con el que puedes guardar el log del restore.
Código:
gbak -r origen.gbk destino.gdb -user SYSDBA -pass masterkey -Y restore.log
Gracias. Así es, se produce el siguiente error al intentar restaurar:

gbak: ERROR: could not drop database C:\Home\BDHome.gdb (database might be in use)

Cierro la base de datos antes de hacer el restore y luego la vuelvo a abrir, así:

Código:
FormPrincipal.BD.Close;           // BD es un TIBDatabase
..
// restauro
FormPrincipal.BDHome.Open;
Pero parace ser que no es suficiente, ya que el error dice que al intentar borrarla no puede porque sigue en uso. ¿Alguna sugerencia?

Como siempre gracias por sus respuestas!!!
Responder Con Cita
  #6  
Antiguo 22-06-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Pon una pausa entre el close y el backup/restore. En ese momento haz un netstat

netstat -n (en windwos)
netstat -a -n | grep 3050 (en linux)

Busca las conexiones al puerto 3050 con estado ESTABLISHED. Te dirá de qué ip vienen. Si hay alguna, ese es el problema. Hay una conexión que será LISTENING, que es el puerto del ordenador que escucha y habrá seguramente una que diga TIME WAIT. Son las cerradas recientemente.

Si es Firebird 2, entonces el problema puede ser que al gbak debas agregarle el parámetro para que sobreescriba la base de datos si existe. En este momento no me acuerdo cual es, pero podrás averguarlo escribiendo solo gbak.

Veo además que utilizas dos bases de datos (DB y DBHome). Asegúrate de que no están conectadas ninguna de las dos...
Código Delphi [-]
if FormPrincipal.DB.Connected then
   FormPrincipal.DB.Close;
if FormPrincipal.DBHome.Connected then
   FormPrincipal.DBHome.Close;

//Backup
//Restore

FormPrincipal.DBHome.Open;
Responder Con Cita
  #7  
Antiguo 25-06-2008
marlulipe marlulipe is offline
No confirmado
 
Registrado: jun 2007
Posts: 16
Poder: 0
marlulipe Va por buen camino
Muchas gracias por sus respuestas. Finalmente opté por crear una aplicación independiente que es llamada desde la aplicación principal para realizar la restauración. Cierra la aplicación así la BD no está en uso y luego de restaurarla la vuelve a abrir. Así pude solucionarlo :-)
Responder Con Cita
  #8  
Antiguo 25-06-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por marlulipe Ver Mensaje
Muchas gracias por sus respuestas. Finalmente opté por crear una aplicación independiente que es llamada desde la aplicación principal para realizar la restauración. Cierra la aplicación así la BD no está en uso y luego de restaurarla la vuelve a abrir. Así pude solucionarlo :-)
Pues que bien que ya hayas solucionado el problema, pero, me queda la duda de porque mantienes la conexion con la base todo el tiempo, no seria mas economico abrirla y cerrarla cada vez que requieres de ella?

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
No puedo hacer restore de una bdd firebird en delphi Gaby123 Conexión con bases de datos 2 30-01-2007 21:30:57
Problema en memoria al hacer restore en firebird garza Firebird e Interbase 0 20-09-2006 21:23:58
Back up tato Conexión con bases de datos 2 29-04-2006 02:59:00
Back up gdb geovany Conexión con bases de datos 2 10-12-2004 12:16:31
Back Restore o Backup cmgenny Varios 1 04-05-2003 12:19:23


La franja horaria es GMT +2. Ahora son las 18:53:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi