Форум: "Базы";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
ВнизКопирование базы 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c