Как мне прикрепить базу данных в SQL Server?


32

Некоторые общие вопросы, связанные с подключением баз данных в SQL Server:

  • Что значит присоединить или отсоединить базу данных?
  • Как мне отсоединить базу данных?
  • Как мне прикрепить базу данных?
    • Что значит прикрепить и восстановить журнал?
  • Как мне сделать это в SQL Server Express?
  • Когда я мог бы рассмотреть возможность отделения и присоединения?
  • Есть ли какие-либо риски или предупреждения?
  • Как насчет подключения между версиями и выпусками SQL Server? (Стандарт для предприятия? 2000 до 2008? 2012 до 2008?)

Ответы:


33

Что такое отделение или присоединение и как они работают?

Начнем с отсоединения. Когда вы отключаете базу данных в SQL Server, вы переводите базу данных в автономный режим и удаляете ее из экземпляра SQL Server, от которого вы ее отключаете. Данные базы данных и файлы журналов остаются в рабочем состоянии и остаются в согласованном состоянии, поэтому вы можете присоединить базу данных на более позднем этапе или к другому экземпляру SQL Server. Attach соединяет данные и файлы журналов из базы данных, которая была должным образом отсоединена (или была скопирована с полностью закрытого экземпляра SQL Server), с экземпляром SQL Server и переводит базу данных в оперативный режим.

Как мне отсоединить базу данных?

Вы можете сделать это в T-SQL или из графического интерфейса SQL Server Management Studio.

В графическом интерфейсе вы щелкаете правой кнопкой мыши по базе данных, которую хотите отключить, выбираете All Tasksи нажимаете наDetach . Оттуда вы получите диалог отсоединения. Вы можете сначала отбросить подключения, чтобы принудительно отключить все активные подключения и выполнить откат, который они выполняли в середине выполнения. Вы также можете обновить статистику перед отключением. Отсоединение через - Выберите Отсоединить ...

В T-SQL:

-- You don't want to be in the database you are trying to detach
USE Master
GO

-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO

Для системной хранимой процедуры sp_detach_db есть два параметра, которые вы можете передать по желанию:

  • @skipchecks- допустимый ввод 'True'или 'False'если 'True'SQL Server обновит статистику перед отсоединением. Если ' False', это не так. Если вы ничего не укажете, статистика будет обновлена ​​в SQL Server 2005 или более поздней версии.
    • @keepfulltextindexfile- Значение по умолчанию здесь 'True'- если для этого параметра установлено значение true, метаданные полнотекстового индекса не будут отбрасываться во время отсоединения.

Для того, чтобы увидеть намного больше о отсоединиться и некоторой более подробной информации о рисках , я выделяю ниже, статья Книги Интернет для sp_detach_dbхорошего место , чтобы начать.

Как мне присоединить базу данных?

Вы также можете сделать это в T-SQL или из графического интерфейса SQL Server Management Studio.

( ПРИМЕЧАНИЕ. Если у вас есть данные и файлы журналов из базы данных, которая была отсоединена неправильно, ваше присоединение может не работать. Когда происходит отсоединение, база данных переводится в автономный режим, а файлы журнала и данных переводятся в согласованное состояние. Это также происходит, когда служба полностью закрыта. )

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

В T-SQL лучший способ сделать это в SQL Server 2005 и более поздних версиях - использовать CREATE DATABASEкоманду. Это метод, который поддерживается после SQL Server 2012. Если вы хотите узнать, как использовать sp_attach_db, вы можете увидеть это в книгах онлайн статей для [sp_attach_db][3]или[sp_attach_single_file_db][4]

Когда у вас есть доступный файл журнала и файлы данных, и они согласованы, это подход T-SQL:

- Использование Create Database и предложения FOR ATTACH для присоединения

CREATE DATABASE DatabaseName 
    ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
    (FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
     (FILENAME = 'FilePath\SecondaryDataFile.ndf)  -- Optional - any secondary data files
    FOR ATTACH 
GO 

Вы можете увидеть больше об утверждении « Создание базы данных» в книгах онлайн.

Как мне отсоединить / присоединить в SQL Server Express?

Это на самом деле то же самое. Если вы используете SQL Server Management Studio Express, вы можете использовать диалоговое окно отсоединения / подключения в графическом интерфейсе, описанном выше, или шаги T-SQL через SSMS Express, описанные выше. Никакой разницы с Экспрессом нет.

Если у вас нет SSMS Express, вы можете скачать его ( вот версия SQL Server 2012 Express).

Вы можете войти в SQLCMDсеанс и использовать те же конструкции T-SQL, которые описаны выше.

Когда я должен рассмотреть возможность отсоединения или присоединения?

Сначала слово о том, что отсоединение и присоединение не предназначены для использования: резервное копирование и восстановление. Отсоединение и присоединение не являются способом резервного копирования базы данных для целей обычного восстановления. Таким образом, нет никаких резервных копий журнала транзакций, это переводит вашу базу данных в состояние, когда файлы базы данных могут быть случайно удалены, и это совсем не подходит для этой цели.

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

  • Иногда для миграций (хотя я предпочитаю резервное копирование / восстановление для тех, которые обсуждались в моем ответе здесь )
  • Когда вы хотите удалить базу данных, которая больше не используется активно, но имеет возможность присоединиться позже, если это необходимо.
  • В определенных ситуациях устранения неполадок, это может быть вызвано
  • У меня нет места для резервного копирования или восстановления данных и файлов журналов в другой среде (вас никогда не должно было быть здесь, но я использовал его, чтобы время от времени перемещать базы данных разработчиков по средам. Не хотел или не нуждался журнал так же сделал присоединение / перестроение файла журнала)

Риски и предупреждения

Опять же, книги в Интернете являются хорошим ресурсом , но я приведу некоторые конкретные соображения, которые следует учитывать при отключении или подключении базы данных -

Отделить

  • Вы переводите свою базу данных в автономный режим. Это больше не будет доступно. Это должно быть очевидно, но стоит взывать. Вот почему это не отличный вариант резервного копирования.
  • Когда ваша база данных подключена, SQL Server блокирует файлы. Я не рекомендовал бы попробовать это, чтобы доказать, что я не прав, потому что может возникнуть какая-то другая ситуация, но обычно вы не можете удалить файл базы данных (данные, дополнительные данные или файл журнала), когда SQL Server подключен к сети. Это хорошая вещь. Когда вы отстраняетесь, у вас нет такой защиты - это может быть плохо.
  • Если вы имеете дело с повреждением базы данных и нашли какую-то статью, в которой есть первый шаг отсоединения - это неправильно - если вы отсоедините поврежденную базу данных, это может быть так. Возможно, вы больше не присоединяете эту базу данных.
  • Обрезка и вставка файлов рабочей базы данных по всей сети - это способ потенциально повредить уровень файлов. Еще одна причина, по которой я предпочитаю резервное копирование / восстановление при выполнении миграции.
  • Это может привести к сбою плана обслуживания. Ситуация такова, что вы, как и я, создали план обслуживания для регулярного резервного копирования всех баз данных без проверки передового опыта. Это прекрасно работает, так что вы перестанете думать об этом. Кто-то еще тогда решает взять базу данных, которую они не используют в автономном режиме. План обслуживания не будет выполняться с этого момента, пока вы не измените план обслуживания, установив флажок «игнорировать базы данных, состояние которых не подключено» в диалоговом окне «База данных (ий)». Обратите внимание, что для автономной базы данных не произойдет сбой - план обслуживания потерпит неудачу с ошибкой в ​​тот момент, когда он попытается выполнить резервное копирование автономной базы данных, поэтому некоторые онлайн-базы данных могут быть не скопированы. (другой автор по этому вопросу, так что относитесь с подозрением)

Присоединение - точно так же, как вы не должны запускать сценарии из Интернета или принимать посылки от незнакомцев в аэропорту, вы не должны прикреплять базу данных, полученную от кого-то другого, без каких-либо шагов для ее проверки. Эта база данных может содержать код внутри триггеров, хранимых процедур и т. Д., Которые могут поставить под угрозу вашу среду. Вам следует просмотреть базу данных, которую вы хотите подключить, в безопасной и защищенной от огня среде, а не в производственной системе.

А как насчет различных версий или выпусков SQL Server?

Они ничем не отличаются от правил восстановления баз данных между версиями. Как правило, вы можете восстановить до следующей версии для 3-х версий (например, с SQL Server 2008 до SQL Server 2012 будет работать. От SQL Server 2000 до SQL Server 2012 не будет). Вы не можете вернуться назад вообще с помощью резервного копирования / восстановления или отсоединения / присоединения - вам придется создавать сценарии объектов и сценариев вставок и делать это вручную или с помощью инструмента, который делает это. Для выпусков вы обычно можете перемещаться между основными SKU SQL Server - например, вы можете перемещать базу данных из Standard в Enterprise без дополнительной работы. Если вы используете корпоративные функции (скажем, сжатие или разбиение), вам, тем не менее, необходимо отключить эти функции перед тем, как приступить к работе. Вы можете получить представление о функциях, которые вы


@ Майк - есть ли какие-либо последствия для производительности от регулярного отключения и подключения баз данных? Я предполагаю, что буферный кеш недействителен для любой базы данных, которая отсоединена (ясно), но знаете ли вы о каких-либо других воздействиях?
Макс Вернон

У меня есть БД, на которой, когда я останавливаю экземпляр SQL Server и копирую 3 файла, а затем присоединяю их к другому экземпляру, БД переходит в Recovery (это случилось со мной дважды на одной БД). Из вашего описания этого не должно произойти, так что я должен подозревать о моей БД? Это как-то повреждено? Создание и восстановление резервных копий занимает много времени, и эта функция спасает жизнь! По крайней мере, для целей совместного использования БД для разработчиков ...
NoOne
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.