MS SQL
February 25

Резервное копирование MS SQL баз в сетевой каталог  

Для начала нужно сделать пользователя для SQL Server Agent для того чтобы монтировать сетевой диск.

  • Активируйте xp_cmdshell в SQL Server run script (один раз):
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
  • Далее идём в SSMS -> SQL server agent -> Jobs
  • Смонтируйте сетевой диск:
EXEC xp_cmdshell 'net use X: \\u443481.your-storagebox.de\u443481-sub1 /user:username password';
  • После успешного монтирования выполните резервное копирование:
BACKUP DATABASE [boykomtest] TO DISK = 'X:\backup\boykomtest.bak' WITH INIT, COMPRESSION, CHECKSUM;
  • По завершении работы отключите сетевой диск:
EXEC xp_cmdshell 'net use X: /delete';

Если хочется копировать все пользовательские базы данных то скрипт будет выглядеть вот так:

DECLARE @BackupPath NVARCHAR(255) = '\\u443481.your-storagebox.de\u443481-sub1\backup\'
DECLARE @DatabaseName NVARCHAR(255)
DECLARE @BackupFile NVARCHAR(500)
DECLARE @SQL NVARCHAR(MAX)

-- Курсор для перебора всех пользовательских баз данных
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE database_id > 4 -- Исключаем системные базы данных
AND name NOT IN ('CompressionSetting') -- Исключаем определённые базы

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DatabaseName

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Формируем имя файла бэкапа с полным путем
    SET @BackupFile = @BackupPath + 'full_' + @DatabaseName + '_'
                      + REPLACE(CONVERT(NVARCHAR, GETDATE(), 120), ':', '-') + '.bak'
    
    -- Формируем SQL-запрос для выполнения бэкапа
    SET @SQL = 'BACKUP DATABASE [' + @DatabaseName + '] TO DISK = ' + QUOTENAME(@BackupFile, '''') + '
                WITH INIT, COMPRESSION, CHECKSUM, FORMAT;'
    
    -- Логируем SQL-запрос для отладки
    PRINT 'Executing: ' + @SQL

    -- Выполняем бэкап
    EXEC sp_executesql @SQL

    -- Переход к следующей базе данных
    FETCH NEXT FROM db_cursor INTO @DatabaseName
END

CLOSE db_cursor
DEALLOCATE db_cursor
or
db_cursor
DEALLOCATE db_cursor