Бекап средствами MS SQL во внешний источник по датам

08.02.17

База данных - Архивирование (backup)

Бекап средствами MS SQL (Transact-SQL) всех баз во внешний источник по папочкам и датам

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

Есть очень много вариантов решений такой задачи. Но безопасники ограничили выбор чисто на MS SQL. 
Пошарив в интернете и написал такой код, может, не идеальный, но рабочий.  Открыт для поправок и критики =) 
USE Master;
GO
SET NOCOUNT ON

DECLARE @DBName nvarchar(500)
DECLARE @DBName_folder nvarchar(500)
DECLARE @DBDate_folder nvarchar(500)
DECLARE @Server nvarchar(500)
DECLARE @Server_folder nvarchar(500)  
DECLARE @DataPath_backUp nvarchar(500)
DECLARE @LogPath nvarchar(500)
DECLARE @DBName_file nvarchar(500)
DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT)
DECLARE @DirTree_date TABLE (subdirectory nvarchar(255), depth INT)



--Путь к внешнему источнику(хранилишю) 
SET @DataPath_backUp = '\\ServerBackup\1c-backups\'

--Получаем дерево всех папок 
INSERT INTO @DirTree(subdirectory, depth)
EXEC master.sys.xp_dirtree @DataPath_backUp


--Делаем имя папки текущую дату
set @DataPath_backUp  = @DataPath_backUp + '\' + Convert(varchar(8), GETDATE(), 112)

--Проверяем есть ли такая папка, если нет то создаем
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = Convert(varchar(8), GETDATE(), 112))
EXEC master.dbo.xp_create_subdir @DataPath_backUp

--Делаем дерево всех папок вложеных в папку день(это уже базы)
INSERT INTO @DirTree_date(subdirectory, depth)
EXEC master.sys.xp_dirtree @DataPath_backUp


--Делаем запрос в SQL всех баз для бекапа, я делал запрос по модели восстановления - полная
DECLARE @CURSOR CURSOR

SET @CURSOR  = CURSOR SCROLL
for (SELECT name FROM sys.databases 
where service_broker_guid <> '00000000-0000-0000-0000-000000000000' and recovery_model_desc = 'FULL') 

OPEN @CURSOR

FETCH NEXT FROM @CURSOR INTO @DBName

WHILE @@FETCH_STATUS = 0
	BEGIN
	--перебераем базы и создаем папки  

	set @DBName_folder =  @DataPath_backUp + '\'+ @DBName

		IF NOT EXISTS (SELECT 1 FROM @DirTree_date WHERE subdirectory = @DBName)
		begin

		EXEC master.dbo.xp_create_subdir @DBName_folder
		end

		set @DBName_file =  @DBName_folder +'\'+ @DBName + '_' + Convert(varchar(8), GETDATE(), 112)+ '.bak' 
     --код самого бекапа 
    BACKUP DATABASE @DBName TO  DISK = @DBName_file WITH NOFORMAT, NOINIT,  NAME = @DBName, COMPRESSION, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
	--
	FETCH NEXT FROM @CURSOR INTO @DBName
	END

-- очищаем данные 
DELETE FROM @DirTree
DELETE FROM @DirTree_date

SQL бекап по датам

См. также

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    72788    625    45    

84

Архивирование (backup) Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Программа позволяет выполнять автоматическое создание копий файловых и серверных информационных баз 1С Предприятие 8 и размещение копий в облаке Яндекс.Диск, локальном или сетевом ресурсе.

1200 руб.

03.09.2014    15705    21    6    

27

Архивирование (backup) Администрирование СУБД Системный администратор Россия Бесплатно (free)

Постараюсь объяснить, зачем нужно резервное копирование именно журнала транзакций, а не только базы данных, и почему я словно сбросил груз, настроив его - как, покажу, естественно. Кстати, будут скрипты T-SQL (с подробными комментариями) - отличный способ сделать администрирование базы более уютным.

04.12.2023    9426    n_mezentsev    15    

27

Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной инструкции будет описано, как с помощью pgAdmin, bat-файлов и планировщика заданий Windows организовать резервное копирование, восстановление и хранение копий баз данных.

07.10.2022    28599    sapervodichka    37    

147

Архивирование (backup) Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Захотелось клиентам выгрузку архива баз, и выгрузку в дт, готовые скрипты с сети не заработали. Может, кому-то поможет. Релиз 8.3.18.1741.

1 стартмани

25.08.2022    5732    3    Gnom-Gluck    6    

7

Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Абонемент ($m)

Небольшая утилита для копирования файловых баз данных 1С.

1 стартмани

02.06.2022    4689    3    Giblarium    12    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sansys 76 08.02.17 12:06 Сейчас в теме
Хороший скрипт, ещё-бы список баз прикрутить, а то есть тестовые которые сохранять нет необходимости.
3. sssss_aaaaa_2011 08.02.17 12:13 Сейчас в теме
(1)Не очень хороший.
1. Использует сетевые пути. Кроме описанного в моем первом сообщении еще и права надо sql дать на сервере с бэкапами.
2. Курсор, туча переменных и чисто императивный подход в декларативном языке. Можно обойтись 1(одним!) select'ом для генерации всего одной строки со всеми командами, которые таки вызываются через курсор. После чего exec (@cmd) и вуа-ля!
4. sansys 76 08.02.17 12:16 Сейчас в теме
(3) Пример в студию! Будет интересно посмотреть.
5. sssss_aaaaa_2011 08.02.17 12:36 Сейчас в теме
(4) Прямо сейчас под рукой нет, но вот есть пример для понимания самой идеи.
Задача: получить список всех таблиц с количеством записей в каждой.
Исходно задача решалась, как и обсуждаемая здесь, так же в лоб, с курсором и примерно таким же количеством кода.

Однако, нашелся и такой вариант:
declare @str varchar(max);
cre ate   table #t (T_Name sysname, cnt int);
sel ect 
  @str = replace(
	(
		sel ect 'ins ert into #t select '''+TABLE_NAME+''',count(*) fr om '+TABLE_NAME+char(160) as 'data()' 
		fr om INFORMATION_SCHEMA.TABLES wh ere TABLE_TYPE = 'BASE TABLE'
		for xml path('')
	)
  , char(160), ';')
 exec (@str)
 sele ct * fr om #t
 dr op   table #t
Показать
NeviD; sansys; +2 Ответить
7. ILYXA 10 08.02.17 12:42 Сейчас в теме
(3)
1. Да, службу SQL я запускаю с служебного пользователя с доступами. Так стояла задача.
2. Есть чему учиться =)
8. sssss_aaaaa_2011 08.02.17 12:58 Сейчас в теме
(7) Ну так надо админам объяснить, что сие решение не самое хорошее ибо передача по сети может не успевать за выполнением бэкапа и тормозить процесс, к тому же и по надежности сильно не соответствует важности операции. Плюс еще пляски с юзерами и правами. И вместо этого давно придуман вариант с отдельным локальным диском, с которого уже сами админы могут забирать бэкап любыми понравившимися им способами.
6. ILYXA 10 08.02.17 12:40 Сейчас в теме
(1) Из-за я выделил уровень восстановление, у рабочих FULL, у тестовых Simple
2. sssss_aaaaa_2011 08.02.17 12:07 Сейчас в теме
(0)Бэкап сразу на сетевой путь есть большое зло. Лучше на локальный диск и потом уже с него в сеть.
ArtemFF; imedeev; +2 Ответить
9. Saipl 7 08.02.17 14:48 Сейчас в теме
Реализовали данную схему подключением диска для бэкапов с использованием iscsi (вроде локальный да не совсем) я думаю организация которая имеет "безопасников" может позволить себе железку с поддержкой данной технологии. Но как написал автор это одно из решений за это +
10. asved.ru 36 15.02.17 08:43 Сейчас в теме
И снова русская народная забава по изобретению велосипедов.

https://ola.hallengren.com/
Оставьте свое сообщение