FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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; 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; 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; ¿Qué puede suceder que no restaure la copia? Si alguien me puede dar una mano estaré muy agradecida!! Saludos! |
#2
|
||||
|
||||
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 Código:
gbak -b origen.gdb destino.gbk -user SYSDBA -pass masterkey -Y backup.log |
#3
|
|||
|
|||
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 |
#4
|
|||
|
|||
Gracias egostar. Lo he bajado y ya lo voy probando.
Un saludo. |
#5
|
|||
|
|||
Cita:
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; Como siempre gracias por sus respuestas!!! |
#6
|
||||
|
||||
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...
|
#7
|
|||
|
|||
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 :-)
|
#8
|
|||
|
|||
Cita:
Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
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 |
|