web-dev-qa-db-fra.com

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

J'ai une base de données et je souhaite déplacer le .mdf et .ldf fichiers vers un autre emplacement. Mais je ne veux pas arrêter le service MSSQLSERVER et je ne veux pas exporter vers un autre serveur.

Comment puis-je faire ceci?

116
user2645263

Vous n'avez pas à 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 hors ligne. En effet, vous ne pouvez pas déplacer des fichiers pendant leur accès et la mise hors ligne de la base de données empêche l'utilisation des fichiers par l'application SQL Server.

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

Modifiez les emplacements des fichiers avec un ALTER DATABASE commande:

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

Remarque, vous n'avez pas besoin 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.

Mettre la base de données hors ligne

(J'utilise WITH ROLLBACK IMMEDIATE pour 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 à l'aide de 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 .

168
Mike Fal

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'arrêter la base de données de fonctionner, vous pouvez DETACH, déplacer les fichiers, puis ATTACH.

  • Clic droit sur le nom de la base de données
  • Sélectionnez Properties
  • Accédez à l'onglet Files
  • Notez les Path et FileName de MDF et fichiers LDF Cette étape est importante au cas où vous ne voudriez pas finir par chercher des fichiers manquants ...
  • Clic droit sur le nom de la base de données
  • Sélectionnez Tasks -> Detach
  • Déplacez les fichiers où vous le souhaitez
  • Faites un clic droit sur le nœud Databases de votre serveur
  • Sélectionnez Attach
  • Cliquez sur le bouton Add
  • Pointez vers le nouvel emplacement
  • Cliquez sur OK

Tu devrais être OK maintenant. Des informations sur le processus DETACH - ATTACH peuvent être trouvées ici .

Dans le lien sur DETACH - ATTACH, il est recommandé d'utiliser ALTER DATABASE instruction si la base de données est conservée sur la même instance de SQL Server. Plus de référence dans Move User Databases .

Si vous voulez le faire fonctionner pendant le déplacement, faites un BACKUP - RESTORE. Dans le processus de restauration, vous pouvez définir le nouvel emplacement des fichiers de base de données.

53

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. Faites une sauvegarde de la base de données créée par l'utilisateur pour plus de sécurité.

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

  4. Exécutez la commande suivante pour vérifier l'emplacement actuel du fichier 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 changer le chemin du fichier pour toutes les bases de données sauf 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é modifié.

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. Les propriétés internes vont aux paramètres de la base de données. Remplacez les emplacements par défaut de la base de données pour les données et les journaux par le chemin de destination. Déconnectez-vous du serveur.

    Par exemple: changez C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\ En E:\projects\DataBaseFiles\MSSQL\DATA\

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

  3. Copiez le ou les fichiers vers 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 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 autres que les fichiers de base de données système qui sont copiés. Par exemple:

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

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

  1. Dans le menu Démarrer, pointez sur Tous les programmes, pointez sur Microsoft SQL Server, pointez sur Outils de configuration et 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)) et 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 la modification. 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 principal. Cliquez sur Mettre à jour pour enregistrer la modification. 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 du 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 des paramètres 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 la relocalisation planifiée du fichier de données de base est E:\SQLData, les valeurs des paramètres seraient 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 sur le nom de l'instance et en choisissant Arrêter. Redémarrez l'instance de SQL Server.

  1. Connectez-vous en tant qu'utilisateur sa 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é.

6
abhay sreekumar

Vous faites étape par étape:

  1. fermer toute connexion
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

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

  3. Vers un nouveau chemin
    ALTER DATABASE MODIFIER LE FICHIER MyDB (Nom = MyDB, Filename = 'N:\DATA\MyDB.MDF')

  4. mettre la base de données avec le statut en ligne
    ALTER DATABASE MyDB SET EN LIGNE

  5. définir multi-utilisateurs
    ALTER DATABASE MyDB SET MULTI_USER

3

Il existe un moyen de déplacer des fichiers de données de base de données (vous ne savez pas encore s'il existe un moyen 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-take-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.

Pas ma solution, je cherchais cette solution moi-même et l'ai trouvée très utile pour notre environnement de production.

Thorfinn

3
Thorfinn Thomassen

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 la requête suivante pour trouver le chemin de la base de données que nous voulons déplacer vers un nouveau chemin et notez ce chemin que vous affichez dans la colonne CurrentLocation.

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

  1. Maintenant, allez dans ce chemin et notez le nom de Database_Name.mdf & Database_Name_log.ldf des dossiers. Exécutez ensuite 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 un clic droit sur Server_Name que vous pouvez voir dans l'Explorateur d'objets (côté gauche).

    enter image description here

  2. Ensuite Déplacez les deux fichiers de Ancien chemin vers Nouveau chemin et redémarrez le serveur par un clic droit sur Server_Name. Confirmez le nouveau chemin de la base de données en exécutant à nouveau la requête de la 1ère étape.

1
Karan Raiyani

Pour compléter les réponses existantes: Voici un script pour créer les instructions ALTER DATABASE ... MOVE ... 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 fichier.

  • master est 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).

1
Heinzi

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

Tout d'abord, sauvegardez 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 fichiers .mdf et .ldf sous les options de fichier pour 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 auraient cependant 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.

0
Ali