Déplacement des bases de données utilisateur

Dans SQL Server, vous pouvez déplacer les fichiers de données, les fichiers journaux et les fichiers de catalogues de texte intégral vers un nouvel emplacement, en spécifiant le nouvel emplacement de fichier dans la clause FILENAME de l'instruction ALTER DATABASE. Cette méthode s'applique au déplacement des fichiers de base de données dans la même instance SQL Server. Pour déplacer une base de données vers une autre instance SQL Server ou vers un autre serveur, utilisez les opérations de sauvegarde et de restauration ou les opérations de détachement et d'attachement.

Notes

Certaines fonctionnalités du moteur de base de données SQL Server modifient la façon dont le moteur de base de données stocke les informations dans les fichiers de base de données. Ces fonctionnalités sont limitées à des éditions spécifiques de SQL Server. Une base de données qui contient ces fonctionnalités ne peut pas être déplacée vers une édition de SQL Server qui ne les prend pas en charge. Utilisez la vue de gestion dynamique sys.dm_db_persisted_sku_features pour répertorier toutes les fonctions spécifiques à l'édition activées dans la base de données active.

Les procédures de cette rubrique requièrent le nom logique des fichiers de base de données. Pour obtenir ce nom, interrogez la colonne name dans l'affichage catalogue sys.master_files.

Notes

Lorsque vous déplacez une base de données sur une autre instance de serveur, pour garantir une expérience cohérente aux utilisateurs et aux applications, vous devrez peut-être recréer tout ou partie des métadonnées de la base de données. Pour plus d'informations, consultez Gestion des métadonnées lors de la mise à disposition d'une base de données sur une autre instance de serveur.

Procédure de déplacement planifié

Pour déplacer un fichier journal ou un fichier de données dans le cadre d'un déplacement planifié, procédez comme suit :

  1. Exécutez la commande suivante.

    ALTER DATABASE database_name SET OFFLINE;
    
  2. Déplacez le ou les fichiers vers le nouvel emplacement.

  3. Pour chaque fichier déplacé, exécutez la commande suivante.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' );
    
  4. Exécutez la commande suivante.

    ALTER DATABASE database_name SET ONLINE;
    
  5. Vérifiez le changement de fichier en exécutant la requête suivante.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Déplacement en vue d'une maintenance de disque planifiée

Pour déplacer un fichier dans le cadre d'un processus de maintenance de disque planifié, procédez comme suit :

  1. Pour chaque fichier à déplacer, exécutez la commande suivante.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' );
    
  2. Arrêtez l'intance de SQL Server ou éteignez le système pour que la maintenance ait lieu. Pour plus d'informations, consultez Arrêt des services.

  3. Déplacez le ou les fichiers vers le nouvel emplacement.

  4. Redémarrez l'instance de SQL Server ou le serveur. Pour plus d'informations, consultez Démarrage et redémarrage des services.

  5. Vérifiez le changement de fichier en exécutant la requête suivante.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Procédure de récupération après défaillance

Si un fichier doit être déplacé dans un nouvel emplacement en raison d'une défaillance matérielle, suivez la procédure décrite ci-dessous.

Important

Si la base de données ne démarre pas, à savoir en mode suspect ou dans un état non récupéré, seuls les membres du rôle fixe sysadmin peuvent déplacer le fichier.

  1. Arrêtez l'instance de SQL Server si elle est démarrée.

  2. Démarrez l'instance de SQL Server en mode de récupération de la base de données master uniquement en tapant une des commandes suivantes à l'invite de commandes.

    • Dans le cas d'une instance par défaut (MSSQLSERVER), exécutez la commande ci-dessous.

      NET START MSSQLSERVER /f /T3608
      
    • Dans le cas d'une instance nommée, exécutez la commande ci-dessous.

      NET START MSSQL$instancename /f /T3608
      

    Pour plus d'informations, consultez Procédure : démarrer une instance de SQL Server (commandes net).

  3. Pour chaque fichier à déplacer, utilisez les commandes sqlcmd ou SQL Server Management Studio pour exécuter l'instruction suivante.

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

    Pour plus d'informations sur l'utilisation de l'utilitaire sqlcmd, consultez Utilisation de l'utilitaire sqlcmd.

  4. Quittez l'utilitaire sqlcmd ou SQL Server Management Studio.

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

  6. Déplacez le ou les fichiers vers le nouvel emplacement.

  7. Démarrez l'instance de SQL Server. Par exemple, exécutez : NET START MSSQLSERVER.

  8. Vérifiez le changement de fichier en exécutant la requête suivante.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Exemples

L'exemple suivant déplace le fichier journal AdventureWorks2008R2 vers un nouvel emplacement dans le cadre d'un réadressage planifié.

USE master;
GO
-- Return the logical file name.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks2008R2')
    AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks2008R2 SET OFFLINE;
GO
-- Physically move the file to a new location.
-- In the following statement, modify the path specified in FILENAME to
-- the new location of the file on your server.
ALTER DATABASE AdventureWorks2008R2 
    MODIFY FILE ( NAME = AdventureWorks2008R2_Log, 
                  FILENAME = 'C:\NewLoc\AdventureWorks2008R2_Log.ldf');
GO
ALTER DATABASE AdventureWorks2008R2 SET ONLINE;
GO
--Verify the new location.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks2008R2')
    AND type_desc = N'LOG';