Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.07;
Скачать: CL | DM;

Вниз

Копирование базы InterBase после Backup   Найти похожие ветки 

 
Faeton   (2003-07-16 16:53) [0]

Помогите выяснить в чем причина ошибки.
После восстановления из Backup в Temp директорию я удаляею текущую БД и копирую из Temp новую в дир.Data откуда идет подключение. Проблема в сл. при удалении и копировании идет проверка на наличие файла в нужной дир. и только после этого подключение, но после копир и попытки подключения выд. ошибка
Unsuccessful execution caused by an unavailable resource
Invalid database handle(no active connection)
но если самому скопировать базу из Temp->Data то все подк. нормально. Создаеться впечатление что на еще неудаленный файл происходит копирование и конечно наруш. струк. БД поэтому и нет подкю. Ниже привожу текст проги.(исполь. InterBase6 и комп.FIBPlus)
if DataBaseConnect then begin
UserRegistry(false);
Data.CloseDB;
Data.Db.Connected:=false;
DataBaseConnect:=false;
end;
TempFile:=PathBackup+"\Temp\DataBase.gdb";;
DelFile:=PathPRG+"Data\database.gdb";
if FileExists(TempFile)then
DeleteFile(TempFile);
Data.IBRestore.DatabaseName.Text:=PathBackup+"\Temp\DataBase.gdb";
Data.IBRestore.BackupFile.Text:=FileListBox1.FileName;
Data.IBRestore.Attach;
Data.IBRestore.ServiceStart;
repeat
until Data.IBRestore.IsServiceRunning;
if DeleteFile(DelFile) then begin
repeat
until not FileExists(DelFile);
delay(3000);
if CopyFile(PChar(TempFile),PChar(DelFile),false) then begin
ShowMessage("База данных востановлена - +PathPRG+"data\database.gdb ");
Data.Db.Connected:=true;
UserRegistry(true);
Data.OpenDB;
DataBaseConnect:=true;
end;
end
else begin
ShowMessage("Немогу удалить базу "+PathPRG+"data\database.gdb - "+#13#10+
"(возможо с ней кто-то работает) обратитесь к администратору БД");
end;
Зарание благодарен.


 
Alexandr ©   (2003-07-17 06:36) [1]

перед копированием надо сервис останавливать.
Иначе косяков не оберешься.


 
faeton ©   (2003-07-17 11:35) [2]

>перед копированием надо сервис останавливать.
>Иначе косяков не оберешься.

подскажите плиз - А как ето сделать програмно ?
и (вытикающий вопрос) как вычислить пользователей возможно еще раб. с БД (средствами IB)?


 
Alexandr ©   (2003-07-17 11:53) [3]

по-разному, смотря как он запущен.
А вообще замену ненадо часто делать. Раз в месяц а то и реже - нормально.
Да и руками это делать надежнее...


 
Andriano ©   (2003-07-17 11:54) [4]

Ну ты придумал...
Почитал бы об InterBase, знал бы что он даже после отключения от базы может заниматься всякими служебными обязанностями с твоей базой.

Сервис останавливается так
C:\FB\bin\instsvc.exe STOP

Но надо обязательно дождаться завершения работы Instsvc.exe

Я делал так

procedure RunAndWait(Application:TApplication; AppName, Params, CurrentDir: String; ShowProcess:boolean=true);
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
SI.lpReserved := nil;
SI.lpDesktop := nil;
SI.lpTitle := nil;
SI.dwFlags := STARTF_USESHOWWINDOW; //Не игнорировать wShowWindow
if ShowProcess then
SI.wShowWindow := SW_SHOW //Показывать
else
SI.wShowWindow := SW_HIDE; //Не показывать
SI.cbReserved2 := 0;
SI.lpReserved2 := nil;
if CreateProcess(nil, PChar(AppName+" "+Params), nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, PChar(CurrentDir), SI, PI) then begin
while not(Application.Terminated) and (WaitForSingleObject(PI.hProcess, 100)=WAIT_TIMEOUT) do
Application.ProcessMessages;
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
//TerminateProcess(PI.hProcess, 7);
end else
RaiseLastWin32Error;
end;


begin
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
exit;

Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_LOCAL_MACHINE;
Registry.OpenKey("SYSTEM\CurrentControlSet\Services\InterBaseServer",False);
DisplayName:=trim(Registry.ReadString("DisplayName"));
Registry.CloseKey;
//Label4.Caption:=DisplayName;
//Label4.Update;
AddMemo("Сервис DisplayName: "+DisplayName);

Registry.OpenKey("SOFTWARE\Borland\InterBase\CurrentVersion",False);
FB_Sroot:=trim(Registry.ReadString("ServerDirectory"));
Registry.CloseKey;
if FB_Sroot<>"" then
if FB_Sroot[length(FB_Sroot)]<>"\" then
FB_Sroot:=FB_Sroot+"\";
//Label2.Caption:=FB_Sroot;
//Label2.Update;
AddMemo("Директория сервера: "+FB_Sroot);

Registry.Free;

if DisplayName="" then
exit;

if MessageDlg("Удалить сервис InterBase Server с Вашего компьютера", mtConfirmation, [mbOK, mbCancel],0)<>mrOk then
exit;

Instsvc:=FB_Sroot+"instsvc.exe";
if not(FileExists(Instsvc)) then
raise Exception.Create("Не найдена утилита "+Instsvc);

AddMemo("Останавливаем сервис ... ");
RunAndWait(Application, """+Instsvc+""", "stop", ".", false);
AddMemo(SuccesStr, true);

AddMemo("Удаляем сервис ... ");
if paramstr(1)="YES" then
RunAndWait(Application, """+Instsvc+""", "remove", ".");
AddMemo(SuccesStr, true);
end;





 
faeton ©   (2003-07-17 12:04) [5]

Никто и не собираеться часто делать восстановление из Backup.
Весь фокус в том что прога передаеться конкретному заказчику который не имеет админа БД и ему нужен простой интерфейс востанновления из Архива(Backup) без ручной работы и командных строк.


 
faeton ©   (2003-07-17 12:37) [6]

>Почитал бы об InterBase, знал бы

Этоя итак знаю , данный код откльчает от базы конкр.пользователя
выполняющего оп. восстановления из Backup (чтоба спокойно грохнуть базу).
Насколько я вас понял то мои действия должны идти в сл. посл.
1.отключаю всех ползователей.
2.востанавливаю из Backup новую базу в темр
3.останавливаю сервис.
4.грохаю тек.базу
5.копирую базу
6.запускаю сервис
7.подключаюсь.
Осталось дело за малым узнать кто в данный момент подключен и как его програмно отключить от базы (думаю что просто Event - ом тут неотделаешся - вдруг польз.куда то салил.) :((
Если я прав.то инф.о подключеных users должна быть в Isc4.gdb ?


 
Zacho ©   (2003-07-17 12:48) [7]

Сделать Shutdown. Если с помощью IBX - то TIBConfigService.ShutdownDatabase Правда, SYSDBA ты так не отключишь.



Страницы: 1 вся ветка

Текущий архив: 2003.08.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
1-20557
JS
2003-07-23 19:48
2003.08.07
TRegistry.SaveKey


9-20372
X-Vizitor
2003-02-06 23:42
2003.08.07
Opengl - прохождение сквозь стены


1-20518
Alex134
2003-07-25 01:21
2003.08.07
Свойство-компонент


3-20413
abc
2003-07-16 16:33
2003.08.07
почему перестала работать фильтрация на русском языке???


3-20424
Nevermind
2003-07-16 17:24
2003.08.07
IXMLNode