SQL Server LocalDB: после отсоединения и повторного подключения базы данных к тому же компьютеру (компьютер, тот же путь) невозможно выполнить резервное копирование базы данных

Моя среда разработки — C#, SQL Server 2014 LocalDB, SQL Server 2012 Express, Windows 10, Visual Studio 2015.

Когда пользователям моего приложения нужно переместить свой файл localDB (.mdf) в другое место, на другой компьютер (сервер LocalDB), отсоединиться от компьютера A и подключиться к компьютеру B, а затем мы можем успешно запустить команду базы данных BACKUP.

Однако в случае, если пользователи по ошибке отсоединились или пользователи передумали постоянно использовать компьютер A, мое приложение должно иметь возможность повторно подключить отсоединенный файл базы данных LocalDB (.mdf) к тому же компьютеру (тот же сервер LocalDB).

Когда я запускаю команду BACKUP DATABASE после того, как мое приложение успешно повторно подключило файл базы данных к тому же компьютеру, сообщение об ошибке отображается как

Невозможно открыть физический файл. Процесс не может получить доступ к файлу базы данных, поскольку файл базы данных используется другим процессом.

BACKUP DATABASE аварийно завершена

Итак, я вошел в Microsoft Server Management Studio и вижу 2 файла базы данных с определенным именем, поскольку первый - greendb.mdf (только имя), второй - c:\users\kay\appdata\greendb.mdf (с полным путем).

Я думаю, что c:\users\kay\appdata\greendb.mdf (с полным путем) создается при отключении базы данных. И когда я щелкаю по нему с помощью сопоставления безопасности-логин-кай-пользователь, в отличие от других баз данных, отображающих свои разрешения внутри, отсоединенная база данных с полным путем не показывает свои разрешения и показывает сообщение об ошибке, например,

Невозможно преобразовать объект System.DBNull в System.String (Microsoft.SqlServer.Smo)

Кажется, Microsoft LocalDB Server по-прежнему распознает отсоединенную базу данных с полным путем и путается с недавно присоединенной базой данных (только имя без полного пути).

Любые отличные идеи будут высоко оценены!

Большое спасибо !


person Kay Lee    schedule 24.04.2016    source источник
comment
Сегодня я обнаружил, что если я отсоединяю локальную базу данных и постоянно подключаюсь в одном и том же окне (для входа в систему) WPF, резервное копирование базы данных в следующем окне (главное окно моего приложения) выполняется успешно. Однако я предполагаю, что если я закрою окно или закрою (выйду) приложение после отсоединения базы данных localdb, кажется, что сервер localdb создаст призрак (не официальный) localdb с полным именем пути, чтобы выполнить некоторые назначенные дополнительные задания с призраком (не официальным ) файл localdb, потому что на сервере официально нет файла localdb.   -  person Kay Lee    schedule 25.04.2016
comment
Я проверил сейчас и подтверждаю на 100%, что если я постоянно отсоединяюсь и присоединяюсь в одном и том же окне WPF, локальная база данных-призрак не создается, и я вижу, что команда резервного копирования базы данных успешно выполнена. Нужно ли нам выполнять какую-то дополнительную работу, чтобы полностью очистить имя на сервере localdb? Есть ли какая-то важная опция (параметр), необходимая в команде отключения и создания базы данных для подключения?   -  person Kay Lee    schedule 25.04.2016


Ответы (2)


При отсоединении localDB

мы должны сначала запустить команду ALTER DATABASE ROLLBACK IMMEDIATE, чтобы завершить все незавершенные транзакции.

Просто чтобы объяснить, прежде чем мы закроем ресторан, мы должны объявить посетителям в ресторане: «Этот ресторан будет закрыт очень скоро, пожалуйста, закончите есть и выходите на улицу до закрытия ресторана».

Если вам необходимо повторно подключить локальную базу данных к тому же компьютеру (тот же сервер локальной базы данных),

Некоторых подобных действий следует избегать, чтобы предотвратить призрак (ошибку?).

1) Попробуйте открыть локальную БД в коде программно

2) Кажется, что подсчет имени отдельной локальной базы данных также напоминает о существовании локальной базы данных на сервере локальной базы данных (команда SELECT COUNT dbname в основной базе данных)

Странная вещь, которая должна быть исправлена ​​как ошибка,

если мы отсоединяем локальную БД от основной БД, я думаю, что она не сможет программно открыть отсоединенную локальную БД в коде. Однако такой код, как SqlConnection.Open(); запускается и проходит без каких-либо исключений (ошибок), и сразу же создается призрак полного пути.

Кажется, что имя отсоединенной локальной БД удалено из основной БД, но сервер подключает отсоединенную локальную БД через физический путь в предоставленной строке подключения.

И чтобы решить, нужна ли какая-то локальная БД для подключения или для проверки ее отсоединения, я разработал для этого собственное решение (простой код).

Надеюсь, мой опыт поможет кому-то еще.

person Kay Lee    schedule 01.05.2016

Ну, я много работал, используя операции присоединения и отсоединения, и, наконец, понял, что лучшая практика для нас, разработчиков, — это работа со скриптами.

Итак, если вы хотите (отсоединить) свою базу данных, чтобы снова (присоединить) либо с новым именем, либо с тем же именем. Я предлагаю вам сгенерировать сценарии для вашей базы данных и снова написать сценарий.

если вы запустите скрипт напрямую, вы получите сообщение об ошибке, потому что вам нужно удалить старые данные (старые/новые имеют одно и то же имя), а скрипт по умолчанию использует имя базы данных, которое написано в первой строке, конечно, вы можете удалить эту строку и используйте новую базу данных, которую вы хотите использовать.

  • для базы данных сценариев, включая данные, обязательно установите предпочтение в мастере (Дополнительные настройки => только схема / только данные / схема и данные.) выберите схему и данные

По умолчанию выбрана только схема. выберите место назначения для вашего файла sql после запуска сценария и удаления старых данных. ваш процесс резервного копирования должен пройти без проблем.

person aelagawy    schedule 24.04.2016
comment
о .. большое спасибо за ваш ответ. Я пытаюсь найти с вашими благодарными ключевыми словами, но пока немного трудно найти. Я не могу использовать Wizard, но должен сделать это программно со стороны пользователей. Как я могу удалить старые данные и первую строку, включая имя базы данных? И как я могу установить предпочтения как Schema и Data? В Интернете, похоже, нет информации об этом. Не могли бы вы поделиться своим ценным опытом и знаниями с помощью простого примера кода? Я так упорно бьюсь с этой проблемой уже почти 1 месяц. Большое спасибо ! - person Kay Lee; 24.04.2016