Comment attacher une base de données dans SQL Server?

32

Quelques questions courantes relatives à la liaison de bases de données dans SQL Server:

  • Que signifie attacher ou détacher une base de données?
  • Comment détacher une base de données?
  • Comment joindre une base de données?
    • Qu'est-ce que cela signifie d'attacher et de reconstruire le journal?
  • Comment le faire dans SQL Server Express?
  • Quand pourrais-je envisager de détacher et d'attacher?
  • Y a-t-il des risques ou des avertissements?
  • Qu'en est-il de la liaison entre les versions et les éditions de SQL Server? (Standard to Enterprise? 2000 à 2008? 2012 à 2008?)
Mike Walsh
la source

Réponses:

33

Qu'est-ce que détacher ou attacher et comment fonctionnent-ils?

Nous allons commencer par détacher. Lorsque vous détachez une base de données dans SQL Server, vous la déconnectez de l'instance SQL Server à partir de laquelle vous la détachez. Les données de la base de données et les fichiers journaux restent intacts et restent dans un état cohérent afin que vous puissiez ensuite attacher la base de données ultérieurement ou à une autre instance SQL Server. Attach connecte les données et les fichiers journaux d'une base de données correctement séparée (ou copiée à partir d'une instance de SQL Server complètement arrêtée) à une instance de SQL Server et met la base de données en ligne.

Comment détacher une base de données?

Vous pouvez le faire dans T-SQL ou à partir de l'interface graphique de SQL Server Management Studio.

Dans l'interface graphique, faites un clic droit sur la base de données que vous souhaitez détacher, sélectionnez-le All Taskset cliquez dessus Detach. De là, vous obtiendrez le dialogue de détachement. Vous pouvez choisir de supprimer d'abord les connexions pour déconnecter de force toutes les connexions actives et annuler le travail qu'elles étaient en train d'exécuter. Vous pouvez également choisir de mettre à jour les statistiques avant le détachement. Détachement: choisissez Détacher ...

Dans 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

Pour la procédure stockée système sp_detach_db, vous pouvez éventuellement transmettre deux paramètres:

  • @skipchecks- entrée acceptable est 'True'ou 'False'si 'True', SQL Server mettra à jour les statistiques avant de détacher. Si ' False', ça ne va pas. Si vous ne spécifiez rien ici, les statistiques seront mises à jour dans SQL Server 2005 ou version ultérieure.
    • @keepfulltextindexfile- La valeur par défaut ici est 'True'- si cette propriété est définie sur true, les métadonnées de l'index de texte intégral ne seront pas supprimées lors du détachement.

Pour en savoir plus sur le détachement et certains détails sur les risques que je souligne ci-dessous, l' article de la documentation en lignesp_detach_db est un bon point de départ.

Comment attacher une base de données?

Vous pouvez également le faire dans T-SQL ou à partir de l'interface graphique de SQL Server Management Studio.

( REMARQUE: Si vous avez les fichiers de données et les journaux d'une base de données qui n'a pas été correctement détachés, votre pièce jointe risque de ne pas fonctionner. Lorsque la déconnexion se produit, la base de données est mise en mode hors connexion et les fichiers de journal et de données sont mis dans un état cohérent. se produit quand un service est proprement arrêté. )

Dans l'interface graphique, faites un clic droit sur le Databasesdossier de niveau supérieur de votre instance et sélectionnez Attach. Dans la boîte de dialogue suivante, sélectionnez ensuite le fichier de données principal (.MDF) de la base de données que vous souhaitez attacher, assurez-vous que les autres fichiers sont sélectionnés et que leurs emplacements appropriés sont spécifiés, puis cliquez sur OK pour attacher votre base de données.

Dans T-SQL, le meilleur moyen de procéder dans SQL Server 2005 et le suivant est d'utiliser la CREATE DATABASEcommande. Ceci est la méthode qui est pris en charge au - delà de SQL Server 2012. Si vous voulez voir comment utiliser sp_attach_db, vous pouvez voir que dans les livres d' articles en ligne pour [sp_attach_db][3]ou[sp_attach_single_file_db][4]

Lorsque votre fichier journal et vos fichiers de données sont disponibles et qu’ils sont cohérents, voici l’approche T-SQL:

- Utilisation de Create Database et de la clause FOR ATTACH pour attacher

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 

Vous pouvez en savoir plus sur l' instruction Créer une base de données dans les livres en ligne.

Comment détacher / attacher dans SQL Server Express?

C'est en fait la même chose. Si vous utilisez SQL Server Management Studio Express, vous pouvez également utiliser la boîte de dialogue Détacher / attacher dans l'interface graphique décrite ci-dessus ou les étapes T-SQL via SSMS Express décrites ci-dessus. Aucune différence avec Express là-bas.

Si vous n'avez pas SSMS Express, vous pouvez le télécharger ( voici la version de SQL Server 2012 Express).

Vous pouvez entrer dans une SQLCMDsession et utiliser les mêmes constructions T-SQL décrites ci-dessus.

Quand devrais-je envisager de faire un détachement ou une attache?

Tout d'abord, un mot sur ce que détacher et attacher n'est pas destiné à être utilisé: Sauvegarde et récupération Détacher et attacher n'est pas un moyen de sauvegarder votre base de données à des fins de récupération de routine. Il n'y a pas de sauvegarde du journal des transactions de cette manière, cela met votre base de données dans un état où les fichiers de la base de données peuvent être supprimés par inadvertance et ce n'est pas du tout un bon moyen pour cela.

Cela dit, détacher et attacher conviennent à quelques cas d'utilisation (non exhaustif, n'hésitez pas à le modifier pour ajouter ou créer une nouvelle réponse avec davantage):

  • Parfois pour les migrations (bien que je préfère la sauvegarde / restauration pour celles décrites dans ma réponse ici )
  • Lorsque vous souhaitez supprimer une base de données qui n'est plus utilisée activement mais que vous pouvez attacher ultérieurement, si nécessaire.
  • Dans certaines situations de dépannage, cela peut être demandé
  • Vous n'avez pas assez d'espace pour sauvegarder ou restaurer à la fois des fichiers de données et des fichiers journaux dans un autre environnement (vous ne devriez jamais être ici, mais je l'ai déjà utilisé pour déplacer des bases de données dev dans des environnements de temps en temps, etc.). le journal a donc fait une pièce jointe / reconstruction du fichier journal)

Risques et avertissements

Encore une fois, les livres en ligne sont une bonne ressource ici , mais je citerai quelques considérations spécifiques à prendre en compte lorsque vous détachez ou attachez une base de données -

Détacher

  • Vous prenez votre base de données hors ligne. Ce ne sera plus accessible. Cela devrait être évident, mais mérite d'être appelé. C'est pourquoi ce n'est pas une excellente option de sauvegarde.
  • Lorsque votre base de données est en ligne, SQL Server verrouille les fichiers. Je ne recommanderais pas d'essayer ceci pour prouver que je me trompe, car il pourrait y avoir une autre situation en jeu, mais vous ne pouvez généralement pas supprimer un fichier de base de données (données, données secondaires ou fichier journal) lorsque SQL Server est en ligne. C'est une bonne chose. Lorsque vous vous détachez, vous ne bénéficiez pas de cette protection. Cela peut être une mauvaise chose.
  • Si vous traitez avec une base de données corrompue et que vous trouvez un article dont la première étape est Detach - c'est faux - si vous détachez une base de données corrompue, c'est peut-être ça. Vous ne pouvez peut-être plus attacher cette base de données.
  • Couper et coller les fichiers de votre base de données de production sur votre réseau est un moyen d’introduire potentiellement une corruption au niveau fichier. Une autre raison pour laquelle je préfère la sauvegarde / restauration lors de migrations.
  • Cela pourrait entraîner l'échec d'un plan de maintenance. La situation est que vous avez, comme je l’ai fait, mis en place un plan de maintenance permettant d’effectuer des sauvegardes régulières de toutes les bases de données sans vérifier les meilleures pratiques. Cela fonctionne bien, alors vous arrêtez d'y penser. Quelqu'un d'autre décide alors de prendre une base de données qu'ils n'utilisent pas hors ligne. Le plan de maintenance échouera à partir de ce moment-là jusqu'à ce que vous le modifiiez en cochant l'option "Ignorer les bases de données dont l'état n'est pas en ligne" dans la boîte de dialogue "Base (s)". Notez que la base de données hors connexion n'échouera pas uniquement. Le plan de maintenance échouera avec une erreur au moment où il tentera de sauvegarder la base de données hors connexion, de sorte que certaines bases de données en ligne risquent de ne pas être sauvegardées. (auteur différent pour ce point alors traitez avec suspicion)

Joindre - Tout comme vous ne devriez pas exécuter de scripts à partir d'Internet ni accepter de colis envoyés par des étrangers à l'aéroport, vous ne devriez pas joindre une base de données que vous avez obtenue de quelqu'un d'autre sans vérification préalable. Cette base de données pourrait contenir du code dans les déclencheurs, les procédures stockées, etc., qui pourrait compromettre votre environnement. Vous devez examiner la base de données que vous souhaitez attacher dans un environnement sécurisé et protégé par un pare-feu, et non votre système de production.

Qu'en est-il des différentes versions ou éditions de SQL Server?

Celles-ci ne diffèrent pas des règles relatives à la restauration des bases de données entre les versions. Vous pouvez généralement restaurer jusqu'à la prochaine version pour 3 versions (SQL Server 2008 à SQL Server 2012, par exemple, fonctionnera. SQL Server 2000 à SQL Server 2012 ne fonctionnera pas). Vous ne pouvez absolument pas revenir en arrière via la sauvegarde / la restauration ou le détachement / l'attachement. Vous devez créer un script pour les objets, créer un script pour les insertions et le faire manuellement ou avec un outil qui le fait. Pour les éditions, vous pouvez généralement vous déplacer entre les principales SKU de SQL Server. Par exemple, vous pouvez déplacer une base de données de Standard à Entreprise sans aucun travail supplémentaire. Si vous utilisez des fonctionnalités d'entreprise (Say, compression ou partitionnement), vous devrez toutefois les désactiver avant de procéder au déplacement. Vous pouvez avoir une idée des fonctionnalités que vous '

Mike Walsh
la source
@Mike - le fait de détacher et d'attacher des bases de données régulièrement a-t-il un impact sur les performances? J'imagine que le cache de mémoire tampon est invalidé pour toute base de données détachée (clairement), mais êtes-vous au courant d'autres impacts?
Max Vernon
J'ai une base de données sur laquelle, lorsque j'arrête l'instance SQL Server et que je copie les 3 fichiers, puis que je les attache sur une autre instance, la base de données passe en récupération (m'est arrivé deux fois sur la même base de données). D'après votre description, cela ne devrait pas arriver, alors que devrais-je soupçonner à propos de ma DB? Est-il corrompu d'une manière ou d'une autre? Les sauvegardes prennent des heures pour créer et restaurer, et cette fonctionnalité est une bouée de sauvetage! Au moins pour le partage de la base de données de développeur ...
NoOne 10/10