@echo off
FOR /f "tokens=1-3 delims=- " %%a IN ('date/t') DO (
SET _yr=%%a
SET _mh=%%b
SET _dy=%%c
)
FOR /f "tokens=1-4 delims=: " %%a IN ('time/t') DO (
SET _hr=%%a
SET _ms=%%b
)
SET _fname=jakas_nazwa_pliku_z_kopia_dalej_jest_data_i_godzina_%_yr%%_mh%%_dy%%_hr%%_ms%
SET _dbackup=c:\siezka\do\katalogu\backup(zakonczona slashem)\
SET _database=c:\sciezka\do\pliku\kspps.fdb
SET _pass=haslo_do_szyfrowania_plików_z_kopiami
SET _qbak=C:\Program Files (x86)\Firebird\Firebird_2_0\bin\gbak.exe
SET _udb=SYSDBA
SET _pdb=masterkey
SET _extb=.bak
SET _extz=.7z
echo Trwa tworzenie kopii bazy danych...
echo .
echo .
if exist %_dbackup%%_fname%%_extb% (del %_dbackup%%_fname%%_extb%)
"%_qbak%" -v -t -user %_udb% -password %_pdb% %_database% %_dbackup%%_fname%%_extb%
echo .
echo .
echo Trwa kompresowanie kopii bazy danych...
if exist %_dbackup%%_fname%%_extz% (del %dbackup%%_fname%%_extz%)
"%_dbackup%7za.exe" a -mx -mhe -P%_pass% %_dbackup%%_fname%%_extz% %_dbackup%%_fname%%_extb%
DEL /Q %_dbackup%%_fname%%_extb%
echo .
echo .
:FINDUSB
echo Trwa wyszukiwania nosnika USB
for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,description^,drivetype 2^>NUL`) do (
if %%l equ 2 (
echo Nosnik USB to %%i
SET _usb=%%i
goto COPYUSB
)
)
echo "Nie znaleziono nosnika USB, wloz nosnik i nacisnij dowolny klawisz"
echo .
pause
goto FINDUSB
:COPYUSB
echo .
echo .
echo Trwa kopiowanie archiwizacji na nosnik USB.
xcopy %_dbackup%%_fname%%_extz% %_usb%
echo .
echo Kopia zakonczona
pause
runas.exe /user:nazwa_uzytkownika_z_odpowiednimi_uprawnieniami /savecred c:\sciezka\do\skrypt.bat
...jedyny komputer w całej przychodni stoi w rejestracji i na nim jest baza.właśnie w jednym poz mam. Dzięki za pomoc.
Gbak creates a consistent backup of the database by starting a transaction that spans the backup period. When the backup is complete, the transaction is ended and this means that the backup process can be run while users are working in the database.
GBAK is able to perform a backup while the database is running. There is no need to shut down the database during a GBAK backup. GBAK will create a consistent snapshot of the database at the time it starts running.
Before you consider using other tools to take a backup of your Firebird database, make sure that you know what the tools do and how a running database will be affected by them. For example, if you use Winzip to create a compressed copy of a database and you do it when users are accessing the system, the chances of a successful restore of that database are slim. You must either always use the gbak or nbackup tools which know how the database works, or, use gfix to shut the database down completely before you even attempt to backup the database file(s).
Zastanawia mnie jeszcze jedno. Dlaczego na wszystkich polskich stronach dotyczących robienia kopii bazy firebird zaznacza się, żeby ją robić jak użytkownicy nie pracują w systemie?Z cytatów 1 i 2 wynika jednoznacznie, że gbak może działać na otwartej bazie.
@echo off
if [%1] EQU [] (
SET _par1=u
) else (
SET _par1=%1
)
for /f "tokens=1-3 delims=- " %%a IN ('date/t') do (
SET _yr=%%a
SET _mh=%%b
SET _dy=%%c
)
for /f "tokens=1-4 delims=: " %%a IN ('time/t') do (
SET _hr=%%a
SET _ms=%%b
)
:-------- Parametry do ustawienia -------------------------------
SET _bakname=%_par1%_backup_%_yr%%_mh%%_dy%%_hr%%_ms%
SET _bakdir=D:\KS\BACKUP\
SET _database=D:\KS\KSPPS.FDB
SET _passu=haslo1 (szyfrowanie kopii na usb)
SET _passa=haslo2 (szyfrowanie kopii innej niz usb)
SET _qbak=C:\Program Files\Firebird\Firebird_2_5\bin\gbak.exe
SET _udb=SYSDBA
SET _pdb=masterkey
SET _bakext=.bak
SET _zipext=.7z
SET _logext=.txt
:---------------------------------------------------------------
if %_par1% EQU u (
SET _pass=%_passu%
) else (
SET _pass=%_passa%
)
echo ********************************************** >> %_bakdir%%_par1%_log.txt
echo %date% %time% %_bakname% >> %_bakdir%%_par1%_log.txt
echo ********************************************** >> %_bakdir%%_par1%_log.txt
echo Tworzenie kopii bazy danych, prosze czekac...
if exist %_bakdir%%_bakname%.* (del %_bakdir%%_bakname%.*)
"%_qbak%" -v -b -ig -user %_udb% -password %_pdb% %_database% %_bakdir%%_bakname%%_bakext% -Y %_bakdir%%_bakname%%_logext%
echo Kompresowanie kopii bazy danych, prosze czekac...
"%_bakdir%7za.exe" a -mx -mhe -P%_pass% %_bakdir%%_bakname%%_zipext% %_bakdir%%_bakname%.* > nul
echo Weryfikowanie archiwum...
"%_bakdir%7za.exe" t -P%_pass% %_bakdir%%_bakname%%_zipext% >> %_bakdir%%_par1%_log.txt
del %_bakdir%%_bakname%%_bakext%
del %_bakdir%%_bakname%%_logext%
if %_par1% EQU u goto USB
if [%2] EQU [] (
Echo Blad: Nie podano sciezki w parametrze - archiwum nie skopiowane >> %_bakdir%%_par1%_log.txt
goto END
)
if exist %2 (
echo Kopiowanie archiwizacji do wybranej lokalizacji...
xcopy %_bakdir%%_bakname%%_zipext% %2
echo Kopia do %2 >> %_bakdir%%_par1%_log.txt
) else (
echo Bledna sciezka, archiwizacja nie zostala skopiowana w podane miejsce.
echo Blad: Bledna sciezka %2 - archiwum nie skopiowane>> %_bakdir%%_par1%_log.txt
)
goto END
:USB
echo Wyszukiwania nosnika USB...
for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,description^,drivetype 2^>NUL`) do (
if %%l equ 2 (
echo Znaleziony nosnik USB to %%i
SET _usb=%%i
goto COPYUSB
)
)
echo Nie znaleziono nosnika USB.
echo -Jesli chcesz kontynuowac, zainstaluj nosnik USB i nacisnij [ENTER].
SET _answer=A
SET /P _answer= -Jesli chcesz przerwac nacisnij klawisz [Q] a nstepnie [ENTER]:
if /i [%_answer%] EQU [Q] (
echo Zrezygnowano z kopii na nosnik USB.
echo Blad: Nie skopiowano na nosnik USB >> %_bakdir%%_par1%_log.txt
goto END
)
goto USB
:COPYUSB
echo Kopiowanie archiwizacji na nosnik USB...
xcopy %_bakdir%%_bakname%%_zipext% %_usb%
Echo Skopiowano na nosnik %_usb% >> %_bakdir%%_par1%_log.txt
:END
echo .
echo .
echo Zakonczono tworzenie kopii.
pause
' ***************************************************
' * Skrypt do archiwizacji bazy danych Firebird *
' * v1.01 (2016-04-25) *
' ***************************************************
'
'Wykonywana komenda: gbak.exe -v -b -ig -user Uzytkownik -password Haslo Baza.fdb kopia.bak -Y log.txt
'Za pomocą programu gbak.exe tworzona jest archiwizacja oraz log do katalogu określonego w zmiennej
'uTmpDir. Te pliki są kompresowane i szyfrowane przy użyciu programu 7za.exe a następnie usuwane.
'W katalogu uTmpDir pozostaje zaszyfrowana kopia, która następnie jest kopiowana do lokalizaji
'określonej w argumencie /dest
'
'Zmianę argumentów polecenia gbak.exe należy wykonać w zmiennej sCommand
'
'----------------------------------------------------------------------------------------------------------
'Uruchamianie z argumentami: script.vbs /arg1:wartosc /arg2:wartosc
'
'Argumenty:
' /dest ścieżka docelowa dla wykonanej kopii (/dest:d:\backup lub /dest:"d\kopia bezpieczenstwa")
' Brak argumentu lub nieprawidłowa ścieżka spowoduje stworzenie archiwizacji tylko w roboczym
' folderze uTmpDir.
' /del usuwanie WSZYSTKICH PLIKÓW Z ROZSZERZENIAMI ZDEFINIOWANYMI W ZMIENNYCH sExtB, sExtZ i sExtL
' z lokalizacji określonej w argumencie /dest, starsze niż liczba dni podana jako wartość argumentu.
' Domyślnie te rozszerzenia to .bak, .7z i .txt
' Przy usuwaniu brana jest pod uwagę data ostatniej modyfikacji pliku.
' Brak argumentu - żadne pliki nie są usuwane. Dla celów bezpieczeństwa, jeśli wartość argumentu
' wynosi mniej niż 7 skrypt zmienia tą wartość na 7.
' (/del:14) powoduje usunięcie plików starszych niż 14 dni (pod uwagę brana jest data modyfikacji pliku)
' /deltmp parametr stosowany identycznie jak /del z tą różnicą, że usuwane są pliki z folderu uTmpDir
' UWAGA: użycie opcji [Usuń kopie starsze niż XX dni] w GUI powoduje zastosowanie jedynie argumentu /del.
' Ta opcja w GUI nie usuwa plików z katalogu uTmpDir.
' /p przedrostek do nazwy pliku kopii bezpieczenstwa (/p:a)
' /pass określa które hasło ma być użyte: (/pass:2) kopia jest szyfrowana przy użyciu uPassBak2, brak
' argumentu lub błędny powoduje, że kopie są szyfrowane przy użyciu uPassBak1
' /hta argument używany tylko gdy skrypt jest wywoływany przez GUI (/hta:xxxxxxx). Wyświetlane są wtedy
' w oknie wywołującym skrypt odpowienie informacje o aktualnie wykonywanej czynności. Wartość
' generowana jest w skrypcie GUI.
' /info gdy skrypt uruchamiany jest bez GUI przy starcie i zakończeniu może wyświetlić odpowiednie komunikaty.
' W tym celu należy użyć tego argumentu (/info:yes)
' /email wysyłanie wiadomości email w przypadku wystąpienia błędów (/email:yes)
'----------------------------------------------------------------------------------------------------------
'Poniższe zmienne należy zdefiniować według swoich potrzeb
'----------------------------------------------------------------------------------------------------------
'nazwa kopii bezpieczeństwa: p_uFileName_strDate
'p - przedrostek podany w argumencie /p
'uFileName - poniższa zmienna
'strDate - data i godzina utowrzenia kopii
uFileName = "backup"
uTmpDir = "C:\KS\BACKUP\" 'sciezka do katalogu roboczego zakonczona slashem
uDb = "C:\KS\BAZA\KSPPS.FDB" 'sciezka do pliku kspps.fdb
u7zaDir = "C:\KS\BACKUP\" 'lokalizacja programu 7za.exe
uPassBak1 = "haslo1" 'czytaj argument /pass
uPassBak2 = "haslo2" 'czytaj argument /pass
uDbUser = "sysdba" 'uzytkownik bazy firebird
uDbPass = "masterkey" 'haslo do bazy firebird
uGbak = "C:\Program Files\Firebird\Firebird_2_5\bin\gbak.exe" 'sciezka do programu gbak
'----------------------------------------------------------------------------------------------------------
'Poniższe zmienne dotyczą ustawienia konta pocztowego (wiadomości o błędach)
'----------------------------------------------------------------------------------------------------------
uMailFrom = "adres@mail.pl"
uMailTo = "adres@mail.pl"
uMailSubject = "Temat maila"
uMailSMTP = "smtp.serwer.pl"
uMailPort = 465
uMailSendUsing = 2
uMailSMTPAuth = 1
uMailSMTPUseSSL = true
uMailUserName = "uzytkownik"
uMailPassword = "haslo"
'----------------------------------------------------------------------------------------------------------
On Error Resume Next
Dim ErrDesc
'odczyt argumentów
Set vArguments = WScript.Arguments.Named
aHTA = vArguments.Item("hta")
aPref = vArguments.Item("p")
aPass = vArguments.Item("pass")
aDest = vArguments.Item("dest")
aDel = vArguments.Item("del")
aDelTmp = vArguments.Item("deltmp")
aInfo = vArguments.Item("info")
aEmail = vArguments.Item("email")
'jeśli występuje /del lub /deltmp i wartość jest mniejsza od 7 ustaw 7
If IsNumeric(aDel) Then
If IsEmpty(aDel) Then
aDel=Null
Else
If CInt(aDel) < 7 Then aDel = 7
End If
End If
If IsNumeric(aDelTmp) Then
If IsEmpty(aDelTmp) Then
aDelTmp=Null
Else
If CInt(aDelTmp) < 7 Then aDelTmp = 7
End If
End If
'jesli argument /pass ma wartosc 2 to haslo2, w innym przypadku haslo1
If aPass = 2 Then
aPass = uPassBak2
Else
aPass = uPassBak1
End If
'odczyt daty i godziny
sYear = Year(Now())
sMonth = Month(Now())
If Len(sMonth) = 1 Then sMonth = "0" & Month(Now())
sDay = Day(Now())
If Len(sDay) = 1 Then sDay = "0" & Day(Now())
sHour = Hour(Now())
If Len(sHour) = 1 Then sHour = "0" & Hour(Now())
sMin = Minute(Now())
If Len(sMin) = 1 Then sMin = "0" & Minute(Now())
sSec = Second(Now())
If Len(sSec) = 1 Then sSec = "0" & Second(Now())
sDate = sYear & sMonth & sDay & "T" & sHour & sMin & sSec
sExtB = ".bak"
sExtZ = ".7z"
sExtL = ".txt"
'nazwa pliku kopii z przedrostkiem i datą
uFileName = aPref & uFileName & sDate
'komenda do wykonania kopii
sCommand=chr(34) & uGbak & chr(34) & " -v -b -ig -user " & uDbUser & " -password " & uDbPass & " " & uDb & " " & uTmpDir & uFileName & sExtB & " -Y " & uTmpDir & uFileName & sExtL
'komenda do kompresowania i szyfrowania
sCommand7z=chr(34) & u7zaDir & "7za.exe" & chr(34) & " a -mx -mhe -P" & aPass & " " & uTmpDir & uFileName & sExtZ & " " & uTmpDir & uFileName & "*.*"
'komenda do weryfikowania archiwum
sCommand7zV=chr(34) & u7zaDir & "7za.exe" & chr(34) & " t -P" & aPass & " " & uTmpDir & uFileName & sExtZ
'GUI (jesli jest parametr)
If Not IsEmpty(aHTA) Then
Dim IE
For Each IE In CreateObject("Shell.Application").windows
If IsObject(IE.GetProperty(aHTA)) Then
set aHTA = IE.GetProperty(aHTA)
IE.Quit
End If
Next
End If
'If IsObject(aHTA) Then
'aHTA.infotext.innerHTML = sCommand
'End If
'----------------------------------------------------------------------------------------------------------
'START
'----------------------------------------------------------------------------------------------------------
If aInfo = "yes" Then msgbox "Rozpoczynam tworzenie kopii bezpieczeństwa"
dim oFso
Dim oShell
Set ofso = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
If (oFso.FolderExists(uTmpDir) = False) Then
ErrDesc = ErrDesc & " Błędna konfiguracja skryptu (katalog roboczy)" & vbCrLf
fError true
End If
If (oFso.FileExists(uDb) = False) Then
ErrDesc = ErrDesc & " Błędna konfiguracja skryptu (ścieżka do bazy danych)" & vbCrLf
fError true
End If
If (oFso.FileExists(u7zaDir&"7za.exe") = False) Then
ErrDesc = ErrDesc & " Błędna konfiguracja skryptu (ścieżka do programu 7za.exe)" & vbCrLf
fError true
End If
If (oFso.FileExists(uGbak) = False) Then
ErrDesc = ErrDesc & " Błędna konfiguracja skryptu (ścieżka do programu gbak.exe)" & vbCrLf
fError true
End If
'Plik Log
Set logFile = oFso.OpenTextFile (uTmpDir & "_" & aPref & "log.txt", 8, True)
logFile.WriteLine Now()
'Usuwanie plików z takimi samymi nazwami jeśli istnieją
For Each oFile in oFso.GetFolder(uTmpDir).Files
If instr(oFile.Name, uFileName)=1 Then
oFso.DeleteFile oFile.Path, True
End If
Next
'Usuwanie plików starszych niz /deltmp
If IsNumeric(aDelTmp) Then
info="Nie usunięto żadnego pliku w katalogu " & uTmpDir
ii=0
For Each oFile in oFso.GetFolder(uTmpDir).Files
If DateDiff("d", oFile.DateLastModified, Now()) > CInt(aDelTmp) Then
If instr(oFile.Name, sExtZ)=(Len(oFile.Name)-Len(sExtZ)+1) OR instr(oFile.Name, sExtB)=(Len(oFile.Name)-Len(sExtB)+1) OR instr(oFile.Name, sExtL)=(Len(oFile.Name)-Len(sExtL)+1) Then
ii=ii+1
oFso.DeleteFile oFile.Path, True
End If
End If
Next
If ii>0 Then info="W katalogu " & uTmpDir & " usunięto starych plików: " & ii
logFile.WriteLine " " & info
End If
'Tworzenie kopii bezpieczeństwa
logFile.WriteLine " Tworzenie kopii bezpieczeństwa..."
ret = oShell.Run ("cmd /c " & sCommand, 0, True)
logFile.WriteLine " Utworzono plik " & uFileName&sExtB
If ret > 0 Then ErrDesc = ErrDesc & " Błąd podczas tworenia kopii bezpieczenstwa (gbak). Należy sprawdzić logi." & vbCrLf
'Kompresowanie i szyfrowanie kopii
ret = oShell.Run ("cmd /c " & sCommand7z & " >" & uTmpDir & "log7z.tmp", 0, True)
Set ftmp = oFso.OpenTextFile(uTmpDir & "log7z.tmp", 1)
tmpwrite=""
Do Until ftmp.AtEndOfStream
tmpline = ftmp.ReadLine
If (Len(tmpline) > 0) AND (instr(tmpline,"7-Zip")<>1) AND (instr(tmpline,"Scanning")<>1) Then tmpwrite = tmpwrite & " " & tmpline & vbCrLf
Loop
logFile.Write tmpwrite
ftmp.Close
If ret > 0 Then ErrDesc = ErrDesc & tmpwrite & vbCrLf
'Weryfikowanie archiwum
ret = oShell.Run ("cmd /c " & sCommand7zV & " >" & uTmpDir & "log7z.tmp", 0, True)
Set ftmp = oFso.OpenTextFile(uTmpDir & "log7z.tmp", 1)
tmpwrite=""
Do Until ftmp.AtEndOfStream
tmpline = ftmp.ReadLine
If (Len(tmpline) > 0) AND (instr(tmpline,"7-Zip")<>1) AND (instr(tmpline,"Scanning")<>1) Then tmpwrite = tmpwrite & " " & tmpline & vbCrLf
Loop
logFile.Write tmpwrite
ftmp.Close
If (instr(tmpwrite, "No files to process")) OR (instr(tmpwrite, "Files: 0")) OR (instr(tmpwrite, "Size: 0")) Then ErrDesc = ErrDesc & tmpwrite & vbCrLf
If ret > 0 Then ErrDesc = ErrDesc & tmpwrite & vbCrLf
'Usuwanie plików tymczasowych
If (oFso.FileExists(uTmpDir&"log7z.tmp")) Then oFso.DeleteFile uTmpDir&"log7z.tmp", True
If (oFso.FileExists(uTmpDir&uFileName&sExtB)) Then oFso.DeleteFile uTmpDir&uFileName&sExtB, True
If (oFso.FileExists(uTmpDir&uFileName&sExtL)) Then oFso.DeleteFile uTmpDir&uFileName&sExtL, True
'Kopiowanie archiwizacji do /dest ewentualne usuwanie plików starszych niz /del
If (oFso.FolderExists(aDest)) Then
If IsNumeric(aDel) Then
info="Nie usunięto żadnego pliku w katalogu " & aDest
ii=0
For Each oFile in oFso.GetFolder(aDest).Files
If DateDiff("d", oFile.DateLastModified, Now()) > CInt(aDel) Then
If instr(oFile.Name, sExtZ)=(Len(oFile.Name)-Len(sExtZ)+1) OR instr(oFile.Name, sExtB)=(Len(oFile.Name)-Len(sExtB)+1) OR instr(oFile.Name, sExtL)=(Len(oFile.Name)-Len(sExtL)+1) Then
ii=ii+1
oFso.DeleteFile oFile.Path, True
End If
End If
Next
If ii>0 Then info="W katalogu " & aDest & " usunięto starych plików: " & ii
logFile.WriteLine " " & info
End If
oFso.CopyFile uTmpDir&uFileName&sExtZ, aDest
logFile.WriteLine " Skopiowano archiwizacje do " & aDest
Else
logFile.WriteLine " BLAD: nie skopiowano archiwizacji z powodu blednej sciezki docelowej: " & aDest
ErrDesc = ErrDesc & " Nie skopiowano archiwizacji z powodu blednej sciezki docelowej: " & aDest & vbCrLf
End If
logFile.WriteLine " Koniec: " & Now()
logFile.Close
If (Err.Number <> 0) OR Len(ErrDesc) > 0 Then
If Err.Number <> 0 Then
ErrDesc = ErrDesc & " Err: " & Err.Number & " Source: " & Err.Source & " Description: " & Err.Description & vbCrLf
Err.Clear
End If
fError false
End If
If aInfo = "yes" Then msgbox "Zakończono tworzenie kopii bezpieczeństwa."
'----------------------------------------------------------------------------------------------------
'obsługa błędów
Function fError (qu)
if IsObject(logFile) Then logFile.Close
Set errFile = oFso.OpenTextFile ("err.txt", 8, True)
errFile.WriteLine Now()
errFile.Write ErrDesc
errFile.Close
If aInfo = "yes" Then msgbox "Wystąpiły błędy. Należy sprwdzić plik err.txt"
If (aEmail="yes") Then SendEmail
If (qu=true) Then WScript.Quit
End Function
'-----------------------------------------------------------------------------------------------------
'wysyłanie maila
Function SendEmail
Set oMail = CreateObject("CDO.Message")
oMail.From = uMailFrom
oMail.To = uMailTo
oMail.Subject = uMailSubject
oMail.TextBody = ErrDesc
Set mCfg = oMail.Configuration
mCfg.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = uMailSMTP
mCfg.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = uMailPort
mCfg.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = uMailSendUsing
mCfg.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = uMailSMTPAuth
mCfg.Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = uMailSMTPUseSSL
mCfg.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = uMailUserName
mCfg.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = uMailPassword
mCfg.Fields.Update
oMail.Send
End Function