MSSQL Ошибка 5170: Cannot create file because it already exists — Решение
- Сообщение:
Msg 5170, Level 16, State 1: Cannot create file 'D:\Data\Base1C.mdf' because it already exists. Change the file path or the name, and retry the operation. - Сбой при развертывании копии рабочей базы 1С для разработки или тестирования.
- Ошибка при попытке создания новой базы с именем, которое ранее уже использовалось.
1. Перезапись файлов при восстановлении из бэкапа (WITH REPLACE)
Если выполняется операция восстановления поверх существующей тестовой базы, явно укажите флаг перезаписи REPLACE:
RESTORE DATABASE [Base1C_Test]
FROM DISK = N'D:\Backup\Base1C_prod.bak'
WITH
MOVE N'Base1C_Data' TO N'D:\Data\Base1C_Test.mdf',
MOVE N'Base1C_Log' TO N'D:\Data\Base1C_Test_log.ldf',
REPLACE, RECOVERY;
GO2. Удаление брошенных (Orphaned) файлов на диске
Если база данных была ранее удалена из SSMS без фактического удаления файлов с файловой системы:
- Проверьте, не подключен ли данный файл к другой базе:
SELECT name, physical_name FROM sys.master_files WHERE physical_name LIKE '%Base1C.mdf%';
GO- Если файл не числится в
sys.master_files, переименуйте или удалите его вручную в проводнике Windows.
3. Использование уникальных имен для новых баз
При создании нескольких тестовых баз на одном сервере задавайте уникальные имена физических файлов:
CREATE DATABASE [Base1C_Dev] ON
( NAME = N'Base1C_Dev_Data', FILENAME = N'D:\Data\Base1C_Dev.mdf' )
LOG ON
( NAME = N'Base1C_Dev_Log', FILENAME = N'D:\Data\Base1C_Dev_log.ldf' );
GO Частые вопросы (FAQ)
Почему DROP DATABASE иногда оставляет файлы на диске?
Если во время удаления базы данных диск был перегружен или антивирус заблокировал дескриптор файла, запись из системного каталога удаляется, но физический файл остается на накопителе.
Опасно ли использовать параметр WITH REPLACE?
Да, параметр WITH REPLACE без предупреждения перезапишет существующие файлы базы данных с тем же именем. Используйте его с осторожностью, чтобы случайно не затереть рабочую базу 1С.
Что делать, если файл занят и не удаляется из проводника?
Используйте утилиту OpenFiles или Process Explorer, чтобы найти процесс, удерживающий дескриптор (часто это сторонний сервис бэкапа или зависший поток СУБД).
Как скриптом проверить существование файла перед созданием базы?
Используйте системную процедуру: EXEC master.dbo.xp_fileexist 'D:\Data\Base1C.mdf', @result OUTPUT.