Réponses:
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 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
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 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 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 .
MODIFY FILE
ordre 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.
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 DETACH
alors déplacer les fichiers, puis le transférer ATTACH
.
Properties
Files
ongletPath
et FileName
de MDF et les fichiers LDF . Cette étape est importante au cas où vous ne voudriez plus chercher les fichiers manquants ...Tasks -> Detach
Databases
noeud de votre serveurAttach
Add
boutonOK
Vous devriez être bien maintenant. Infos sur le DETACH
- ATTACH
processus se trouve ici .
Dans le lien à propos de DETACH
- ATTACH
il est recommandé d'utiliser l' ALTER DATABASE
instruction 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.
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
Effectuez une sauvegarde de la base de données créée par l'utilisateur pour des raisons de sécurité.
Supprimez toutes les sessions connectées au serveur à partir de SSMS.
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.
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
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\
Arrêtez l'instance de SQL Server.
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.)
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.
Connectez-vous en tant sa
qu'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é.
Vous faites étape par étape:
fermer toutes les connexions
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
définir la base de données avec le statut hors connexion
ALTER DATABASE MyDB SET OFFLINE
Vers le nouveau chemin
ALTER DATABASE MyDB MODIFY FILE (Name = MyDB, Nom du fichier = 'N: \ DATA \ MyDB.MDF')
définir la base de données avec le statut en ligne
ALTER DATABASE MyDB SET ONLINE
définir plusieurs utilisateurs
ALTER DATABASE MyDB SET MULTI_USER
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
Suivez ces 4 étapes simples:
CurrentLocation
colonne.
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 clic droit sur Server_Name
ce que vous pouvez voir dans l'explorateur d'objets (côté gauche).
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.
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.
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.
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).
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