PDA

Показать полную графическую версию : [решено] Резервное копирование


admin-nsk
20-01-2011, 13:31
Скрипт проверяет наличие файла бекапа SQL в папке архивирует его в архив с помощью rar с добавление даты в имя архива. Затем копирует архив на удаленный сервер. И удаляет старые архивы с локального и удаленного сервера. Т.к. архивируется с пошью rar в скрипте реализовано вычисление задержки в зависимости от размера файла. Все действия ведуться в логах. В конце отправляется писмьо на заданный адрес с вложенным логом с помощью blat.
****************************************************************************

'==========================================================================
'
' VBScript Copy Backup folder
'
' NAME: CopBackFold.vbs
'
' AUTHOR: Alexey Petrov
' DATE : 20/01/2011
' Version 2.0.1
'==========================================================================
Option Explicit
'On Error Resume Next
Const OverWriteFiles = True
Dim sFolder, dFolder
Dim rDate, oldDaterm, oldDate
Dim objFSO, objTxtFile
Dim Arg, FileName
'Переменные логов
Dim LogFile, objOutputFile
'Переменные отправки почты
Dim subj, body, cons, Sleep
Dim WShell
Dim Year, Month, Day, oldFile, oldDateLoc
Dim sFile, ArrBase(), flBase, intSize, fold, Folder, file
Dim strNextLine, status, iDir

flBase = "H:\script\Backup_Base.txt"
intSize = 0
Set WShell=CreateObject("WScript.Shell")
Set objFSO = CreateObject ("scripting.fileSystemObject") 'Подключение к объект

oldDateloc = Time()

Set objTxtFile = objFSO.OpenTextFile(flBase, 1)

'Подключение объектов
Set Arg = WScript.Arguments.Named

'Проверка аргументов
'Присвоение пути копирования
If Arg.Exists("source") Then 'Значение первого аргумента
sFolder = Arg("source")
Else
sFolder = "H:\SQL_BACKUP\"
End If
If Arg.Exists("dest") Then 'Значение второго аргумента
dFolder = Arg("dest")
Else
dFolder = "\\Tr1\SQL_BACKUP\everyday\Back_" &rDate &"\"
objFSO.CreateFolder(dFolder)
End If

If Arg.Exists("help") Xor Arg.Exists("h") Then 'Значение третьего аргумента
WScript.Echo("Cкрипт для копирования бекапов, и хранения определенного количества архивов"+ vbCrLf + vbCrLf)
WScript.Echo("Атрибуты:" + vbCrLf + vbCrLf + "/source:папка-источчник" + vbCrLf + "/dest:папка-приемник")
WScript.Quit 1
End If

'Пишем лог.
if objFSO.FolderExists(sFolder) Then
LogFile = "H:\log\log-" &rDate & ".log" 'создаем файл
Set objOutputFile = objFSO.CreateTextFile(LogFile, TRUE)
if objFSO.FolderExists(dFolder) Then
Else
WScript.Echo("Папка " & dFolder & " не существует!!!!!!!"+ vbCrLf)
objOutputFile.WriteLine("Папка " & dFolder & " не существует!!!!!!!"+ vbCrLf) 'в логи
body = CHR(34) &"Папка " & dFolder & " не существует!!!!!!!" &CHR(34)'Текст сообщения
objOutputFile.Close
Email
WScript.Quit 1
End if
Else
WScript.Echo("Папка " & sFolder & " не существует!!!!!!!"+ vbCrLf)
body = CHR(34) &"Папка " & sFolder & " не существует!!!!!!!" &CHR(34) 'Текст сообщения
Email
WScript.Quit 1
End if


WScript.Echo("Источник:" &sFolder ) 'на экран
objOutputFile.WriteLine("Источник:" &sFolder ) 'в логи
WScript.Echo("Приемник:" &dFolder )
objOutputFile.WriteLine("Приемник:" &dFolder )
WScript.Echo("=============================================="+ vbCrLf + vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf + vbCrLf)




'Удалнение старых бекапов на Tr1
WScript.Echo("Удалнение старых бекапов на Tr1.....")
objOutputFile.WriteLine("Удалнение старых бекапов на Tr1.....")
WScript.Echo("=============================================="+ vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf)

If objFSO.FolderExists("\\Tr1\SQL_BACKUP\everyday\Back_" & oldDaterm) Then 'Проверка на существование
WScript.Echo("Папка \\Tr1\SQL_BACKUP\everyday\Back_" & oldDaterm &" существует и бедет удалена")
objOutputFile.WriteLine("Папка \\Tr1\SQL_BACKUP\everyday\Back_" & oldDaterm &" существует и бедет удалена")
objFSO.deleteFolder ("\\Tr1\SQL_BACKUP\everyday\Back_" & oldDaterm)
WScript.Echo("Папка удалена!")
objOutputFile.WriteLine("Папка удалена!")
WScript.Echo("=============================================="+ vbCrLf + vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf + vbCrLf)
Else
WScript.Echo("Папка \\Tr1\SQL_BACKUP\everyday\Back_" & oldDaterm &" не существует!")
objOutputFile.WriteLine("Папка \\Tr1\SQL_BACKUP\everyday\Back_" & oldDaterm &" не существует!")

WScript.Echo("=============================================="+ vbCrLf + vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf + vbCrLf)
End If

WScript.Echo("Ежедневное Копирование бекапов на Tr1.....")
objOutputFile.WriteLine("Ежедневное Копирование бекапов на Tr1.....")
WScript.Echo("=============================================="+ vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf)

Do Until objTxtFile.AtEndofStream
strNextLine = objTxtFile.Readline
ReDim Preserve ArrBase(intSize)
ArrBase(intSize) = strNextLine
intSize = intSize + 1

Loop


Dim i
For i = 1 To UBound(ArrBase)

sFile = "H:\SQL_BACKUP\" &ArrBase(i) &"\" &ArrBase(i) &"_backup_" &Year &"_" &Month &"_" &Day &".rar"
oldFile = "H:\SQL_BACKUP\" &ArrBase(i) &"\" &ArrBase(i) &"_backup_" &oldDateLoc &".rar"
dFolder = "\\Tr1\SQL_BACKUP\everyday\Back_" &rDate &"\" &ArrBase(i) &"\"
iDir = "H:\SQL_BACKUP\" &ArrBase(i)

objFSO.CreateFolder(dFolder)
FileName = ChackFile (iDir, ArrBase(i))
if status = 1 Then
arch
WScript.Echo("База " &ArrBase(i) &" за архивирована."+ vbCrLf)
objOutputFile.WriteLine("База " &ArrBase(i) &" за архивирована."+ vbCrLf)
Else
WScript.Echo("Файл базы " &ArrBase(i) &" отсутствует."+ vbCrLf)
objOutputFile.WriteLine("Файл базы " &ArrBase(i) &" отсутствует."+ vbCrLf)
End if
if objFSO.FileExists (sFile) Then
CopyFile
WScript.Echo("Файл " &sFile &" перемещен... "+ vbCrLf )
objOutputFile.WriteLine("Файл " &sFile &" перемещен... "+ vbCrLf)
Else
WScript.Echo("Файл " &sFile &" отсутствует!!! "+ vbCrLf )
objOutputFile.WriteLine("Файл " &sFile &" отсутствует!!! "+ vbCrLf)
End if
DelFile
Next

'Закрытие файла логов
objOutputFile.Close
'Удаление старых логов
if objFSO.FileExists("H:\log\log-" & oldDaterm & ".log") Then
objFSO.deleteFile ("H:\log\log-" & oldDaterm & ".log")
End if

WrDate
'objFSO.deleteFolder ("H:\SQL_BACKUP\BP81")
body = CHR(34) &"Ежедневное копирование бекапов успешно выполнено!!!!" &CHR(34)
Email

'Отправка письма
Sub Email
subj = CHR(34) &"Backup_1C_SQl" &CHR(34)
cons = "-charset windows-1251 -to info@mail.ru -subject " &subj &" -body "&body &" -attach " &LogFile
WShell.Run("H:\script\blat.exe " &cons )
End Sub

' копирование ежедневных бекапов на Tr1...
Sub CopyFile
WScript.Echo("Перемещение " &sFile &" на Tr1... " &Now)
objOutputFile.WriteLine("Перемещение " &sFile &" на Tr1... " &Now)
objFSO.CopyFile sFile, dFolder
End Sub

'Полное копирование на Tr1...
Sub CopyFolder
WScript.Echo("Копирование бекапов на Tr1.....")
objOutputFile.WriteLine("Копирование бекапов на Tr1.....")
WScript.Echo("=============================================="+ vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf)

If objFSO.FolderExists(dFolder) Then
WScript.Echo("Перемещение бекапов на Tr1... " &Now)
objOutputFile.WriteLine("Перемещение бекапов на Tr1... " &Now)
objFSO.CopyFolder sFolder, dFolder , OverWriteFiles 'Копирование каталогов
WScript.Echo("Бекапы перенесены на Tr1 успешно!!! " & Now)
objOutputFile.WriteLine("Бекапы перенесены на Tr1 успешно!!! " & Now)
WScript.Echo("=============================================="+ vbCrLf + vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf + vbCrLf)
Else
WScript.Echo("Папка " & dFolder &" не существует! Данный не перенесены!!")
objOutputFile.WriteLine("Папка " & dFolder &" не существует! Данный не перенесены!!")
WScript.Echo("=============================================="+ vbCrLf + vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf + vbCrLf)
End If
End Sub

Sub arch
WScript.Echo("==================Архивация базы " &ArrBase(i) &"...==================================="+ vbCrLf)
objOutputFile.WriteLine("==================Архивация базы " &ArrBase(i) &"...==================================="+ vbCrLf)
WShell.Run("H:\script\rar m H:\SQL_Backup\" &ArrBase(i) &"\" &ArrBase(i) &"_backup_" &" -agyyyy_mm_dd -m5 -rr -idcp H:\SQL_Backup\" &ArrBase(i) &"\" &ArrBase(i) &"_backup_" &Year &"_" &Month &"_" &Day &"*.bak ")
Sleep = TimeSleep (iDir, FileName)
WScript.Sleep(Sleep)
End sub

Sub DelFile
WScript.Echo("Удалнение старых бекапов локально.....")
objOutputFile.WriteLine("Удалнение старых бекапов на локально.....")
WScript.Echo("=============================================="+ vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf)

If objFSO.FileExists(oldFile) Then 'Проверка на существование
WScript.Echo("Файл " & oldFile &" существует и бедет удален")
objOutputFile.WriteLine("Файл " & oldFile &" существует и бедет удален")
objFSO.deleteFile(oldFile)
WScript.Echo("Файл удален!")
objOutputFile.WriteLine("Файл удален!")
WScript.Echo("=============================================="+ vbCrLf + vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf + vbCrLf)
Else
WScript.Echo("Файл " & oldFile &" не существует!")
objOutputFile.WriteLine("Файл " & oldFile &" не существует!")
WScript.Echo("=============================================="+ vbCrLf + vbCrLf)
objOutputFile.WriteLine("=============================================="+ vbCrLf + vbCrLf)
End If
End Sub

Function Time()
Year = DatePart("yyyy", Now)
if DatePart("m", Now) < 10 Then
Month = 0 &DatePart("m", Now)
Else
Month = DatePart("m", Now)
End if

if DatePart("d", Now) < 10 Then
Day = 0 &DatePart("d", Now)
Else
Day = DatePart("d", Now)
End if

rDate = Day &"-" &Month &"-" &Year
'Дата старого архива удаленно
Dim oldDayrm, oldMonthrm, oldYearrm
oldDayrm = Day
oldMonthrm = Month
oldYearrm = Year
if (oldDayrm < 31) then
if ( oldMonthrm = 01 or 04 or 06 or 08 or 09 or 11) Then
oldDayrm = 31 - (30 - oldDayrm)
if oldMonthrm = 01 Then
oldMonthrm = 12
oldYearrm = oldYearrm - 1
End if
if oldMonthrm = 11 then
oldMonthrm = oldMonthrm - 1
Else
oldMonthrm = "0" &(oldMonthrm - 1)
End if

Elseif (oldMonthrm = 03) Then
if oldDayrm > 3 Then
oldDayrm = 59 - (30 - oldDayrm)
oldMonthrm = oldMonthrm - 2
Else
ldDayrm = 28 - (30 - oldDayrm)
oldMonthrm = oldMonthrm - 1
End if
Else
oldDayrm = 30 - (30 - oldDayrm)
if oldMonthrm = 12 then
oldMonthrm = oldMonthrm - 1
Else
oldMonthrm = "0" &(oldMonthrm - 1)
End If
End if
End if

'Дата старого архива локально
Dim oldDay, oldMonth, oldYear
oldDay = Day
oldMonth = Month
oldYear = Year
if (oldDay < 8) then
if ( oldMonth = 01 or 04 or 06 or 08 or 09 or 11) Then
oldDay = 31 - (7 - oldDay)
if (oldMonth = 01) Then
oldMonth = 12
oldYear = oldYear - 1
End if
if oldMonth = 11 then
oldMonth = oldMonth - 1
Else
oldMonth = "0" &(oldMonth - 1)
End If
Elseif (oldMonth = 03) Then
oldDay = 28 - (7 - oldDay)
oldMonth = "0" &(oldMonth - 1)
Else
oldDay = 30 - (7 - oldDay)
if oldMonth = 12 then
oldMonth = oldMonth - 1
Else
oldMonth = "0" &(oldMonth - 1)
End If
End if
End if
Time = oldYear &"-" &oldMonth &"-" &oldDay

End Function

sub WrDate
Dim objFileDate
set objFileDate = objFSO.CreateTextFile("LastBackDay.txt", TRUE)
objFileDate.WriteLine(Day)
objFileDate.WriteLine(Month)
objFileDate.WriteLine(Year)
objFileDate.Close
End sub

Function ChackFile (iDir, BaseName)
Dim Files, Maska, Re
Set Files = objFSO.GetFolder(iDir).Files
Maska = "^" &BaseName &"_backup_" &Year &"_" &Month &"_" &Day &"_......_.......\.bak$"
status = 0
Set Re = New RegExp
Re.Pattern = Maska
Re.IgnoreCase = True

For Each File In Files
If Re.Test(File.Name) Then
ChackFile = File.Name
status = 1
end if

Next

End Function

'Вычисление время задержки
Function TimeSleep (iDir, FileName)
Dim objFile, Target, FileSize
Target = iDir &"\" & FileName
Set objFile = objFSO.GetFile(target)
FileSize = objFile.Size
If FileSize < 300000000 Then
TimeSleep = 300000
ElseIf FileSize < 100000000 Then
TimeSleep = 1800000
ElseIf FileSize < 5000000000 Then
TimeSleep = 3600000
ElseIf FileSize < 10000000000 Then
TimeSleep = 7200000
ElseIf FileSize < 30000000000 Then
TimeSleep = 10800000
ElseIf FileSize < 80000000000 Then
TimeSleep = 14400000
Else
TimeSleep = 18000000
End if
End function

amel27
21-01-2011, 05:32
у меня крутится примерно такой же скрипт, только батник...
вот только не понял: зачем задержка, если у метода Run есть параметр (3-й по счету), который отвечает за ожидание завершения?
Run Method (Windows Script Host) (http://msdn.microsoft.com/ru-ru/library/d5fk67ky.aspx)

admin-nsk
21-01-2011, 06:37
amel27, Спасибо упустил этот момент.




© OSzone.net 2001-2012