Что нового

[Автоматизация] Резервное копирование баз данных FireBird

Renz

Осваивающий
Сообщения
63
Репутация
37
AutoIt: 3.3.6.1
Версия: 1.0

Категория: База данных

Описание:
Программа для создания backups баз данных firebird.
Создание бекапа базы данных по шаблону:
название базы данных +дата(YYYYMMDD)+время(hhmm)+backup.bak
Архивация бекапа.
Отправка на FTP.
Для настройки параметров запустить программу с ключем "-s"


Код/Пример:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <FTPEx.au3>

If FileExists ( @ScriptDir & "\setup.ini" ) = 0 Then
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Server", "localhost:" ) ;1
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Base", "" ) ;2
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "User", "SYSDBA" ) ;3
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Pass", "masterkey" ) ;4
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Backup", "" ) ;5
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "FireBird", "" ) ;6
	
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "Server", "" ) ;1
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "User", "" ) ;2
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "Pass", "" ) ;3
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "Dir", "/" ) ;4
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "UsePostFTP", "" ) ;5
EndIf

$aSetupFireBird = IniReadSection(@ScriptDir & "\setup.ini", "FireBird" )

Global $sServer = $aSetupFireBird[1][1]
Global $sBase = $aSetupFireBird[2][1]
Global $sUser = $aSetupFireBird[3][1]
Global $sPass = $aSetupFireBird[4][1]
Global $sPathBackup = $aSetupFireBird[5][1]
Global $sPathFirebird = $aSetupFireBird[6][1]

$aSetupFTP = IniReadSection(@ScriptDir & "\setup.ini", "FTP" )

Global $sServerFTP = $aSetupFTP[1][1]
Global $sUserFTP = $aSetupFTP[2][1]
Global $sPassFTP = $aSetupFTP[3][1]
Global $sDirFTP = $aSetupFTP[4][1]
Global $sUsePostFTP = $aSetupFTP[5][1]

If $CmdLine[0] > 0 Then
	If $CmdLine[1] = "-s" Then
		#Region ### START Koda GUI section ### Form=
		$Form1 = GUICreate("Setting backup firebird", 505, 238, 192, 114)
		$Group1 = GUICtrlCreateGroup("FireBird", 8, 8, 289, 217)
		$ServerInput = GUICtrlCreateInput($sServer, 56, 24, 233, 21)
		$BaseInput = GUICtrlCreateInput($sBase, 55, 53, 201, 21)
		$Label1 = GUICtrlCreateLabel("Server", 16, 24, 35, 17)
		$Label2 = GUICtrlCreateLabel("Base", 16, 56, 28, 17)
		$UserInput = GUICtrlCreateInput($sUser, 55, 85, 233, 21)
		$Label3 = GUICtrlCreateLabel("User", 16, 88, 26, 17)
		$PassInput = GUICtrlCreateInput($sPass, 56, 112, 233, 21)
		$Label4 = GUICtrlCreateLabel("Pass", 16, 112, 27, 17)
		$BackupInput = GUICtrlCreateInput($sPathBackup, 87, 141, 169, 21)
		$Label5 = GUICtrlCreateLabel("Path backup", 16, 144, 65, 17)
		$SelectBackup = GUICtrlCreateButton("...", 264, 144, 27, 17)
		$FireBirdInput = GUICtrlCreateInput($sPathFirebird, 87, 165, 169, 21)
		$SelectFirebird = GUICtrlCreateButton("...", 264, 168, 27, 17)
		$Label6 = GUICtrlCreateLabel("Path FireBird", 16, 168, 64, 17)
		$SelectBase = GUICtrlCreateButton("...", 264, 56, 27, 17)
		$ControlButtton = GUICtrlCreateButton("Control", 16, 192, 75, 25)
		GUICtrlCreateGroup("", -99, -99, 1, 1)
		$Group2 = GUICtrlCreateGroup("FTP", 304, 8, 193, 185)
		
		$PostFTP = GUICtrlCreateCheckbox("Post", 312, 120, 177, 17)
		$ServerFTPInput = GUICtrlCreateInput($sServerFTP, 344, 24, 145, 21)
		$UserFTPInput = GUICtrlCreateInput($sUserFTP, 344, 48, 145, 21)
		$PassFTPInput = GUICtrlCreateInput($sPassFTP, 344, 72, 145, 21, $ES_PASSWORD)
		$Label7 = GUICtrlCreateLabel("Server", 312, 24, 35, 17)
		$Label8 = GUICtrlCreateLabel("User", 312, 48, 26, 17)
		$Label9 = GUICtrlCreateLabel("Pass", 312, 72, 27, 17)
		$Label10 = GUICtrlCreateLabel("Dir", 312, 96, 25, 17)
		$DirFTPInput = GUICtrlCreateInput($sDirFTP, 344, 96, 145, 21)
		If $sUsePostFTP = "1" Then
			GUICtrlSetState ( $PostFTP, $GUI_CHECKED )
		Else
			GUICtrlSetState ( $ServerFTPInput, $GUI_DISABLE )
			GUICtrlSetState ( $UserFTPInput, $GUI_DISABLE )
			GUICtrlSetState ( $PassFTPInput, $GUI_DISABLE )
			GUICtrlSetState ( $DirFTPInput, $GUI_DISABLE )
		EndIf
		
		GUICtrlCreateGroup("", -99, -99, 1, 1)
		$SaveButton = GUICtrlCreateButton("Save", 424, 200, 75, 25)
		GUISetState(@SW_SHOW)
		#EndRegion ### END Koda GUI section ###

		While 1
			$nMsg = GUIGetMsg()
			Select 
				Case $nMsg = $GUI_EVENT_CLOSE
					Exit
				Case $nMsg = $SelectBackup
					$sSelectFolder = FileSelectFolder( "Select dir backup","",1 )
					If $sSelectFolder <> "" Then
						$sPathBackup = $sSelectFolder
						GUICtrlSetData ( $BackupInput, $sPathBackup )
					EndIf
				Case $nMsg = $SelectBase
					$sSelectFile = FileOpenDialog ( "Select file base", "","All (*.*)" )
					If $sSelectFile <> "" Then
						$sBase = $sSelectFile
						GUICtrlSetData ( $BaseInput, $sBase )
					EndIf
				Case $nMsg = $SelectFirebird
					$sSelectFolder = FileSelectFolder( "Select dir backup","", 1 )
					If $sSelectFolder <> "" Then
						$sPathFirebird = $sSelectFolder
						GUICtrlSetData ( $FireBirdInput, $sPathFirebird )
					EndIf
				Case $nMsg = $ControlButtton
					ReadParam()
					ControlConnectFireBird()
				Case $nMsg = $SaveButton
					ReadParam()
					SaveParam()
				Case $nMsg = $PostFTP
					If GUICtrlRead ( $PostFTP) = 1 Then
						$sUsePostFTP = "1"
						GUICtrlSetState ( $ServerFTPInput, $GUI_ENABLE )
						GUICtrlSetState ( $UserFTPInput, $GUI_ENABLE )
						GUICtrlSetState ( $PassFTPInput, $GUI_ENABLE )
						GUICtrlSetState ( $DirFTPInput, $GUI_ENABLE )
					ElseIf GUICtrlRead ( $PostFTP) = 4 Then
						$sUsePostFTP = ""
						GUICtrlSetState ( $ServerFTPInput, $GUI_DISABLE )
						GUICtrlSetState ( $UserFTPInput, $GUI_DISABLE )
						GUICtrlSetState ( $PassFTPInput, $GUI_DISABLE )
						GUICtrlSetState ( $DirFTPInput, $GUI_DISABLE )
					EndIf
					
			EndSelect
		WEnd
		Exit
	Else
		MsgBox(0,"",'Incorrectly specified' &@CRLF& 'Run script with param. "-s"')
		Exit
	EndIf
EndIf

If $sServer = "" OR $sPathFirebird = "" OR $sBase = "" OR $sUser = "" OR $sPass = "" OR $sPathBackup = "" Then
	MsgBox(0,"Error",'Not all parameters are indicated ' &@CRLF& 'Run script with param. "-s"' )
	Exit
Else
	
	$sNameBase = StringRight($sBase, StringLen($sBase)-StringInStr( $sBase,"\",0,-1))
	$sNameBase = StringLeft( $sNameBase, StringInStr( $sNameBase,".",0,1)-1) 
	$sDate = ""& @YEAR & @MON & @MDAY & "_" & @HOUR & @MIN
	$sTemplateBackupName = $sNameBase &"_"& $sDate & "_backup.bak"
	$sKeyGbak = "-b -g "& $sBase &" "& $sPathBackup &"\"&$sTemplateBackupName &" -user " & $sUser & " -pass " & $sPass
	ShellExecuteWait("gbak.exe",$sKeyGbak, $sPathFirebird, "open", @SW_HIDE)
	
	Install7z()
	$sTemplate7z = $sNameBase &"_"& $sDate & "_backup.7z"
	$sKey7z = "a -t7z "& $sPathBackup &"\"&$sTemplate7z & " -mx3 " & $sPathBackup&"\"&$sTemplateBackupName & " -ssw"
	ShellExecuteWait( "7z.exe", $sKey7z, @ScriptDir, "open", @SW_HIDE)
	FileDelete ( $sPathBackup&"\"&$sTemplateBackupName ) 

	PostFTP()
	
EndIf

Func PostFTP()
	If $sUsePostFTP <> "" Then
		If $sServerFTP = "" OR $sUserFTP = "" OR $sUserFTP = "" OR $sPassFTP = "" OR $sDirFTP Then
			$OpenFTP = _FTP_Open('FTP')
			$Conn = _FTP_Connect($OpenFTP, $sServerFTP, $sUserFTP, $sPassFTP ,1 )
			If $Conn <> 0 Then
				_FTP_FilePut($Conn, $sPathBackup &"\"& $sTemplate7z, $sDirFTP & $sTemplate7z)
			EndIf
			$Ftpc = _FTP_Close($OpenFTP)
		EndIf
	EndIf
	Return
EndFunc

Func Install7z()
	FileInstall ("C:\Program Files\7-Zip\7z.exe",@ScriptDir&"\7z.exe")
	FileInstall ("C:\Program Files\7-Zip\7z.dll",@ScriptDir&"\7z.dll")
EndFunc
	
Func SaveParam()
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Server", $sServer ) ;1
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Base", $sBase ) ;2
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "User", $sUser ) ;3
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Pass", $sPass ) ;4
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "Backup", $sPathBackup ) ;5
	IniWrite( @ScriptDir & "\setup.ini", "FireBird", "FireBird", $sPathFirebird ) ;6
	
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "Server", $sServerFTP ) ;1
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "User", $sUserFTP ) ;2
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "Pass", $sPassFTP ) ;3
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "Dir", $sDirFTP ) ;4
	IniWrite( @ScriptDir & "\setup.ini", "FTP", "UsePostFTP", $sUsePostFTP ) ;5
EndFunc

Func ReadParam()
	$sServer = StringStripWS( GUICtrlRead ($ServerInput),3)
	$sBase = StringStripWS( GUICtrlRead ($BaseInput) ,3)
	$sUser = StringStripWS( GUICtrlRead ($UserInput) ,3)
	$sPass = StringStripWS( GUICtrlRead ($PassInput) ,3) 
	$sPathBackup = StringStripWS( GUICtrlRead ($BackupInput) ,3)
	$sPathFirebird = StringStripWS( GUICtrlRead ($FireBirdInput) ,3)
	
	$sServerFTP = StringStripWS( GUICtrlRead ($ServerFTPInput),3)
	$sUserFTP = StringStripWS( GUICtrlRead ($UserFTPInput),3)
	$sPassFTP = StringStripWS( GUICtrlRead ($PassFTPInput),3)
	$sDirFTP = StringStripWS( GUICtrlRead ($DirFTPInput),3)
	If GUICtrlRead ( $PostFTP) = 1 Then
		$sUsePostFTP = "1"
	ElseIf GUICtrlRead ( $PostFTP) = 4 Then
		$sUsePostFTP = ""
	EndIf
	
EndFunc

Func ControlConnectFireBird()
	
	If $sServer = "" OR $sPathFirebird = "" OR $sBase = "" OR $sUser = "" OR $sPass = "" Then
		MsgBox(0,"Error","Not all parameters are indicated")
		Return
	EndIf
	
	$sFileOUT = @TempDir&"\"&"OUTFB.txt"

	$fileOUT = FileOpen ( $sFileOUT, 2 )  
	FileClose($fileOUT)

	$sKeyIsql =" -o " & $sFileOUT & " -u " & $sUser & " -p " & $sPass & " " & $sServer & $sBase
	$pidIsql = Run($sPathFirebird &"\"& "isql.exe " & $sKeyIsql, $sPathFirebird, @SW_HIDE, $STDERR_MERGED + $STDOUT_CHILD )
	StdioClose ( $pidIsql )
	Sleep(1500)

	If FileReadLine ( $sFileOUT, 1 ) <> "" Then
		
		MsgBox(0,"",FileReadLine ( $sFileOUT, 1 ))
	Else
		MsgBox(0,"Error","Don't connect to " & $sBase)
	EndIf
	
	Return
	
EndFunc

Файл: BackupFireBird_v1

Снимок:


История версий:
1. :blum:

Источник: autoit-script.ru
Автор: Renz
 

irshat

Новичок
Сообщения
7
Репутация
0
Он файлы FDB поддерживает, и если база находится на локальной машине как сервер прописывать?
Перепробовал все варианты, не один не подошел, не подключен пишет.
Бэкап идет на основе бэкап-ресторе или просто банальный бэкап.
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
пример ini файла:
Код:
[FireBird]
Server=localhost:
Base=C:\Base\fb_base\MAIN.GDB
User=SYSDBA
Pass=masterkey
Backup=C:\Archiv
FireBird=C:\Program Files\FireBird\Firebird_2_0\BIN
[URL]
Server=
User=
Pass=
Dir=/
UsePostFTP=1
 

InnaS

Новичок
Сообщения
5
Репутация
0
А почему нельзя просто сделать копию файла по таймеру? :stars: чего проще.
 
Верх