Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problema al restaurar base de datos (https://www.clubdelphi.com/foros/showthread.php?t=14115)

jourdan 09-09-2004 20:58:56

Problema al restaurar base de datos
 
Hola Grupo, ojala alguien me pueda ayudar, tengo una aplicacion en la
cual como toque final al cerrarla quiero que haga un backup y un restore de la base de datos para quitar toda la basura que genera ya que uso
commitretaining para que no cierre los datasets, todo marcha bien en
las pruebas pero ya en la practica me sale el siguiente error al
correr el codigo del restore:

*****
Project tintorerias.exe raised exception class EIBInterBaseError with
message 'lock time-out on wait transaction
object C:\TINTORERIA_BASEDATOS\TINTORERIA_LOCAL.GDB is in use
could not drop database C:\tintoreria_basedatos\TINTORERIA_LOCAL.GDB
(database might be in use)'. Process stopped. Use Step or Run to
continue.
*****

Me imagino que es porque queda algo abierto en la base de datos y piensa que se pueden coorromper los datos, pero
antes de hacer esto segun yo cierro la base de datos y la transaccion
con las siguientes instrucciones:

DM_ServidorDatos.IB_TR_Tintoreria.Commit;
DM_ServidorDatos.IB_TR_Tintoreria.Active := false;
DM_ServidorDatos.IB_DB_Tintoreria.CloseDataSets;
DM_ServidorDatos.IB_DB_Tintoreria.Connected := false;

Es raro poruqe aveces funciona bien y a veces no funciona y marca el
arror arriba señalado

Lei algo en internet de que hay que tener acceso exclusivo a la base de datos pero no se como hacer esto, nunca encontre esta referencia "chapter 14, Getting exclusive access to a database, of Using Firebird"

Auxilio

Saludos y gracias

AJ

ZRR 19-04-2007 18:42:32

Tengo el mismo problema
 
Alguien sabe como resolver este problema?

El respaldo de la Base de datos lo puedo hacer sin problema, pero al intentar restaurarlo me marca el mismo error que a jourdan.

Estoy usando Delphi 7 y Firebird v1.5.2, y los componentes IBBackupService y IBRestoreService. Utilizo la cuenta de SYSDBA

Saludos

jourdan 19-04-2007 18:59:15

No recuerdo muy bien como lo solucione, ya que fue hace mucho pero aqui te copio el codigo que esta funcionando sin probelma!

//cerramos la conexion a la abse de datos si es que estaba abierta
DM_ServidorDatos.IB_DB_Tintoreria.Connected := false;

// copia base de DAtos para tener respaldo
MCopia.Visible := true;
ProgressBar1.Visible := true;
MCopia.Lines.clear;
Try
CopyFile('D:\tintoreria_basedatos\TINTORERIA_LOCAL.FDB',
'D:\tintoreria_basedatos\RESPALDO_DE_SEGURIDAD\TINTORERIA_LOCAL.FBK');

ProgressBar1.StepIt;

MCopia.Lines.Add('**Copia de Seguridad Realizada con exito');

except
showmessage('Error');
end;

//***
with IBBackupService1 do
begin
Active := True;
try
Screen.Cursor := crHourGlass;
BackupFile.Clear;
// Cargamos la opciones que nos indique el usuario
Options := [];
Options := Options + [IgnoreCheckSums];
Options := Options + [IgnoreLimbo];
//if chkbkStructure.Checked then Options := Options + [MetadataOnly];
//if chkbkGarbage.Checked then Options := Options + [NoGarbageCollection];
Options := Options + [NonTransportable];
// Cargamos la información que nos han indicado
// Base de datos origen
DatabaseName := 'D:\tintoreria_basedatos\TINTORERIA_LOCAL.FDB';
// Fichero GBK destino
BackupFile.Add('D:\tintoreria_basedatos\RESPALDO_TINTORERIA.GDK');
// ¿Ver el progreso de la operación?
//Verbose := chkbkVerbose.Checked;
Verbose := true;
// Comenzar
ServiceStart;
if Verbose then
begin
// Mientras no se llegue al final...
While not Eof do
// Cargamos las lineas de salida en el memo
MCopia.Lines.Add(GetNextLine);
// Avisamos que hemos terminado
MCopia.Lines.Add('¡ ** PROCESO TERMINADO ** !');
ProgressBar1.StepIt;
end;
finally
Active := False;
Screen.Cursor := crDefault;
end;
end;
ProgressBar1.StepIt;

with IBRestoreService1 do
begin
Active := True;
try
Screen.Cursor := crHourGlass;
DatabaseName.Clear;
BackupFile.Clear;
// Cargamos las opciones que nos indiquen
Options := [];
Options := Options + [Replace];
Verbose := true;
PageBuffers := 3000;
PageSize := 4096;
// Indicamos la base de datos destino
DatabaseName.Add('D:\tintoreria_basedatos\TINTORERIA_LOCAL.FDB');
// El archivo GBK origen
BackupFile.Add('D:\tintoreria_basedatos\RESPALDO_TINTORERIA.GDK');
// Cerramos la conexión con la base de datos.

DM_ServidorDatos.IB_DB_Tintoreria.CloseDataSets;
DM_ServidorDatos.IB_DB_Tintoreria.Connected := false;
// Comenzar
ServiceStart;

if Verbose then
begin
While not Eof do
MCopia.Lines.Add(GetNextLine);
MCopia.Lines.Add('¡ PROCESO TERMINADO !');
ProgressBar1.StepIt;
end;
finally
Active := False;
// Vovemos a conectar con la base de datos
Screen.Cursor := crDefault;
end;
end;

ZRR 19-04-2007 19:16:18

Ya pude solucionarlo, solo agregue
Código Delphi [-]
DM_Datos.IBBase.CloseDataSets;

y funcionó correctamente
Muchas gracias

Saludos

pescriba 24-08-2011 12:54:03

otra posibilidad
 
A mi me seguía pasando ese error. Es una empresa pequeña donde no hay problema en decir a las tres personas que cierren el programa.

Sólo se puede hacer el restore en la máquina donde está la base de datos.

Hay que cambiar la conexión de la base de datos a local ANTES de hacer el restore. Si la base de datos está en REMOTO, no cierra todo y aparece el error... Otra posibilidad es usar un programa externo SOLO para hacer backups/Restore...

Código Delphi [-]
     Memo1.Align := alClient;
      Memo1.Visible := True;
      Memo1.Lines.Clear;
      dmGeneral.IBRestore1.DatabaseName.Clear;

      temp := RightStr(dmGeneral.db.DatabaseName,
        Length(dmGeneral.db.DatabaseName)-
        Pos(':',dmGeneral.db.DatabaseName));

      dmGeneral.IBRestore1.DatabaseName.Add(temp);

      dmGeneral.IBRestore1.Active := True;
      dmGeneral.IBRestore1.BackupFile.Clear;
      dmGeneral.IBRestore1.BackupFile.Add( OpenDialog1.FileName);

    temp2:=dmGeneral.db.DatabaseName;

    dmGeneral.IBTransaction1.Active := False;
    dmGeneral.db.CloseDataSets;
    dmGeneral.db.Connected := False;
    dmGeneral.db.DatabaseName := temp; // Camino a la base de datos MODO LOCAL
    dmGeneral.db.Open;
    Sleep(2000);
    dmGeneral.IBTransaction1.Active := False;
    dmGeneral.db.CloseDataSets;
    dmGeneral.db.Connected := False;

      dmGeneral.IBRestore1.ServiceStart;
      while not dmGeneral.IBRestore1.Eof do begin
        Memo1.Lines.Add(dmGeneral.IBRestore1.GetNextLine);
        Application.ProcessMessages;
      end;
    end;
  Memo1.Visible := False;
  dmGeneral.db.DatabaseName := temp2;
  dmGeneral.db.Open;


La franja horaria es GMT +2. Ahora son las 07:52:31.

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