все что связано с моей работой
Главная » Програмирование » Резервное копирование баз АИСБП в поселениях

Резервное копирование баз АИСБП в поселениях

Задача: необходимо настроить резервное копирование баз АИСБП в поселениях. Кроме “ручного”, настроить автоматическое копирование ежедневное – текущей рабочей базы (на сегодня это Budget13K), еженедельное – все системные базы (master, model и тд) и ежемесячное – полная копия баз сервера.

Так как в поселениях в качестве сервера используется MSDE, то никаких средств для автоматизации нет. Значит будем пользоваться старыми и проверенными командными сценариями.

Определимся с расположением. Сервер во всех поселениях установлен в папку C:\MSSQL2005, тут и будем работать, создадим папку backup, сюда будем складывать копии и папку tools это будет рабочая папка, сос всеми скриптами. Так же во всех поселениях установлена SQL Server Management Studio Express, нам из нее нужна только sqlcmd.exe, которая находится в "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe". И последнее 7z, его путь – “c:\Program Files\7-Zip\7z.exe”

Ручное копирование

На сегодняшний день в поселениях 8 баз с 2006 года по настоящий. Таким образом нам надо сделать 8 SQL-скриптов для копирования и командный файл для их выполнения. SQL достаточно простые, “создаем” имя исходя из текущей даты и затем копируем базу:

DECLARE @pathName NVARCHAR(512) 
SET @pathName = 'c:\\mssql2005\\backup\\db_' + Convert(varchar(8), GETDATE(), 112) + '.bak' 
BACKUP DATABASE [Budget06K] TO DISK = @pathName WITH NOFORMAT, NOINIT, NAME = N'Budget06K', SKIP, NOREWIND, NOUNLOAD, STATS = 10

Делаем 8 таких файлов, на каждую базу свой: b06.sql, b07.sql … b13.sql.

Создаем sys.sql для копирования системных баз, тут тоже все просто – “в лоб”:

DECLARE @pathName NVARCHAR(512) 
SET @pathName = 'c:\\mssql2005\backup\\db_master' + Convert(varchar(8), GETDATE(), 112)+ '.bak' 
BACKUP DATABASE [master] TO DISK = @pathName WITH NOFORMAT, INIT, NAME = N'master', SKIP, NOREWIND, NOUNLOAD, STATS = 10

SET @pathName = 'c:\\mssql2005\backup\\db_model' + Convert(varchar(8), GETDATE(), 112)+ '.bak' 
BACKUP DATABASE [model] TO DISK = @pathName WITH NOFORMAT, INIT, NAME = N'model', SKIP, NOREWIND, NOUNLOAD, STATS = 10

SET @pathName = 'c:\\mssql2005\backup\\db_msdb' + Convert(varchar(8), GETDATE(), 112)+ '.bak' 
BACKUP DATABASE [msdb] TO DISK = @pathName WITH NOFORMAT, INIT, NAME = N'msdb', SKIP, NOREWIND, NOUNLOAD, STATS = 10

Единственное отличие, в том, что в имя добавлено имя базы, чтоб можно было быстрее вытащить ту что нужно.

И последний скрипт для копирования всех баз — all.sql:

DECLARE @name VARCHAR(50)
DECLARE @path VARCHAR(256)
DECLARE @fileName VARCHAR(256)
DECLARE @fileDate VARCHAR(20)
SET @path = 'C:\\MSSQL2005\\backup\\'
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 
 
DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
--WHERE name NOT IN ('master','model','msdb','tempdb') 
 
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   
WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @fileName = @path + 'db_'+ @name + '_' + @fileDate + '.BAK'  
       BACKUP DATABASE @name TO DISK=@fileName WITH NOFORMAT,INIT,NAME=@name,SKIP,NOREWIND,NOUNLOAD,STATS = 10       
       FETCH NEXT FROM db_cursor INTO @name   
END   
CLOSE db_cursor   
DEALLOCATE db_cursor

Здесь немного “хитрее”, в закомментированном условии можно перечислить базы которые следует исключить.

Теперь надо создать сценарий для их выполнения. Он будет один, чтоб не плодить одинаковые, а в параметре передавать какую базу мы хотим копировать:

@echo off
rem **************************************************************
rem
rem Скрипт для создания копии базы данных в поселении
rem
rem **************************************************************
rem НАСТРОЙКИ
rem ************************
set SQLCMDUSER=sa
set SQLCMDPASSWORD=секретый пароль
set SQLCMDSERVER=DEPO
set SQLCMDDBNAME=master

set SQLCMD="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe"
set BACKUP=C:\mssql2005\backup\
set ARC="c:\Program Files\7-Zip\7z.exe"
rem ************************
cd c:\mssql2005\tools
rem Удаляем файл последнего результата
if exist result.txt del result.txt

rem Проверяем переданный параметр
rem   s - Системные базы
rem   a - все базы
rem иначе формируем имя sql-скрипта, и проверяем 
rem наличие такого файла 

if %1==s ( 
  set SQL=sys.sql
) else if %1==a (
  set  SQL=all.sql 
) else set SQL=b%1.sql

rem если такой файл есть - значит выполняем копирование
rem а не нет и суда нет

if not exist %SQL% goto :END

%SQLCMD% -S DEPO -U sa -P stop -i %SQL%
if errorlevel 1 (
  echo Произошла ошибка при создании копии >> result.txt
  goto :END
)
rem Теперь заархивируем все полученные бэкапы 
rem с именем начинающимся на db_
%ARC% a "%BACKUP%\%1_%date%.7z" %BACKUP%\db_*.bak
if errorlevel 1 (
  echo Произошла ошибка при архивировании >> result.txt
  goto :END
)
echo Копия успешно создана! >> result.txt
echo Архив расположен в папке: %BACKUP% >> result.txt
echo Имя архива: %1_%date% >> result.txt

:END
rem Покажем результат
start result.txt

rem Обязательно чистим за собой, даже после ошибок
rem чтобы в следующий раз не архивировать "старые" копии
del c:\mssql2005\backup\db_*.bak

На этом ручное копирование можно закончить, ярлыки для запуска установим при инсталляции.

Копирование по расписанию.

Ежедневное.

Ежедневное копирование практически такое же как и ручное. Создаем два файлика: daily.sql – скрипт для копирования, фактически копия b13.sql и daily.bat – почти копия backup.bat из ручного, только убраны некоторые не нужные куски:

@echo off
rem **************************************************************
rem
rem Скрипт для создания ЕЖЕДНЕВНОЙ копии баз данных в поселении
rem
rem Копируются только рбочаяя база (текущего года)
rem
rem **************************************************************
rem НАСТРОЙКИ
rem ************************
set SQLCMDUSER=sa
set SQLCMDPASSWORD=секретый пароль
set SQLCMDSERVER=DEPO
set SQLCMDDBNAME=master

set SQLCMD="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe"
set BACKUP=C:\mssql2005\backup\
set ARC="c:\Program Files\7-Zip\7z.exe"
rem ************************
if exist result.txt del result.txt

cd c:\mssql2005\tools\
%SQLCMD% -S DEPO -U sa -P stop -i daily.sql
if errorlevel 1 (
  echo Произошла ошибка при создании копии >> result.txt
  start result.txt
  goto :END
)
%ARC% a "%BACKUP%\день_%date%.7z" %BACKUP%\db_*.bak
if errorlevel 1 (
  echo Произошла ошибка при архивировании >> result.txt
  start result.txt
)
:END
del c:\mssql2005\backup\db_*.bak

Осталось только запуск скрипта, архивация и чистка, никакой интерактивности, сообщения выводятся только при ошибке.

Еженедельное

Тут по аналогии с ежедневным: weekly.sql – это копия sys.sql из ручного копирования. А вот weekly.bat немного изменен. Чтоб не засорять место на диске, хранить еженедельную и ежемесячную копии будем только одну:

@echo off
rem **************************************************************
rem
rem Скрипт для создания ЕЖЕНЕДЕЛЬНОЙ копии баз данных в поселении
rem
rem Копируются только системные базы 
rem
rem **************************************************************
rem НАСТРОЙКИ
rem ************************
set SQLCMDUSER=sa
set SQLCMDPASSWORD=секретый пароль
set SQLCMDSERVER=DEPO
set SQLCMDDBNAME=master

set SQLCMD="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe"
set BACKUP=C:\mssql2005\backup\
set ARC="c:\Program Files\7-Zip\7z.exe"
rem ************************
if exist result.txt del result.txt

cd c:\mssql2005\tools\
rem Переименовываем предыдущую копию
rem Кроказаблы потому что имя на русском
rem и должно быть в DOS кодировке
rem имя архива: "неделя< ДАТА>.7z"
ren "%BACKUP%­Ґ¤Ґ«п_*.7z" "*.prev"
%SQLCMD% -S DEPO -U sa -P stop -i weekly.sql
if errorlevel 1 (
  echo Произошла ошибка при создании копии >> result.txt
  start result.txt
  goto :REST
)
rem Архивируем базы в "неделя<ДАТА>.7z"
%ARC% a "%BACKUP%\­Ґ¤Ґ«п_%date%.7z" %BACKUP%\db_*.bak
if errorlevel 1 (
  echo Произошла ошибка при архивировании >> result.txt
  start result.txt
  goto :REST
)
rem Так как все закончилось хорошо
rem удаляем предыдущий архив, 
rem который переименовывали в начале
del "%BACKUP%­Ґ¤Ґ«п*.prev"
GOTO :END

:REST
rem В случае ошибки надо за собой почистить
if exist "%BACKUP%­Ґ¤Ґ«п*.7z" del "%BACKUP%­Ґ¤Ґ«п*.7z"
rem и востановить предыдушую копию
ren "%BACKUP%*.prev" "*.7z"

:END
rem И в заключении чистим за собой
del c:\mssql2005\backup\db_*.bak

Ежемесячное

Я намерено не использую скрипты из “ручного” раздела, а создаю их копии – это добавляет гибкости системе. Например в ежедневном в течении первых двух месяцев в году(это с избытком времени), надо копировать две базы: текущую и прошлогоднюю, которую еще не “закрыли”. Единственный скрипт, который используется и не изменится — это скрипт месячного копирования, потому что он копирует все-все базы.

Исполняемый скрипт: monthly.bat – это еженедельный, только заменёнными именами. Weekly.sql заменен на all.sql, а имя архива с "неделя<ДАТА>.7z" заменен на "месяц<ДАТА>.7z"

Настройка выполнения

Есть замечательная команда: schtasks.exe. Которая позволяет управлять “Назначенными заданиями”.

  • schtasks.exe /delete – удалить задание
  • schtasks.exe – без параметров вывести список заданий и время запуска, полезно для диагностики по следующих обновлениях
  • schtasks.exe /create – добавить задание

Параметр /tn “Имя” – указывает имя задание, которое вы создаете или удаляете, /tr – имя команды которую надо выполнить, /ru – от имени какого пользователя выполнять, лучше ставить “Sysyem” чтобы задание выполнялось даже когда пользователь не вошел в систему. /sc совместно в другими параметрами (/d, /st, /mo) задают расписание, например, для ежедневного копирования в рабочие дни, кроме пятницы в 12:20 (время обеда и машина не должна быть нагружена):

/sc WEEKLY /mo 1 /d MON,TUE,WED,THU /st 12:20:00

В зависимости от параметра /st остальные могут принимать другие значения, лучше всего сверяться с хелпом в этом вопросе.

Создаем командный сценарий:

@echo off
schtasks /delete /tn "SQL Backup Ежедневно" /f
schtasks /delete /tn "SQL Backup Ежемесячно" /f
schtasks /delete /tn "SQL Backup Еженедельно" /f
schtasks /delete /tn "SQL Backup Пятница" /f
schtasks /delete /tn "SQL Backup Месяц" /f
schtasks /create /tn "SQL Backup Ежедневно" /tr c:\mssql2005\tools\daily.bat /sc WEEKLY /mo 1 /d MON,TUE,WED,THU /st 12:20:00 /ru "System" 
schtasks /create /tn "SQL Backup Ежемесячно" /tr c:\mssql2005\tools\monthly.bat /sc MONTHLY /d 1 /st 12:20:00 /ru "System"
schtasks /create /tn "SQL Backup Еженедельно" /tr c:\mssql2005\tools\weekly.bat /sc WEEKLY /mo 1 /d FRI /st 12:20:00 /ru "System" 

Сначала удалим на всякий случай старые задания с такими же именами, а потом создаем новые. Здесь удаляется больше чем создается, я чищу от прошлых вариантов.

Доставка

Везде, и у себя в фин.управлении и поселяениях в качестве архиватора использую 7z. Но для создания “мини инсталляторов” был куплен WinRar. Уж больно удобный модуль SFX у него.

Приступим, для начала создаем два файла: files.lst и create.bat. В первый запишем все файлы которые нам нужны для установки, во втором одна строка создание архива, если автоматизировать – то по максимуму:

create.bat
--------------
"C:\program files\winrar\winrar.exe" a -m5 -s -sfx -zcomment.txt abackup @files.lst

files.lst
--------------
all.sql
b10.sql
b11.sql
b12.sql
b13.sql
b6.sql
b7.sql
b8.sql
b9.sql
create.bat
daily.bat
daily.sql
monthly.bat
start.bat
sys.sql
weekly.bat
weekly.sql
backup.bat
backup.ico

Пару новых файлов: backup.ico – это иконка, нашел в тырнете, для ярлыков. А то стандартная для bat-файлов не фонтан. И start.bat – собственно, скрипт установки нашей системы, запускается после распаковки:

@echo off
rem Удаляем результаты предыдущих установок
if exist c:\result.zip del /s /q c:\result.zip
if exist *.txt del /s /q *.txt
if exist *.lst del /s /q *.lst
rem Создаем папку или чистим если уже есть
if not exist c:\mssql2005\tools md c:\mssql2005\tools
del /q /s c:\mssql2005\tools\*
rem Копируем наши файлы
copy /y *.sql c:\mssql2005\tools
copy /y backup.ico c:\mssql2005\tools
copy /y shedule.bat c:\mssql2005\tools
copy /y daily.bat c:\mssql2005\tools
copy /y weekly.bat c:\mssql2005\tools
copy /y monthly.bat c:\mssql2005\tools
copy /y backup.bat c:\mssql2005\tools
rem Выполняем создание заданий автомата
call c:\mssql2005\tools\shedule.bat > result.txt
rem Чистим от архивов старых версий
dir c:\mssql2005\backup >> before.lst
echo -----------Clearing >> result.txt
echo -----------WEEKLY >> result.txt
del /q /s c:\mssql2005\backup\weekly* >> result.txt
echo -----------DAILY 2010 >> result.txt
del /q /s c:\mssql2005\backup\daily_??.??.2010.7z >> result.txt
echo -----------DAILY 2011 >> result.txt
del /q /s c:\mssql2005\backup\daily_??.??.2011.7z >> result.txt
echo -----------DAILY 2012 >> result.txt
del /q /s c:\mssql2005\backup\daily_??.??.2012.7z >> result.txt
dir c:\mssql2005\backup >> after.lst
rem Готовим файл результата, который пришлют мне
"C:\Program Files\7-Zip\7z.exe" a -tzip -mx=9 c:\result.zip result.txt *.lst
rem Как всегда чистим за собой
del /q /s *.txt
del /q /s *.lst

И последнее это комментарий для архива, в случае SFX, там содержатся команды. Распаковать, после распаковки выполнить start.bat, все сделать по тихому, перезаписать без вопросов, если вдруг такое уже есть, в блоке License пишем текст для пользователя, что это за обновление/установка и последнее создаем ярлыка в меню “пуск”:

;The comment below contains SFX script commands

Path=C:\distrib\distAISBP_PFO\tools\backup\
SavePath
Setup=C:\distrib\distAISBP_PFO\tools\backup\start.bat
Silent=2
Overwrite=1
Title=Архивация АИСБП
License=Архивация АИСБП
{

Архивация АИСБП

  • Настройка ежедневной автоматической архивации базы 2013 года
    каждый день в 12:20
  • Настройка еженедельной автоматической архивации системных баз
    каждую пятницу в 12:20
  • Настройка ежемесячной архивации всех баз
    каждое 1-е число 10:00
  • Добавление соответствующих пунктов в Программы-АИСБП-Утилиты-Резервное копирование
Не забываем отправить result.zip
После установки рекомендую выполнить резервное копирование всех баз

Обращаю внимание что на диске С: должно быть достаточно места

} Shortcut=P, "C:\MSSQL2005\tools\backup.bat 6", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2006 года", "2006 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat 7", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2007 года", "2007 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat 8", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2008 года", "2008 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat 9", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2009 года", "2009 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat 10", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2010 года", "2010 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat 11", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2011 года", "2011 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat 12", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2012 года", "2012 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat 13", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии базы 2013 года", "2013 год",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat s", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии системных баз", "Системные базы",c:\mssql2005\tools\backup.ico Shortcut=P, "C:\MSSQL2005\tools\backup.bat a", "АИСБП\Утилиты\Резервное копирование", "Создание резервной копии всех баз", "Все базы",c:\mssql2005\tools\backup.ico


Готовый пакет можно скачать от сюда: backup.zip.

А “исходные” файлы отсюда:backup.7z

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.