При настройке регулярного резервного копирования баз данных MS SQL Server на удаленный сетевой ресурс администраторы нередко сталкиваются с падением регламентных заданий. В журнале выполнения запроса при этом путь к целевому каталогу отображается с удвоенными обратными слэшами вида \\\\192.168.10.2\\backup\\..., а сама операция прерывается системной ошибкой 64 или ошибкой парсера 155. Разберем детально, почему так происходит, изменяет ли SQL Server исходный T-SQL скрипт на самом деле и как правильно организовать отказоустойчивое резервное копирование.
Рассмотрим типовой сценарий резервного копирования, вызывающий подобные вопросы:
DECLARE @Nw3 NVARCHAR(512);
SET @Nw3 = '\\192.168.10.2\bukh\bukh_' + Convert(varchar(8), GETDATE(), 112) + '.bak';
BACKUP DATABASE [bukh]
TO DISK = @Nw3
WITH NOFORMAT, INIT, NAME = N'db_backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
Проанализируем природу появления двойных обратных слэшей в тексте ошибки. В сообщениях об ошибках SQL Server и агента заданий строка пути действительно выводится в формате \\\\192.168.10.2\\bukh\\.... Из-за этого может сложиться ошибочное впечатление, что СУБД самостоятельно подменяет путь к файлу.
На самом деле SQL Server не добавляет лишние символы в сформированную строковую переменную. В этом легко убедиться, выполнив вывод значения переменной в консоль через команду SELECT @Nw3; — на экран вернется корректный путь с одиночными разделителями.
Удвоение символа обратного слэша в сообщениях об ошибках — это стандартный системный механизм экранирования (escaping) служебных символов в подсистемах логирования SQL Server и служб интеграции (SSIS). Так как обратный слэш является управляющим символом во многих языках программирования и внутренних парсерах, механизм вывода журналов дублирует его для однозначной строковой интерпретации. В ядро СУБД для выполнения операции всегда передается исходный путь без лишних символов.
Если в журнале зафиксировано сообщение: Невозможно открыть устройство резервного копирования. Ошибка операционной системы 64 (Указанное сетевое имя более недоступно.), это означает, что сетевое соединение между сервером базы данных и целевым SMB-хранилищем было принудительно разорвано в процессе записи потока данных.
Выясним основные причины возникновения этой проблемы:
.bak антивирусом "на лету" на стороне целевого сетевого ресурса блокирует дескриптор файла в момент записи блока данных SQL-сервером.Для устранения ошибки 64 выполним следующие шаги настройки:
Разрешить отключение этого устройства для экономии энергии..bak и целевую сетевую директорию в список постоянных исключений.NT Service\MSSQLSERVER или Local System, необходимо предоставить полные права на сетевую папку и NTFS учетной записи компьютера источника (в формате ДОМЕН\ИМЯ_СЕРВЕРА$) либо перевести службу на доменную сервисную учетную запись.При выполнении сценария резервного копирования через SQL Server Agent может возникнуть синтаксическая ошибка: 'compression' is not a recognized BACKUP option. [SQLSTATE 42000] (Error 155).
Разберем причину этого поведения. Возможность сжатия резервных копий зависит от используемой версии и редакции MS SQL Server:
Чтобы выяснить точную редакцию вашего экземпляра, выполним диагностический запрос:
SELECT @@VERSION;
SELECT SERVERPROPERTY('Edition') AS Edition, SERVERPROPERTY('ProductLevel') AS ProductLevel;
Если используемая редакция не поддерживает сжатие, необходимо удалить параметр COMPRESSION из команды BACKUP DATABASE.
Если редакция поддерживает сжатие (например, Standard 2008 R2 или Enterprise), рекомендуется включить сжатие по умолчанию на уровне сервера один раз через конфигурационные параметры:
EXEC sp_configure 'backup compression default', 1;
RECONFIGURE;
После включения этой настройки все создаваемые резервные копии будут автоматически сжиматься без необходимости явного указания параметра COMPRESSION в коде T-SQL.
Прямая запись больших файлов баз данных по сети (SMB/UNC-путь) во время работы СУБД является ненадежной практикой, так как любой кратковременный сетевой сбой прерывает транзакцию создания бэкапа целиком. Наиболее отказоустойчивым решением является двухэтапная схема:
D:\Backup\). Это гарантирует максимальную скорость операции и независимость от состояния сети.robocopy с параметрами перезапуска при обрывах /R:3 /W:5 /Z).