Попытка подключить файл mdf к localDb вызывает ошибку, по крайней мере, один файл требуется
![Вот ошибка]()
TITLE: Студия управления Microsoft SQL Server
Ошибка подключения базы данных для сервера '(localdb)\mssqllocaldb'. (Microsoft.SqlServer.Smo)
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Для подключения базы данных требуется как минимум один файл. (Microsoft.SqlServer.Smo)
Я пытаюсь прикрепить этот файл базы данных .mdf
к моему экземпляру LocalDb. Это нормально, если я могу это сделать и на SQL Server. У меня есть файл .ldf
в том же каталоге
Ответы
Ответ 1
Для завершения сакэ - комментарий Джима решает (половину) проблему и отправляет вас.
Другая "половина" проблемы - что, если вы в конечном итоге хотите переименовать файл физической базы данных? Ответ доступен в этом сообщении CodeProject.
Шаги:
-
ALTER DATABASE
, чтобы установить новые физические имена файлов (файл данных и файл журнала)
Не будет действовать до тех пор, пока SQL Server не будет перезапущен или база данных не будет отключена и не будет возвращена в сеть
-
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', FILENAME = '<Full-Path-Required>\NewDbName.mdf');
-
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', FILENAME = '<Full-Path-Required>\NewDbName_log.ldf');
-
ALTER DATABASE
снова установить новые логические имена файлов (опять же, файлы данных и журналов)
Эффект немедленно
-
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', NEWNAME = 'NewDbName');
-
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', NEWNAME = 'NewDbName_log');
-
Выйти в автономный режим и вернуть его в Интернет или перезапустить SQL Server
- Использование SQL Server Management Studio:
- Щелкните правой кнопкой мыши переименованную базу данных и нажмите
Take Offline
в разделе Tasks
.
- Щелкните правой кнопкой мыши по базе данных (offline) и выберите
Bring Online
в разделе Tasks
.
- Использование T-SQL:
-
ALTER DATABASE [CurrentName] SET OFFLINE WITH ROLLBACK IMMEDIATE;
(устанавливает его в автономный режим и отключает любые клиенты)
-
ALTER DATABASE [CurrentName] SET ONLINE;
Полный код:
-- Find "CurrentName" (without quotes) and replace with the current database name
-- Find "NewDbName" (without quotes) and replace with the new database name
USE [CurrentName];
-- Change physical file names:
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', FILENAME = '<Full-Path-Required>\NewDbName.mdf');
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', FILENAME = '<Full-Path-Required>\NewDbName_log.ldf');
-- Change logical names:
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', NEWNAME = 'NewDbName');
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', NEWNAME = 'NewDbName_log');
-- Take offline and back online
USE [master]
GO
ALTER DATABASE [CurrentName] SET OFFLINE WITH ROLLBACK IMMEDIATE;
-- Then navigate to <Full-Path-Required> and rename the files
ALTER DATABASE [CurrentName] SET ONLINE;
Ответ 2
Если вы не помните предыдущие имена файлов, откройте файл .mdf в шестнадцатеричном редакторе и со смещением 0x19D вы увидите строку UTF-16 (2 байта/символ) этого имени файла.
Ответ 3
Мне пришлось переместить/переименовать DB несколько раз. Если вы находитесь в одной лодке, здесь script, который использует переменные, чтобы не печатать новые/старые имена снова и снова.
Он использует ту же логику из Jesse answer, за исключением автоматического запуска резервного копирования базы данных для вас. Я предполагаю, что вам нужно вернуть его обратно после перемещения/переименования физических файлов, следовательно, удаление этого утверждения. Прокомментируйте, если это предположение неверно.
Однако, чтобы отразить логическое переименование в SSMS, вам все равно нужно right click -> rename
. Это похоже на то же самое без использования метода EXECUTE
/REPLACE
ниже.
---------- CHANGE THESE ----------
-- Keep names identical to only move locations
DECLARE @CurrDbName AS varchar(255) = 'CurrentDbName'
DECLARE @NewDbName AS varchar(255) = 'NewDbName'
DECLARE @PathToFolder AS varchar(255) = '<FullPathMinusFilename>\'
---------- DECLARE TEMPLATES ----------
-- Use DB
DECLARE @USE_DB AS varchar(255) = 'USE [{CurrDbName}]'
-- Change physical file names
DECLARE @SET_PHYS_MDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}'', FILENAME = ''{PathToFolder}{NewDbName}.mdf'')'
DECLARE @SET_PHYS_LDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}_log'', FILENAME = ''{PathToFolder}{NewDbName}_log.ldf'')'
-- Change logical names (LOG = "logical", not "log")
If (@CurrDbName != @NewDbName)
BEGIN
DECLARE @SET_LOG_MDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}'', NEWNAME = ''{NewDbName}'')'
DECLARE @SET_LOG_LDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}_log'', NEWNAME = ''{NewDbName}_log'')'
END
-- Take offline
DECLARE @SET_OFFLINE AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] SET OFFLINE WITH ROLLBACK IMMEDIATE'
---------- START DOING STUFF ----------
DECLARE @SQL_SCRIPT AS varchar(255)
-- Use DB
SET @SQL_SCRIPT = REPLACE(@USE_DB, '{CurrDbName}', @CurrDbName)
EXECUTE (@SQL_SCRIPT)
-- Change physical file names
SET @SQL_SCRIPT = REPLACE(REPLACE(REPLACE(@SET_PHYS_MDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName), '{PathToFolder}', @PathToFolder)
EXECUTE (@SQL_SCRIPT)
SET @SQL_SCRIPT = REPLACE(REPLACE(REPLACE(@SET_PHYS_LDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName), '{PathToFolder}', @PathToFolder)
EXECUTE (@SQL_SCRIPT)
-- Change logical names (LOG = "logical", not "log")
If (@CurrDbName != @NewDbName)
BEGIN
SET @SQL_SCRIPT = REPLACE(REPLACE(@SET_LOG_MDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName)
EXECUTE (@SQL_SCRIPT)
SET @SQL_SCRIPT = REPLACE(REPLACE(@SET_LOG_LDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName)
EXECUTE (@SQL_SCRIPT)
END
-- Take offline
USE [master]
SET @SQL_SCRIPT = REPLACE(@SET_OFFLINE, '{CurrDbName}', @CurrDbName)
EXECUTE (@SQL_SCRIPT)
-- Now turn off the database, rename/move physical files, and bring the database back online
Это мой первый ответ, извините, если он не имеет достаточного качества.
Ответ 4
Ни один из этих ответов не был быстрым для ответов на вопросы, поэтому я подумал, что просто добавлю свой ответ, чтобы указать на мои выводы (основываясь на всех вкладах здесь)...
Ситуация:
У вас есть файл базы данных и файл журнала, но не резервная копия. Вы пытаетесь НАПРАВИТЬ базу данных (более чем вероятно, чтобы восстановить систему с сервера, который спустился).
Проблема:
Вы изменили имя файлов MDF и LDF на нечто иное, чем они были изначально. Вам нужно переименовать их обратно в исходные имена, затем попробуйте ATTACH.
Как переименовать файлы базы данных (простой способ):
- После того, как вы успешно выполнили файлы MDF и LDF,
хотите сделать файл BAK (резервный), создав резервную копию базы данных.
- Далее вы хотите удалить/удалить базу данных с SQL-сервера.
- Далее вы хотите ВОССТАНОВИТЬ базу данных. Здесь вы можете войти в
FILES (слева), который позволит вам изменить
Restore As
имя файла для того, что вы хотите назвать файлами MDF и LDF.
- Затем я продолжил бы делать резервную копию этой новой базы данных ANOTHER
снова, чтобы на этот раз резервная копия содержала правильные имена файлов
вы хотите.
Ответ 5
Командная строка оказалась гораздо более щадящей с переименованными файлами. Обратите внимание, что это не сценарий "запускай и забывай"... запускайте каждую часть отдельно, обращая внимание на имена, которые необходимо изменить:
--#1 Attach the db
USE [master]
GO
CREATE DATABASE RenamedDB ON
( FILENAME = N'<PathToRenamedFile>\renamedDBFile.mdf' ),
( FILENAME = N'<PathToRenamedFile>\renamedDBFile_log.ldf' )
FOR ATTACH
GO
--#2 Get the old logical file names:
USE RenamedDB
select * from sys.database_files
--#3 Rename the old logical files
ALTER DATABASE RenamedDB MODIFY FILE (NAME=N'OldLogicalDBName', NEWNAME=N'renamedDBFile')
GO
ALTER DATABASE RenamedDB MODIFY FILE (NAME=N'OldLogicalLogName', NEWNAME=N'renamedDBFile_log')
GO
--#4 check for the new names
select * from sys.database_files