При работе с базами данных 1С на платформе MS SQL Server 2016 системные администраторы часто сталкиваются с ситуацией, когда стандартная процедура восстановления базы данных из бэкапа завершается ошибкой. Сообщение вида «Файл заменить невозможно. Он используется базой данных» (Microsoft.SqlServer.SmoExtended) может поставить в тупик, особенно если все активные соединения с базой через консоль администрирования 1С уже разорваны. Проанализируем причины этой проблемы и разберем по шагам, как правильно выполнить восстановление в современных версиях SQL Server.
Основная сложность заключается в том, что начиная с версии SQL Server 2012 и особенно в 2016, логика работы мастера восстановления в SQL Server Management Studio (SSMS) несколько изменилась по сравнению со старыми версиями (например, 2008 R2). Ошибка возникает из-за того, что SQL Server пытается защитить данные или некорректно сопоставляет пути к файлам. Выясним основные факторы, мешающие процессу:
rmngr или rphost могут удерживать соединения или пытаться восстановить их автоматически.Прежде всего, нам необходимо гарантировать, что база данных не занята. Рассмотрим ситуацию: вы отключили пользователей в консоли 1С, но SQL Server всё равно считает базу занятой. Проанализируем, как принудительно разорвать все связи. Вместо использования SP_WHO и ручного удаления каждого SPID, мы рекомендуем использовать скрипт перевода базы в режим исключительного доступа с немедленным разрывом всех транзакций.
USE [master];
GO
ALTER DATABASE [Имя_Вашей_Базы]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
Обратите внимание на параметр ROLLBACK IMMEDIATE. Он заставляет SQL Server мгновенно отменить все незавершенные транзакции и закрыть соединения. Однако здесь кроется ловушка: если вы используете SSMS и у вас открыто дерево объектов (Object Explorer), само приложение может занять это единственное доступное соединение, и вы получите ошибку доступа к свойствам базы (например, по MaxDop). Рассмотрим подробнее, как этого избежать в следующих шагах.
Перейдем к мастеру восстановления базы данных. Посмотрим на критически важные настройки во вкладке «Параметры» (Options). Для успешного замещения существующей базы 1С необходимо выполнить следующие действия:
Выясним причину, по которой SQL Server может пытаться перезаписать файлы не той базы. Если вы восстанавливаете копию базы в тестовую среду, обязательно перейдите на вкладку «Файлы» (Files).
Проанализируем колонку «Восстановить как» (Restore As). В SQL Server 2016 при выборе бэкапа пути могут автоматически сброситься на те, которые были в исходной базе (откуда делался бэкап). Если пути в бэкапе совпадают с путями работающей промышленной базы, SQL Server выдаст ошибку, так как не может перезаписать файлы «живой» базы. Убедитесь, что в путях указаны правильные файлы .mdf и .ldf именно вашей целевой (тестовой) базы данных.
Рассмотрим ситуацию, когда все настройки в SQL верны, но ошибка сохраняется. Проанализируем права доступа на уровне операционной системы Windows. SQL Server 2016 предъявляет строгие требования к учетной записи, под которой запущена служба MSSQLSERVER.
F:\DATABASE\.В контексте работы с 1С важно понимать, что служба 1C:Enterprise 8.3 Server Agent может быть крайне агрессивной в плане переподключения. Если база пустая или только что созданная, 1С может мгновенно инициировать фоновые задания. Рассмотрим надежный алгоритм действий:
services.msc) на время проведения работ.Этот метод гарантирует, что никакие внутренние механизмы 1С не помешают SQL Server захватить монопольный доступ к файлам базы данных.
Проанализировав проблему, мы видим, что «нелогичность» ошибки в SQL Server 2016 часто обусловлена скрытыми настройками интерфейса. Подведем итог: для успешного восстановления базы 1С поверх существующей всегда проверяйте отключение Tail-Log Backup, используйте WITH REPLACE и внимательно следите за соответствием логических имен файлов физическим путям во вкладке Files. Если вы используете скрипты T-SQL, типовая команда должна выглядеть следующим образом:
RESTORE DATABASE [test_database]
FROM DISK = N'D:\Backups\source_base.bak'
WITH FILE = 1,
MOVE N'source_base_Data' TO N'F:\DATABASE\test_copy.mdf',
MOVE N'source_base_Log' TO N'F:\DATABASE\test_copy_log.ldf',
NOUNLOAD, REPLACE, STATS = 5;
Использование флага REPLACE в коде эквивалентно галочке в интерфейсе и позволяет принудительно перезаписать файлы, даже если их структура отличается от структуры в бэкапе.