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 09-09-2004
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
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
__________________
Alejandro Jourdan
Responder Con Cita
  #2  
Antiguo 19-04-2007
ZRR ZRR is offline
Miembro
 
Registrado: jun 2005
Posts: 39
Poder: 0
ZRR Va por buen camino
Exclamation 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
Responder Con Cita
  #3  
Antiguo 19-04-2007
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
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;
__________________
Alejandro Jourdan
Responder Con Cita
  #4  
Antiguo 19-04-2007
ZRR ZRR is offline
Miembro
 
Registrado: jun 2005
Posts: 39
Poder: 0
ZRR Va por buen camino
Thumbs up

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

y funcionó correctamente
Muchas gracias

Saludos
Responder Con Cita
  #5  
Antiguo 24-08-2011
pescriba pescriba is offline
Miembro
 
Registrado: may 2003
Posts: 28
Poder: 0
pescriba Va por buen camino
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;
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


La franja horaria es GMT +2. Ahora son las 06:57:48.


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