Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Резервное копирование (http://forum.oszone.net/showthread.php?t=197132)

admin-nsk 20-01-2011 13:31 1593039

Резервное копирование
 
Скрипт проверяет наличие файла бекапа 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 1593609

у меня крутится примерно такой же скрипт, только батник...
вот только не понял: зачем задержка, если у метода Run есть параметр (3-й по счету), который отвечает за ожидание завершения?
Run Method (Windows Script Host)

admin-nsk 21-01-2011 06:37 1593624

amel27, Спасибо упустил этот момент.


Время: 22:24.

Время: 22:24.
© OSzone.net 2001-