Попытка подключить файл 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