Как правильно перенести файлы базы данных SQL Server на другой диск

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе эксплуатации информационных баз 1С на сервере СУБД Microsoft SQL Server свободное дисковое пространство на системном или основном накопителе может закончиться. В такой ситуации возникает необходимость перенести файлы данных (.mdf) и журнала транзакций (.ldf) на другой локальный диск большего объема. Однако при выполнении этой операции администраторы часто сталкиваются с ошибкой 5041 (Не удалось выполнить оператор MODIFY FILE) или переходом базы данных в режим Read-Only (только для чтения). Разберем причины этих проблем и рассмотрим надежные способы переноса базы данных без потери настроек кластера 1С.

Причина ошибки 5041 при выполнении MODIFY FILE

Проанализируем ошибку, возникающую при попытке изменить расположение файла через скрипт:

Сообщение 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 (рекомендуемый)

Этот способ позволяет перенести файлы без полного отсоединения базы от сервера, сохраняя структуру метаданных СУБД и привязку в кластере серверов 1С:Предприятия. Разберем процедуру по шагам:

  1. Блокировка сеансов в 1С: в консоли администрирования кластера серверов 1С:Предприятия устанавливаем блокировку начала сеансов и регламентных заданий, после чего принудительно завершаем все активные соединения пользователей.
  2. Перевод базы данных в режим Offline: переводим базу в автономный режим с немедленным сбросом незавершенных транзакций: ALTER DATABASE [ИмяБазы] SET OFFLINE WITH ROLLBACK IMMEDIATE;
  3. Физическое перемещение файлов: средствами операционной системы копируем или перемещаем файлы .mdf и .ldf в новый каталог на диске E:.
  4. Изменение метаданных путей: указываем СУБД новое расположение каждого файла, используя правильные логические имена:
    
    ALTER DATABASE [ИмяБазы] 
    MODIFY FILE (NAME = 'ЛогическоеИмя_Data', FILENAME = 'E:\SQLData\Base.mdf');
    
    ALTER DATABASE [ИмяБазы] 
    MODIFY FILE (NAME = 'ЛогическоеИмя_Log', FILENAME = 'E:\SQLData\Base_log.ldf');
    
  5. Перевод базы данных в режим Online: возвращаем базу в рабочий режим: ALTER DATABASE [ИмяБазы] SET ONLINE;
  6. Снятие блокировки сеансов: в консоли кластера 1С снимаем блокировку сеансов. Параметры подключения к СУБД в свойствах информационной базы 1С менять не требуется.

Решение проблемы с режимом Read-Only и настройка прав NTFS

Если после перемещения или отсоединения/присоединения (Detach / Attach) база данных открывается только для чтения (Read-Only), а попытка изменить свойство вызывает ошибку, причина заключается в ограничениях безопасности файловой системы NTFS.

Служба SQL Server выполняется под собственной системной или виртуальной учетной записью (например, NT SERVICE\MSSQLSERVER или NT SERVICE\MSSQL$ИмяЭкземпляра). При переносе файлов в новый каталог эта учетная запись часто теряет права на запись.

Разберем, как восстановить корректный доступ:

  1. Открываем свойства целевой папки на диске E: в Проводнике Windows.
  2. Переходим на вкладку Безопасность и нажимаем Изменить.
  3. Добавляем учетную запись службы SQL Server (или группу пользователей SQL Server) и предоставляем ей разрешение Полный доступ (Full Control).
  4. Нажимаем кнопку Дополнительно и отмечаем флаг Заменить все разрешения дочернего объекта применяемыми от этого объекта, чтобы права применились непосредственно к файлам .mdf и .ldf.

Способ 2. Восстановление из резервной копии с параметром WITH MOVE

Если требуется перенести базу данных без ручной настройки прав на файлы, рассмотрим метод создания и восстановления резервной копии. При восстановлении SQL Server создает файлы самостоятельно и автоматически назначает на них необходимые сервисные права.

  1. Создаем полную резервную копию исходной базы данных:
    
    BACKUP DATABASE [ИмяБазы] 
    TO DISK = 'E:\Backup\Base_Full.bak' 
    WITH INIT, STATS = 10;
    
  2. Восстанавливаем базу данных по новым путям:
    
    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;
    

Способ 3. Перенос через выгрузку информационной базы 1С (.dt)

Для баз данных небольшого и среднего объема (до нескольких десятков гигабайт) можно применить штатный механизм платформы 1С:Предприятие:

  1. В режиме Конфигуратор открываем пункт меню Администрирование -> Выгрузить информационную базу... и сохраняем файл .dt.
  2. В среде SQL Server Management Studio создаем новую пустую базу данных на целевом диске E: либо удаляем старую и создаем заново.
  3. В консоли администрирования 1С перенаправляем информационную базу на новую базу СУБД.
  4. Запускаем Конфигуратор и загружаем данные через меню Администрирование -> Загрузить информационную базу....

Важно: для крупных информационных баз объемом от 50-100 Гб выгрузка через .dt не рекомендуется из-за длительного времени обработки и внутренних ограничений формата. В таких случаях следует использовать перенос через ALTER DATABASE ... MODIFY FILE или восстановление из .bak.

← На главную