Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-20536
The X
2003-07-26 17:41
2003.08.07
Как узнать количество символов (с пробелами) в TMemo или TDBMemo?


1-20482
zloy_dima
2003-07-25 10:58
2003.08.07
Stream


14-20711
Vovchik_A
2003-07-23 15:51
2003.08.07
Вопрос !


3-20456
Paha
2003-07-17 13:57
2003.08.07
Поток и Query


8-20635
Dankin
2003-04-14 04:04
2003.08.07
DPX формат в Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский