
Беда пришла откуда не ждали… У клиента завис процесс “Касса”, так что не смог снять процесс через Диспетчер задач. Рабочее место “Касса” — одновременно сервер всей системы.
Клиент принял решение ресетнуть через кнопку.
В итоге умерла DB. FireBird 2.5
Backup’ы настроены не были, так что последняя версия БД, которая случайно лежала у меня на винте, была минус 8 дней. Подняли по-быстрому с неё. Но суть дальше.
Как делать бекапы для FireBird.
Я написал скрипт, который, когда его запускают, делает резервное копирование базы данных с именем БазаДаннах_30_05_2017_23_07_51.fbk
@echo off set "currentTime=%Time: =0%" set now=%date:~-4%_%date:~3,2%_%date:~0,2%_%currentTime:~0,2%_%currentTime:~3,2%_%currentTime:~6,2% set user=SYSDBA set password=masterkey set database_name=PARKDB.FDB set backup_name=Backup\PARKDB set ext=.fbk set backup_filename=%backup_name%_%now%%ext% echo %backup_filename% nbackup -U %user% -P %password% -B 0 %database_name% %backup_filename%
%date:~3,2%
Это означает взять из результата date (это системная функция Windows), 2 символа, начиная с 3 позиции в строке. Обычный %date% = 31.05.2017
set "currentTime=%Time: =0%"
Означает брать время, учитывая 0, когда часы меньше 10, то есть без этой команды, мы при выполнении команд:
set now=%date:~-4%_%date:~3,2%_%date:~0,2%_%currentTime:~0,2%_%currentTime:~3,2%_%currentTime:~6,2%
получили бы, что now=2017_05_31_ 0_44_33, а имя файла выглядело бы так: Backup\PARKDB_2017_05_31_ 0_44_33.fbk. Пробел не сильно виден, но он неприемлем в названии файла для nbackup дата и время берутся из текущего времени системы. Это вроде рассказал :) Далее, чтобы скрипт выполнялся постоянно, я добавил задачу в планировщик задач виндовс, он каждые 4 часа запускает мой скрипт и создается новая БД, далее я научился создавать задачи в планировщике задач через командную строку:
@echo off set script_name=e:\SoftBuild\Parking\DB\DB_Backup.bat set task_name=LotParkingBackup SCHTASKS /Create /SC DAILY /TN %task_name% /TR %script_name% /HRESULT /F /RI 240 /DU 24:00 /v1
Детали параметров можете посмотреть в хелпе. SCHTASKS /Create /?
Потом добавил в инсталлятор создание скрипта, который делает то, что я описал только что, и запуск из инсталлятора:
function NextButtonClick(CurPageID: Integer): Boolean; var ServerHost, ServerPort, DBFileName, FBDirPath: string; ResultCode, ErrorCode: Integer; UDFFrom, UDFTo, ReaderPort: string; RegistryTaskFile, DBDirPath, BackupScriptPath, RegistryFileName: string; begin if CurPageID = SettingsPage.ID then begin ServerHost := SettingsPage.Values[0]; ServerPort := SettingsPage.Values[1]; DBFileName := SettingsPage.Values[2]; if IsComponentSelected(cDB) then begin DBDirPath := Copy(DBFileName, 1, Pos('PARKDB.FDB', DBFileName) - 1); BackupScriptPath := DBDirPath + 'DB_Backup.bat' RegistryTaskFile := '@echo off' + #13#10 + 'set script_name=' + BackupScriptPath + #13#10 + 'set task_name=LotParkingBackup' + #13#10 + 'SCHTASKS /Create /SC DAILY /TN %task_name% /TR %script_name% /HRESULT /F /RI 240 /DU 24:00 /v1' + #13#10; RegistryFileName := DBDirPath + 'DB_RegistryBackup.bat'; SaveStringToFile(RegistryFileName, RegistryTaskFile, False); Exec(ExpandConstant(RegistryFileName), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode); end; end; end;
Теперь у меня есть скрипт, который делает резервную копию, и скрипт, который регистрирует задачу, далее я научился удалять задачу из планировщика, опять же из командной строки:
@echo off set task_name=LotParkingBackup SCHTASKS /DELETE /TN %task_name% /F
И добавил в инсталлятор. что если мы делаем удаление программы Парковка, то нужно запустить скрипт, который удалит задачу из Планировщика:
[UninstallRun] Filename: "{app}\DB\DB_DeleteTask.bat"; WorkingDir: "{app}\DB\"; Flags: runhidden waituntilterminated; Components: DB
В итоге у нас каждые 4 часа есть бекап, и если мы делаем UnInstall, то всё чисто :)
Оригинал.
