В процессе эксплуатации информационных баз 1С на сервере СУБД Microsoft SQL Server свободное дисковое пространство на системном или основном накопителе может закончиться. В такой ситуации возникает необходимость перенести файлы данных (.mdf) и журнала транзакций (.ldf) на другой локальный диск большего объема. Однако при выполнении этой операции администраторы часто сталкиваются с ошибкой 5041 (Не удалось выполнить оператор MODIFY FILE) или переходом базы данных в режим Read-Only (только для чтения). Разберем причины этих проблем и рассмотрим надежные способы переноса базы данных без потери настроек кластера 1С.
Проанализируем ошибку, возникающую при попытке изменить расположение файла через скрипт:
Сообщение 5041 сообщает, что файл не существует. Главная причина кроется в параметре NAME. В инструкции MODIFY FILE параметр NAME ожидает не имя базы данных и не физическое имя файла на диске, а внутреннее логическое имя файла в метаданных SQL Server.
Выясним точные логические имена всех файлов целевой базы данных с помощью запроса:
SELECT name, physical_name, type_desc
FROM sys.master_files
WHERE database_id = DB_ID('ИмяБазы');
Посмотрим на результат выполнения: колонка name содержит точные логические имена (например, База_Data и База_Log), которые и следует использовать в операторах управления базой.
Этот способ позволяет перенести файлы без полного отсоединения базы от сервера, сохраняя структуру метаданных СУБД и привязку в кластере серверов 1С:Предприятия. Разберем процедуру по шагам:
ALTER DATABASE [ИмяБазы] SET OFFLINE WITH ROLLBACK IMMEDIATE;
.mdf и .ldf в новый каталог на диске E:.
ALTER DATABASE [ИмяБазы]
MODIFY FILE (NAME = 'ЛогическоеИмя_Data', FILENAME = 'E:\SQLData\Base.mdf');
ALTER DATABASE [ИмяБазы]
MODIFY FILE (NAME = 'ЛогическоеИмя_Log', FILENAME = 'E:\SQLData\Base_log.ldf');
ALTER DATABASE [ИмяБазы] SET ONLINE;
Если после перемещения или отсоединения/присоединения (Detach / Attach) база данных открывается только для чтения (Read-Only), а попытка изменить свойство вызывает ошибку, причина заключается в ограничениях безопасности файловой системы NTFS.
Служба SQL Server выполняется под собственной системной или виртуальной учетной записью (например, NT SERVICE\MSSQLSERVER или NT SERVICE\MSSQL$ИмяЭкземпляра). При переносе файлов в новый каталог эта учетная запись часто теряет права на запись.
Разберем, как восстановить корректный доступ:
E: в Проводнике Windows..mdf и .ldf.Если требуется перенести базу данных без ручной настройки прав на файлы, рассмотрим метод создания и восстановления резервной копии. При восстановлении SQL Server создает файлы самостоятельно и автоматически назначает на них необходимые сервисные права.
BACKUP DATABASE [ИмяБазы]
TO DISK = 'E:\Backup\Base_Full.bak'
WITH INIT, STATS = 10;
RESTORE DATABASE [ИмяБазы]
FROM DISK = 'E:\Backup\Base_Full.bak'
WITH
MOVE 'ЛогическоеИмя_Data' TO 'E:\SQLData\Base.mdf',
MOVE 'ЛогическоеИмя_Log' TO 'E:\SQLData\Base_log.ldf',
REPLACE,
STATS = 10;
Для баз данных небольшого и среднего объема (до нескольких десятков гигабайт) можно применить штатный механизм платформы 1С:Предприятие:
Конфигуратор открываем пункт меню Администрирование -> Выгрузить информационную базу... и сохраняем файл .dt.E: либо удаляем старую и создаем заново.Конфигуратор и загружаем данные через меню Администрирование -> Загрузить информационную базу....Важно: для крупных информационных баз объемом от 50-100 Гб выгрузка через .dt не рекомендуется из-за длительного времени обработки и внутренних ограничений формата. В таких случаях следует использовать перенос через ALTER DATABASE ... MODIFY FILE или восстановление из .bak.