Циклічний бекап по днях тижня.
В інтернеті часто можна зустріти статті про те, як написати скрипти для автоматичного архівування баз MSSQL. Методика, в них пропонована створює новий архів кожен новий день.
Я пропоную незначне удосконалення скриптів і генерацію архівів по днях тижня з циклічної їх перезаписом. Скрипт теж не повністю мій, а скомпонований з різних прикладів, знайдених в інтернеті, але, сподіваюся, саме представлений варіант буде корисний не тільки мені.
Для бекапірованія SQL сервера використовується звичайний скрипт:
DECLARE @pathName NVARCHAR (512)
SET @pathName = 'D: \ Backup \ db_backup_' + Convert (varchar (8), GETDATE (), 112) + '.bak'
BACKUP DATABASE [MyDataBase] TO DISK = @pathName WITH NOFORMAT. INIT. NAME = N'db_backup '. SKIP. NOREWIND. NOUNLOAD. STATS = 10
Цей скрипт створює бекап з ім'ям файлу db_backup_YYYYDDMM.bak де YYYYDDMM - це поточна дата. Дата в імені файлу дозволить нам створювати кожен день бекап в новому файлі. Запустіть і перевірте що бекап дійсно створюється такою, якою вам і потрібен. Цей скрипт зберігаємо в який-небудь папці під ім'ям schedule.sql, припустимо c: \ sheduled tasks. У цій же папці створимо виконуваний файл backup.bat, такого змісту:
SetLocal EnableExtensions EnableDelayedExpansion
For / F "Tokens = 1 * Delims ==" %% i In ( 'WMIC Path Win32_LocalTime Get / Value ^ | Find "="') Do (
If "% $ DayOfWeek%" == "0" Set $ DayOfWeek = 7
For / F "Tokens =% $ DayOfWeek%" %% i In ( "Monday Tuesday Wednesday Thursday Friday Saturday Sunday") Do Set $ DayOfWeekName = %% i
Echo Month. % $ MonthName% (% $ Month% - й місяць року)
Echo DayOfWeek. % $ DayOfWeekName% (% $ DayOfWeek% - й день тижня)
Echo Quarter. % $ Quarter%
Echo Minute. % $ Minute%
Echo Second. % $ Second%
sqlcmd -S SEVERNAME -U UserName -P Password -i schedule.sql
del D: \ Backup \ db_backup _% $ DayOfWeekName% .rar
"C: \ Program Files (x86) \ WinRAR \ Rar.exe" a -m2 D: \ Backup \ db_backup _% $ DayOfWeekName% .rar D: \ Backup \ db_backup _ *. Bak
del D: \ Backup \ db_backup _ *. bak
Тепер можемо запустити виконуваний файл backup.bat і перевірити чи пропрацює він так як потрібно. Останній крок це записати schedule в завдання windows. Запускаємо Task Scheduler з меню Пуск, або набираємо в командному рядку taskschd.msc. У різних версіях Windows це виглядає по-різному, та й інформацію про те, як зробити завдання можна прочитати в допомоги Windows. Основне - це запускати завдання від імені користувача з достатніми правами на використовувані папки. За допомогою таких дій можна так само запрограмувати і будь-які інші завдання. В скрипті schedule.sql можна перед бекап викликати будь-які необхідні процедури, може переіндексування або стиснення бази даних.
10. Nik (nikakoy) 43 16.06.10 13:36 Зараз в темі
У нас так реалізовано.
На сервері, не сильно завантаженому в денний час, запускається заплановане завдання, через 10 хв. (Обчислено емпірично, з великим запасом).
В файли год_месяц_дата_MD і год_месяц_дата бекапіруются файли MD, DDS, USR і SQL бекап в окремий файл (бо це займає значну кількість часу).
Технологія - файли структури копіюються, перейменовуються і упаковуються в архів.
Файл бекапа перейменовується і архівується.
Імена файлів формуються час_мінути.расшіреніе.
оскільки бекапірованіе кожну годину, на імені файлів не морочився, використовується поточний час сервера.
Власне сам VBS скрипт
Const OverwriteExisting = TRUE
Set objFSO = CreateObject ( "Scripting.FileSystemObject")
Set WshShell = CreateObject ( "WScript.Shell")
l = len (CStr (time))
'Формування нових імен файлів
if l = 8 then
NewName = CStr (Mid (time, 1,2) "_" Mid (time, 4,2) "_" "Base_" ".bak")
NewNameMD = CStr (Mid (time, 1,2) "_" Mid (time, 4,2) "_" "Base_" ".MD")
NewNameDDS = CStr (Mid (time, 1,2) "_" Mid (time, 4,2) "_" "Base_" ".DDS")
NewNameUSR = CStr (Mid (time, 1,2) "_" Mid (time, 4,2) "_" "Base_" ".USR")
else
NewName = CStr (Mid (time, 1,1) "_" Mid (time, 3,2) "_" "Base_" ".bak")
NewNameMD = CStr (Mid (time, 1,1) "_" Mid (time, 3,2) "_" "Base_" ".MD")
NewNameDDS = CStr (Mid (time, 1,1) "_" Mid (time, 3,2) "_" "Base_" ".DDS")
NewNameUSR = CStr (Mid (time, 1,1) "_" Mid (time, 3,2) "_" "Base_" ".USR")
end if
'C: \ BKP \ тимчасова папка на сервері виконує архівацію
'N: \ Base \ шлях до каталогу бази даних
'Файл rar.exe поклав в C: \ Program Files \ 1Cv77
'Файли після завершення упаковки видаляються rar_ом.
1 \ 1Cv77 \ RAR a \\ CетевоеІмяКудаПоложітьАрхів \ BKP $ \ Base_ " Mid (Date, 9,2) "_" Mid (Date, 4,2) "_" Mid (Date, 1,2) "_MD C: \ BKP \ *. * -DW"
WshShell.Run runstr
objFSO.MoveFile "\\ Srv02 \ bkp $ \ Base_backup.bak", "\\ Srv02 \ bkp $" NewName
RunStr = "C: \ Progra
1 \ 1Cv77 \ RAR a \\ CетевоеІмяКудаПоложітьАрхів \ BKP $ \ Base_ " Mid (Date, 9,2) "_" Mid (Date, 4,2) "_" Mid (Date, 1,2) ".rar \\ СетевоеІмяSQLсервера \ bkp $" NewName "-DW"
11. Nik (nikakoy) 43 16.06.10 13:42 Зараз в темі
Може комусь стане в нагоді.
Щодобовий (засобами 1С) виконується скриптом.
On Error Resume Next
dim ParamFile, BasePath, User, UserPassvord, Arhiv, RunString
Set objShellApp = CreateObject ( "Shell.Application")
BasePath = "N: \ Base"
User = "UsVeR"
UserPassvord = "UsVeR_Pass"
Arhiv = CStr ( "N: \ Base \ InOut \ Base_" Mid (Date, 9,2) "_" Mid (Date, 4,2) "_" Mid (Date, 1,2) ".zip")
ParamFile = CStr (BasePath "\ Arhiv.prm")
Set FSO = CreateObject ( "Scripting.FileSystemObject")
'MsgBox paramfile, vbInformation
Set File = FSO.CreateTextFile (ParamFile)
file.WriteLine "[general]"
file.WriteLine "Quit = 1"
file.WriteLine "UnloadData = 1"
file.WriteLine "[UnloadData]"
file.WriteLine "IncludeUserDef = 1"
file.WriteLine "UnloadToFile =" "" Arhiv "" ""
RunStr = "" "C: \ Program Files \ 1Cv77 \ BIN \ 1cv7s.exe" "Config / D" "" "" BasePath "" "/ N" User "/ P" UserPassvord "/ @" "" paramFile "" ""
Set WshShell = CreateObject ( "WScript.Shell")
WshShell.Run runstr
If Err.Number <> 0 Then
MsgBox "Чет не зрослося!", VbInformation
End If
12. Bogdan Vozniy (Baglandir) 20.09.11 13:09 Зараз в темі
На додаток додам що виникли труднощі з очищенням лог файлу які вирішуються з помощю скриптів.
13. Андрій Савенков (Ichigo) 03.10.11 15:13 Зараз в темі
Хороший скрипт, дуже зручний!
Поставили і забули про бекапи :) кожен день (вночі) автоматом запускається і робиться бекап. Людський фактор йде (забудькуватість).
16. Andrej Kuzmuk (skelelaz) 20.03.14 00:10 Зараз в темі
Бекаплю bat-файлом з WinRAR 3 рази на добу. Теж нормально. На рахунок циклічності - віддаю перевагу чистити від зайвих архівів вручну, а так нехай збираються, скільки місця вистачить. Буває, що треба архів піврічної давності подивитися.
Созданіе15.06.10 15:17
Код откритНе вказано