Бэкап 1С SQL скриптом в CMD без дополнительных сторонних программ

Материал из Викиадмин
Версия от 13:43, 16 ноября 2018; Aleksdem (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

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

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

;;указываем папку с датой
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-файл размером с саму базу. Разумеется, никто не запрещает это сжимать, если потребуется, или добавить уведомление на почту типа:

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:

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

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

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

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

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'"

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