Comment déplacer des fichiers de base de données SQL Server?

103

J'ai une base de données et je souhaite déplacer les fichiers .mdfet .ldfvers un autre emplacement. Mais je ne veux pas arrêter le MSSQLSERVERservice et je ne veux pas exporter vers un autre serveur.

Comment puis-je faire ceci?

Mike Fal
la source

Réponses:

155

Vous n'avez pas besoin d'arrêter le service SQL Server pour déplacer des fichiers de base de données, mais vous devez mettre la base de données spécifique en mode hors connexion. Cela est dû au fait que vous ne pouvez pas déplacer les fichiers pendant l'accès et la mise hors ligne de la base de données empêche les fichiers d'être utilisés par l'application SQL Server.

Le processus pour les déplacer est assez simple. Détacher / Attacher était déjà décrit, mais ce n’est pas aussi complexe.

Changer les emplacements de fichiers avec une ALTER DATABASEcommande:

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

Notez qu'il n'est pas nécessaire de déclarer l'ancien emplacement dans cette commande. La modification de ce chemin ne prend pas effet immédiatement, mais sera utilisée au prochain démarrage de la base de données.

Définir la base de données hors ligne

(J'utilise WITH ROLLBACK IMMEDIATEpour expulser tout le monde et annuler toutes les transactions actuellement ouvertes)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Déplacer / copier les fichiers vers le nouvel emplacement

Copiez simplement les fichiers en utilisant votre méthode préférée (Click 'n Drag, XCopy, Copy-Item, Robocopy)

Mettre la base de données en ligne

ALTER DATABASE foo SET ONLINE;

Vous pouvez voir cela décrit plus en détail ici .

Mike Fal
la source
13
Cela a fonctionné pour moi. Dans mon cas, je devais aussi déplacer le fichier LDF en utilisant la première commande: par exemple USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
Dewi Rees
1
Peut également être utilisé pour déplacer les fichiers d'index de texte intégral en mettant à jour le nom du fichier afin qu'il corresponde à ce que vous voyez dans la boîte de dialogue des fichiers.
DShook
24
Après avoir déplacé le ou les fichiers de base de données, assurez-vous que l'utilisateur "NT SERVICE \ MSSQLSERVER" est autorisé à le faire, sinon vous obtiendrez des erreurs en essayant de remettre la base de données en ligne.
Demonslay335
Qu'est-ce que "nom" est censé être? Dans la documentation, il y a "nom_logique". Que signifient-ils?
Johnny
2
@ mlhDev En fait, dans mon cas, l' MODIFY FILEordre est modifiable. Si vous exécutez d'abord MODIFY FILE, il vous dira que la commande s'exécute correctement et que son emplacement sera modifié après une opération hors ligne / en ligne (la formulation est différente, mais vous en avez une idée). La commande hors ligne-> Déplacer des fichiers-> en ligne importe cependant, pour une raison évidente. Marquez également la note de Demonslay335. L'autorisation de fichier est importante.
Lionet Chen
50

Les fichiers MDF et LDF sont protégés et ne peuvent pas être déplacés lorsque la base de données est en ligne.

Si cela ne vous dérange pas d’empêcher la base de données de fonctionner, vous pouvez DETACHalors déplacer les fichiers, puis le transférer ATTACH.

  • Clic droit sur le nom de la base de données
  • Sélectionner Properties
  • Aller à l' Filesonglet
  • Prenez note du Pathet FileNamede MDF et les fichiers LDF . Cette étape est importante au cas où vous ne voudriez plus chercher les fichiers manquants ...
  • Clic droit sur le nom de la base
  • Sélectionner Tasks -> Detach
  • Déplacez les fichiers où vous voulez
  • Clic droit sur le Databasesnoeud de votre serveur
  • Sélectionner Attach
  • Cliquez sur le Addbouton
  • Pointez sur le nouvel emplacement
  • Cliquez sur OK

Vous devriez être bien maintenant. Infos sur le DETACH- ATTACHprocessus se trouve ici .

Dans le lien à propos de DETACH- ATTACHil est recommandé d'utiliser l' ALTER DATABASEinstruction si vous conservez la base de données sur la même instance de SQL Server. Plus de référence dans Déplacer des bases de données d'utilisateurs .

Si vous voulez le garder en marche tout en vous déplaçant, faites un BACKUP- RESTORE. Dans le processus de restauration, vous pouvez définir le nouvel emplacement des fichiers de base de données.

Giannis Paraskevopoulos
la source
3
Je recommande d'ouvrir SQL Management Studio en tant qu'administrateur pour éviter les problèmes d'accès aux fichiers lors de la
remise en place
6

Pour déplacer des fichiers de base de données système, procédez comme suit:

  1. Connectez-vous en tant qu'utilisateur sa dans SSMS

  2. Effectuez une sauvegarde de la base de données créée par l'utilisateur pour des raisons de sécurité.

  3. Supprimez toutes les sessions connectées au serveur à partir de SSMS.

  4. Exécutez la commande suivante pour vérifier l'emplacement actuel des fichiers des bases de données système:

    USE master;
    SELECT * FROM sys.master_files;

Identifiez le chemin et notez le chemin actuel des fichiers.

  1. Utilisez TSQL pour modifier le chemin du fichier pour toutes les bases de données, à l'exception de la base master:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

Par exemple:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

Maintenant, l'emplacement du fichier a été changé.

Assurez-vous de déplacer les fichiers ldf et mdf

  1. Dans SSMS, cliquez avec le bouton droit sur le serveur et sélectionnez les propriétés. Dans les propriétés, accédez à Paramètres de base de données. Remplacez les emplacements par défaut de la base de données pour Data and Log par le chemin de destination. Déconnectez-vous du serveur.

    Ex: changer C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\àE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Arrêtez l'instance de SQL Server.

  3. Copiez le ou les fichiers dans le nouvel emplacement. Utilisez Robocopy pour déplacer les fichiers afin de copier les autorisations d'accès dans le dossier de destination. Ouvrez cmd et exécutez-le en tant qu'administrateur et utilisez la commande suivante:

    robocopy / sec sourceFolder destinationFolder

Il vaut mieux aller à l'emplacement source pour exécuter la commande. Supprimez les autres fichiers que les fichiers de base de données système copiés. Par exemple:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(Ici, nous déplaçons tous les fichiers de la base de données système vers un nouvel emplacement.)

  1. Dans le menu Démarrer, pointez sur Tous les programmes, sur Microsoft SQL Server, sur Outils de configuration, puis cliquez sur Gestionnaire de configuration SQL Server.

Effectuez les étapes suivantes dans le Gestionnaire de configuration SQL Server:

Dans le nœud Services SQL Server, cliquez avec le bouton droit sur l'instance de SQL Server (par exemple, SQL Server (MSSQLSERVER)), puis choisissez Propriétés. Dans la boîte de dialogue Propriétés de SQL Server (nom_instance), cliquez sur l'onglet Paramètres de démarrage. Dans la zone Paramètres existants, sélectionnez le paramètre –d pour déplacer le fichier de données maître. Cliquez sur Mettre à jour pour enregistrer le changement. Dans la zone Spécifier un paramètre de démarrage, remplacez le paramètre par le nouveau chemin de la base de données master. Dans la zone Paramètres existants, sélectionnez le paramètre –l pour déplacer le fichier journal maître. Cliquez sur Mettre à jour pour enregistrer le changement. Dans la zone Spécifier un paramètre de démarrage, remplacez le paramètre par le nouveau chemin de la base de données master.

La valeur du paramètre pour le fichier de données doit suivre le paramètre -d et la valeur du fichier journal doit suivre le paramètre -l. L'exemple suivant montre les valeurs de paramètre pour l'emplacement par défaut du fichier de données maître.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Si le déplacement prévu pour le fichier de données maître est E: \ SQLData, les valeurs de paramètre seront modifiées comme suit:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Arrêtez l'instance de SQL Server en cliquant avec le bouton droit de la souris sur le nom de l'instance et en choisissant Arrêter. Redémarrez l'instance de SQL Server.

  1. Connectez-vous en tant saqu'utilisateur dans SSMS et vérifiez l'emplacement des fichiers de base de données en exécutant la requête suivante:

    USE master;
    SELECT * FROM sys.master_files;

Terminé.

Abhay Sreekumar
la source
Vous pouvez utiliser la fonction SQL pour automatiser la tâche de toutes les bases de données: stackoverflow.com/a/19505918/439524
amuliar
3

Vous faites étape par étape:

  1. fermer toutes les connexions
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

  2. définir la base de données avec le statut hors connexion
    ALTER DATABASE MyDB SET OFFLINE

  3. Vers le nouveau chemin
    ALTER DATABASE MyDB MODIFY FILE (Name = MyDB, Nom du fichier = 'N: \ DATA \ MyDB.MDF')

  4. définir la base de données avec le statut en ligne
    ALTER DATABASE MyDB SET ONLINE

  5. définir plusieurs utilisateurs
    ALTER DATABASE MyDB SET MULTI_USER

Nguyễn Hải Đăng
la source
3

Il existe un moyen de déplacer les fichiers de données de la base de données (vous ne savez pas encore s'il est possible de le faire pour les fichiers journaux) sans mettre la base de données hors ligne.

Dejan Nakarada-Kordic a une explication + des scripts pour cette méthode ici: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

La version courte consiste à ajouter un autre fichier de base de données au nouvel emplacement, puis à utiliser DBCC Shrinkfile, avec l'option EMPTYFILE pour déplacer les données de l'ancien fichier vers le nouveau fichier. Lorsque cela est fait, vous pouvez supprimer l'ancien fichier de données.

Ce n’était pas ma solution, j’étais moi-même à la recherche de cette solution et je l’ai trouvée très utile pour notre environnement de production.

Thorfinn

Thorfinn Thomassen
la source
1

Suivez ces 4 étapes simples:

  1. Ouvrez SSMS et sélectionnez l' option Nouvelle requête en haut de la fenêtre. Ensuite, copiez et exécutez le chemin de requête suivante pour trouver la base de données que nous voulons déplacer vers un nouveau chemin et notez ce chemin que vous indiquez en CurrentLocationcolonne.

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. Maintenant, allez à ce chemin et notez le nom des fichiers Database_Name.mdf & Database_Name_log.ldf . Ensuite, exécutez les deux requêtes suivantes pour déplacer la base de données vers un emplacement spécifique.

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. Maintenant, arrêtez le serveur par clic droit sur Server_Namece que vous pouvez voir dans l'explorateur d'objets (côté gauche).

    entrez la description de l'image ici

  2. Puis déplacez les deux fichiers de Ancien chemin vers Nouveau chemin et démarrez à nouveau le serveur en cliquant avec le bouton droit de la souris sur Nom du serveur. Confirmez le nouveau chemin de la base de données en exécutant à nouveau la requête de la 1ère étape.

Karan Raiyani
la source
0

Je ne suis pas sûr que ce soit le meilleur moyen (je serais ravi que les commentaires me disent que ce n'est pas le cas), mais c'est très simple (et rapide si vous avez une petite base de données):

Commencez par sauvegarder la base de données dans un fichier .bak. Ensuite, restaurez la base de données à partir du même fichier .bak, en choisissant les nouveaux emplacements de fichier .mdf et .ldf dans les options de fichier de la tâche de restauration.

Je ne le ferais pas dans un environnement de production en dehors d'une fenêtre de maintenance, car vous ne pouvez pas accéder à la base de données pendant la restauration. D'autres méthodes que j'ai vues ci-dessus présenteraient des inconvénients similaires. Une fois la tâche de restauration terminée, vous n'avez pas besoin de supprimer l'ancien fichier. C'est fait automatiquement.

Ali
la source
1
Ce scénario présente des inconvénients. Lors de la restauration, la base de données d'origine doit être écrasée ou renommée. Pour les bases de données volumineuses, la méthode introduit une surcharge d’IO importante. Déplacer des fichiers comme décrit dans les méthodes detach-attach ou alter db est beaucoup plus rapide. Si les fichiers sont déplacés dans la même partition NTFS, il s’agit uniquement d’une opération de métadonnées.
vonPryz
@Ali - Sauvegarde et restauration. Peut prendre plus de temps, mais est généralement un chemin plus sûr. Voir l'analyse d'Aaron Bertrand à l' adresse suivante : blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups Aussi: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF
Pour les très grandes bases de données, cette approche (et l'approche détachement / attachement) introduit des temps d'arrêt importants. Pour éviter cela, placez la base de données source en mode de récupération complète, puis effectuez la restauration de sauvegarde initiale en laissant la base de données de destination non opérationnelle. Ensuite, sauvegardez / restaurez un ou plusieurs journaux de transactions. La base de données devra être arrêtée uniquement lors de la sauvegarde / restauration finale du journal des transactions, qui peut contenir une heure et une taille arbitrairement petites. Évidemment, vous devrez également restaurer un nom différent, puis procéder à un échange de nom. Cette approche est à peu près équivalente à l'envoi de journaux.
Brian
0

Pour compléter les réponses existantes: Voici un script pour créer les ALTER DATABASE ... MOVE ...instructions pour toutes les bases de données:

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

Remarque:

  • Remplacez REPLACE(f.physical_name, 'C:\', 'D:\')par la transformation que vous souhaitez apporter aux chemins de fichiers.

  • masterest exempté, car son chemin est déterminé par les options de démarrage de SQL Server (voir, par exemple, cette réponse pour plus de détails).

Heinzi
la source