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?
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 .
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
.
Properties
Files
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 ...Tasks -> Detach
Databases
de votre serveurAttach
Add
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.
Pour déplacer des fichiers de base de données système, procédez comme suit:
Connectez-vous en tant qu'utilisateur sa dans SSMS
Faites une sauvegarde de la base de données créée par l'utilisateur pour plus de sécurité.
Tuez toutes les sessions connectées au serveur à partir de SSMS.
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.
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
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\
Arrêtez l'instance de SQL Server.
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.)
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.
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é.
Vous faites étape par étape:
fermer toute connexion
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
définir la base de données avec un statut hors ligne
ALTER DATABASE MyDB SET OFFLINE
Vers un nouveau chemin
ALTER DATABASE MODIFIER LE FICHIER MyDB (Nom = MyDB, Filename = 'N:\DATA\MyDB.MDF')
mettre la base de données avec le statut en ligne
ALTER DATABASE MyDB SET EN LIGNE
définir multi-utilisateurs
ALTER DATABASE MyDB SET MULTI_USER
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
Suivez ces 4 étapes simples:
CurrentLocation
.
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
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');
Maintenant, Arrêtez le serveur par un clic droit sur Server_Name
que vous pouvez voir dans l'Explorateur d'objets (côté gauche).
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.
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).
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.