Como anexar um banco de dados no SQL Server?

32

Algumas perguntas comuns relacionadas à conexão de bancos de dados no SQL Server:

  • O que significa anexar ou desanexar um banco de dados?
  • Como desanexar um banco de dados?
  • Como anexar um banco de dados?
    • O que significa anexar e reconstruir o log?
  • Como faço isso no SQL Server Express?
  • Quando posso considerar desanexar e anexar?
  • Existem riscos ou avisos?
  • E quanto à conexão entre versões e edições do SQL Server? (Padrão para empresa? 2000 a 2008? 2012 a 2008?)
Mike Walsh
fonte

Respostas:

33

O que é desanexar ou anexar e como eles funcionam?

Vamos começar com o desapego. Ao desanexar um banco de dados no SQL Server, você o coloca offline e o remove da instância do SQL Server da qual está desanexado. Os dados e os arquivos de log dos bancos de dados permanecem intactos e são mantidos em um estado consistente para que você possa anexar o banco de dados posteriormente ou a outra instância do SQL Server. Anexar conecta os dados e arquivos de log de um banco de dados que foi desanexado adequadamente (ou que foram copiados de uma instância do SQL Server encerrada de maneira limpa) a uma instância do SQL Server e coloca o banco de dados online.

Como desanexar um banco de dados?

Você pode fazer isso no T-SQL ou na GUI do SQL Server Management Studio.

Na GUI, clique com o botão direito do mouse no banco de dados que deseja desanexar, selecione All Taskse clique em Detach. A partir daí, você verá a caixa de diálogo de desanexação. Você pode optar por descartar as conexões primeiro para desconectar à força todas as conexões ativas e o trabalho de reversão que estavam no meio da execução. Você também pode optar por atualizar as estatísticas antes da desanexação. Desanexando - Escolha Desanexar ...

No 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

Para o procedimento armazenado do sistema sp_detach_db, existem dois paramaters que você pode transmitir opcionalmente:

  • @skipchecks- entrada aceitável é 'True'ou 'False'se 'True', o SQL Server atualizará as estatísticas antes da desanexação. Se ' False', não vai. Se você não especificar nada aqui, as estatísticas serão atualizadas no SQL Server 2005 ou posterior.
    • @keepfulltextindexfile- O padrão aqui é 'True'- se estiver definido como true, os metadados do índice de texto completo não serão descartados durante a desanexação.

Para ver muito mais sobre separação e mais alguns detalhes sobre os riscos destaco a seguir, o artigo Books Online para sp_detach_dbé um bom lugar para começar.

Como anexar um banco de dados?

Você também pode fazer isso no T-SQL ou na GUI do SQL Server Management Studio.

( OBSERVAÇÃO: Se você tiver os arquivos de dados e log de um banco de dados que não foi desanexado corretamente, sua conexão poderá não funcionar. Quando ocorre a desanexação, o banco de dados é colocado offline e os arquivos de log e dados são colocados em um estado consistente. acontece quando um serviço é desligado corretamente. )

Na GUI, clique com o botão direito do mouse na Databasespasta de nível superior da sua instância e selecione Attach. Na próxima caixa de diálogo, você selecionaria o arquivo de dados primário (.MDF) do banco de dados que deseja anexar e garantirá que os outros arquivos estejam selecionados e seus locais apropriados especificados e clique em OK, anexando seu banco de dados.

No T-SQL, a melhor maneira de fazer isso no SQL Server 2005 e encaminhar é através do CREATE DATABASEcomando Esse é o método suportado além do SQL Server 2012. Se você quiser ver como usar sp_attach_db, poderá ver isso nos artigos on-line dos livros para [sp_attach_db][3]ou[sp_attach_single_file_db][4]

Quando você tem seu arquivo de log e arquivos de dados disponíveis e eles são consistentes, esta é a abordagem T-SQL:

- Usando Create Database e a cláusula FOR ATTACH para anexar

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 

Você pode ver mais sobre a instrução Criar banco de dados nos livros online também.

Como desanexar / anexar no SQL Server Express?

É realmente o mesmo. Se você estiver usando o SQL Server Management Studio Express, poderá usar a caixa de diálogo desanexar / anexar na GUI descrita acima ou as etapas T-SQL através do SSMS Express descritas acima também. Não há diferença com o Express lá.

Se você não possui o SSMS Express, pode fazer o download ( Aqui está a versão do SQL Server 2012 Express).

Você pode entrar em uma SQLCMDsessão e usar as mesmas construções T-SQL descritas acima.

Quando devo considerar remover ou anexar?

Primeiro, uma palavra sobre para que desanexar e anexar não deve ser usada: Backup e recuperação Desanexar e anexar não é uma maneira de fazer backup do seu banco de dados para fins de recuperação de rotina. Não há backups de log de transações dessa maneira, ele coloca seu banco de dados em um estado em que os arquivos do banco de dados podem ser excluídos acidentalmente e não é um bom caminho para esse fim.

Dito isto, desanexar e anexar são bons para alguns casos de uso (não exaustivos, fique à vontade para editar para adicionar ou criar uma nova resposta com mais):

  • Às vezes para migrações (embora eu prefira backup / restauração para aqueles como discutido na minha resposta aqui )
  • Quando você deseja remover um banco de dados que não é mais usado ativamente, mas tem a capacidade de se conectar posteriormente, conforme necessário.
  • Em certas situações de solução de problemas, isso pode ser chamado
  • Não tem espaço para fazer backup ou restaurar arquivos de dados e de log em outro ambiente (você nunca deveria estar aqui, mas eu usei-o para mover bancos de dados de desenvolvimento pelos ambientes às vezes. Não queria nem precisava o log fez uma anexação / reconstrução do arquivo de log)

Riscos e avisos

Novamente, os livros on-line são um bom recurso aqui , mas mencionarei algumas considerações específicas a serem lembradas ao desanexar ou anexar um banco de dados -

Destacar

  • Você está colocando seu banco de dados offline. Não será mais acessível. Isso deve ser óbvio, mas vale a pena chamar. É por isso que não é uma ótima opção de backup.
  • Quando seu banco de dados está online, o SQL Server bloqueia os arquivos. Eu não recomendaria tentar isso para me provar errado, porque pode haver alguma outra situação em jogo, mas normalmente você não pode excluir um arquivo de banco de dados (dados, dados secundários ou arquivo de log) enquanto o SQL Server estiver online. Isto é uma coisa boa. Quando você se desconecta, você não tem essa proteção - isso pode ser uma coisa ruim.
  • Se você estiver lidando com corrupção de banco de dados e encontrar algum artigo em algum lugar que tenha o primeiro passo de Desanexar - está errado - se você desanexar um banco de dados corrompido, pode ser que seja. Você pode não estar anexando esse banco de dados novamente.
  • Cortar e colar seus arquivos de banco de dados de produção em toda a sua rede é uma maneira de introduzir potencialmente corrupção no nível de arquivo. Outro motivo para eu preferir backup / restauração ao fazer migrações.
  • Isso pode causar falha no plano de manutenção. A situação é que você, como eu, configurou um plano de manutenção para realizar backups regulares de todos os bancos de dados sem verificar as melhores práticas. Isso funciona bem, então você para de pensar nisso. Outra pessoa decide usar um banco de dados que não está usando offline. O plano de manutenção falhará a partir desse ponto até você modificar o plano de manutenção, marcando a opção "ignorar bancos de dados cujo estado não está on-line" na caixa de diálogo "Banco de dados (s)". Observe que ele não falhará apenas no banco de dados offline - o plano de manutenção falhará com um erro no momento em que ele tentar fazer backup do banco de dados offline, para que alguns bancos de dados on-line possam não ter backup. (autor diferente para este ponto, então trate com desconfiança)

Anexar - Assim como você não deve executar scripts da Internet ou aceitar pacotes de estranhos no aeroporto, você não deve anexar um banco de dados adquirido de outra pessoa sem algumas etapas para verificá-lo. Esse banco de dados pode ter um código dentro dele em gatilhos, procedimentos armazenados etc. que possam comprometer o seu ambiente. Você deve revisar um banco de dados que deseja anexar em um ambiente seguro e com firewall, não no seu sistema de produção.

E as diferentes versões ou edições do SQL Server?

Elas não são diferentes das regras para restaurar bancos de dados entre versões. Geralmente, você pode restaurar a versão seguinte para três versões (o SQL Server 2008 para o SQL Server 2012, por exemplo, funcionará. O SQL Server 2000 para o SQL Server 2012 não). Você não pode voltar atrás de maneira alguma por meio de backup / restauração ou desanexação / anexação - seria necessário criar objetos e criar scripts das inserções e fazê-lo manualmente ou com uma ferramenta que faça isso. Para edições, geralmente é possível alternar entre os principais SKUs do SQL Server - por exemplo, você pode mover um banco de dados do Standard para o Enterprise sem trabalho extra. Se você estiver usando recursos da empresa (digamos, compactação ou particionamento), precisará desativar esses recursos antes de fazer a mudança. Você pode ter uma idéia dos recursos que você

Mike Walsh
fonte
@ Mike - há algum impacto no desempenho ao desanexar e anexar bancos de dados regularmente? Imagino que o cache do buffer seja invalidado para qualquer banco de dados desanexado (claramente), mas você tem conhecimento de outros impactos?
Max Vernon
Eu tenho um banco de dados no qual, quando eu paro a instância do SQL Server e copio os 3 arquivos e os anexo em outra instância, o banco de dados entra em Recuperação (aconteceu comigo duas vezes no mesmo banco de dados). Pela sua descrição, isso não deve acontecer, então o que devo suspeitar sobre meu banco de dados? Está corrompido de alguma maneira? Os backups levam séculos para criar e restaurar, e esse recurso salva a vida! Pelo menos para fins de compartilhamento de banco de dados do desenvolvedor ...
NoOne 10/10