Резервное копирование (Backup, Бэкап)

Итак, у нас есть задача: делать резервную копию (бэкап) 1С с базой в SQL. На выходе получать ежедневно папку с датой и хранить на удалённом бэкап-сервере. Решается достаточно просто, ведь на самом SQL-сервере есть CMD и SQLCMD.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;;указываем папку с датой
set today=%date:~-10,2%%date:~-7,2%%date:~-4,4%%
;; создаём каталог для временных файлов, если его нет
mkdir D:\backup

;; удаляем старые бэкапы, если они есть
DEL /F D:\backup\*.bak

;; бэкапим непосредственно базу. Если их несколько, добавляем строчки
SQLCMD -S (local) -U sa -P PASSWORD -Q "BACKUP DATABASE demo TO DISK = 'D:\backup\demo.bak' WITH INIT, NOFORMAT, SKIP, NOUNLOAD"

;; монтируем удалённую шару в cmd
net use P: \\bsrv\SQL /user:USER PASSWORD

;; создаём папку с нужной нам датой (сегодня)
mkdir P:\%today%

;; копируем все бэкапы в папку с датой
COPY /Y D:\backup\*.bak P:\%today%\

;; отключаем диск, нечего его держать подключенным всё время
net use P: /delete

В итоге получаем bak-файл размером с саму базу. Разумеется, никто не запрещает это сжимать, если потребуется, или добавить уведомление на почту типа:

1
2
3
4
Set checkfile=P:\%today%\demo.bak

IF EXIST  %checkfile% start D:\backup\send_good_mail.cmd
IF NOT EXIST  %checkfile%  start D:\backup\send_bad_mail.cmd

Восстановление базы SQL 1С из bak-файла

Восстановить В ТУ ЖЕ БАЗУ можем так же с помощью SQLCMD:

1
SQLCMD -S (local) -U sa -P PASSWORD -Q "RESTORE DATABASE demo FROM DISK='D:\backup\demo.bak' WITH REPLACE"

При этом заменятся все данные, если они есть. Однако есть проблемка, если восстанавливать нужно в базу с другим названием. Дело в том, что файлы с данными и логами будут создаваться по названию забэкапленной базы. Если подливаем не в demo, а в demo2, например, то сначала смотрим какие есть пути в бэкапе

1
SQLCMD -S (local) -U sa -P PASSWORD -Q "RESTORE FILELISTONLY FROM DISK='D:\backup\demo.bak'"

И потом уже заливаем, указывая нужные данные для файлов

1
2
SQLCMD -S (local) -U sa -P PASSWORD -Q "RESTORE DATABASE demo2 FROM DISK='D:\backup\demo.bak' WITH REPLACE,
 FILE=1, MOVE 'demo' TO 'D:\MSSQL\DATA\demo2.mdf', MOVE 'demo_log' TO 'D:\MSSQL\DATA\demo2_log.ldf'"

В данном случае путь, разумеется, указан мой, ориентируйтесь на свои данные.