Copier une copie cohérente au niveau transactionnel d’une base de données dans Azure SQL Database

S’applique à Azure SQL Database

Azure SQL Database propose plusieurs méthodes pour créer une copie d’une base de données existante sur le même serveur ou sur un autre serveur. Vous pouvez copier une base de données à partir du portail Azure, PowerShell, Azure CLI ou Transact-SQL.

Remarque

Microsoft Entra ID était précédemment connu sous le nom d’Azure Active Directory (Azure AD).

Vue d’ensemble

Une copie de base de données est un instantané cohérent d’un point de vue transactionnel de la base de données source au moment où la demande de copie est lancée. Vous pouvez sélectionner le même serveur ou un autre serveur pour la copie. Vous pouvez aussi conserver la redondance de sauvegarde et la taille de calcul de la base de données source, ou utiliser une redondance de stockage de sauvegarde et/ou une taille de calcul différentes au sein du même niveau de service. Il existe quelques exceptions où une base de données dans le niveau de service Standard peut être copiée vers un niveau Standard ou Usage général et une base de données dans le niveau de service Premium peut être copiée vers le niveau Premium ou Critique pour l’entreprise. Une fois la copie terminée, elle devient une base de données indépendante et entièrement fonctionnelle. Les connexions, les utilisateurs et les autorisations de la base de données copiée sont gérés indépendamment de la base de données source. La copie est créée à l’aide de la technologie de géoréplication. Une fois l’amorçage du réplica terminé, le lien de géoréplication prend fin automatiquement. Toutes les exigences relatives à l’utilisation de la géoréplication s’appliquent à l’opération de copie de base de données. Pour plus d’informations, consultez Présentation de la géoréplication active.

Remarque

Le Portail Azure, PowerShell et l’interface de ligne de commande Azure ne prennent pas en charge la copie de la base de données sur un autre abonnement.

Copie de base de données pour Azure SQL Hyperscale

Pour Azure SQL Hyperscale, la base de données cible détermine si la copie est une copie rapide ou une copie taille de données.

  • Copie rapide : lorsque la copie est effectuée dans la même région que la source, la copie est créée à partir des captures instantanées d’objets blob, cette copie est une opération rapide, quelle que soit la taille de la base de données.

  • Taille de la copie des données : lorsque la base de données cible se trouve dans une autre région que la source ou si la redondance du stockage de la sauvegarde de la base de données (locale, zonale, géo) de la cible diffère de celle de la base de données source, l’opération de copie est une opération taille de données. L’heure de copie ne sera pas directement proportionnelle à la taille, car les objets blob de serveur de pages sont copiés en parallèle.

Connexions dans la copie de la base de données

Lorsque vous copiez une base de données sur le même serveur, les mêmes connexions peuvent être utilisées sur les deux bases de données. L'élément principal de sécurité que vous utilisez pour copier la base de données devient le propriétaire de la base de données sur la nouvelle base de données.

Lorsque vous copiez une base de données vers un autre serveur, le principal de sécurité qui a lancé l’opération de copie sur le serveur cible devient le propriétaire de la nouvelle base de données.

Quel que soit le serveur cible, tous les utilisateurs de la base de données, leurs autorisations et leurs identificateurs de sécurité (SID) sont copiés vers la copie de base de données. Si vous utilisez des utilisateurs de base de données autonome pour accéder aux données, vérifiez que la base de données copiée utilise les mêmes informations d’identification utilisateur afin de pouvoir y accéder immédiatement avec les mêmes informations d’identification, une fois la copie terminée.

Si vous utilisez des connexions au niveau du serveur pour l'accès aux données et copiez la base de données sur un autre serveur, l'accès par connexion peut ne pas fonctionner. Cela peut se produire si les connexions n'existent pas sur le serveur cible, ou si leurs mots de passe et identificateurs de sécurité (SID) sont différents. Pour en savoir plus sur la gestion des connexions durant la copie d’une base de données vers un autre serveur, consultez Comment gérer la sécurité Azure SQL Database après une récupération d'urgence. Une fois l'opération de copie sur un autre serveur réussie, et avant que d'autres utilisateurs ne soient redirigés, seule la connexion associée au propriétaire de la base de données, ou l'administrateur du serveur, peut se connecter à la base de données copiée. Pour résoudre les connexions et établir l’accès aux données à l’issue de l’opération de copie, consultez Résoudre les connexions.

Copier à l’aide du Portail Azure

Pour copier une base de données en utilisant le portail Azure, ouvrez la page pour votre base de données, puis choisissez Copier pour ouvrir la page Créer une base de données SQL - Copier une base de données. Renseignez les valeurs pour le serveur cible sur lequel vous voulez copier votre base de données.

Screenshot of Azure portal, showing Database copy option highlighted on the database overview page.

Copier à l’aide de PowerShell ou d’Azure CLI

Pour copier une base de données, utilisez les exemples suivants.

Pour PowerShell, utilisez la cmdlet New-AzSqlDatabaseCopy.

Important

Le module PowerShell Azure Resource Manager (RM) est toujours pris en charge par Azure SQL Database, mais tous les développements à venir sont destinés au module Az.Sql. Le module AzureRM continue à recevoir des résolutions de bogues jusqu’à au moins décembre 2020. Les arguments des commandes dans le module Az sont sensiblement identiques à ceux des modules AzureRm. Pour en savoir plus sur leur compatibilité, consultez Présentation du nouveau module Az Azure PowerShell.

New-AzSqlDatabaseCopy -ResourceGroupName "<resourceGroup>" -ServerName $sourceserver -DatabaseName "<databaseName>" `
    -CopyResourceGroupName "myResourceGroup" -CopyServerName $targetserver -CopyDatabaseName "CopyOfMySampleDatabase"

La copie de la base de données est une opération asynchrone, mais la base de données cible est créée de suite après que la demande est acceptée. Si vous devez annuler une opération de copie en cours, supprimez la base de données cible à l’aide de l’applet de commande Remove-AzSqlDatabase.

Pour un exemple complet de script PowerShell, consultez Copier une base de données sur un nouveau serveur.

Copier à l’aide de Transact-SQL

Connectez-vous à la base de données master à l’aide de la connexion de l’administrateur du serveur ou la connexion qui a créé la base de données que vous souhaitez copier. Pour que la copie de la base de données réussisse, les connexions autres que celle de l’administrateur du serveur doivent être membres du rôle dbmanager. Pour plus d’informations sur les connexions et la connexion au serveur, consultez la page Gérer les connexions.

Démarrez la copie de la base de données source avec l’instruction CREATE DATABASE ... AS COPY OF. L’instruction T-SQL continue de fonctionner jusqu'à ce que l'opération de copie de la base de données soit terminée.

Remarque

L’arrêt de l’instruction T-SQL ne met pas fin à l'opération de copie de la base de données. Pour mettre fin à l'opération, supprimez la base de données cible.

Copier sur le même serveur

Connectez-vous à la base de données master à l’aide de la connexion de l’administrateur du serveur ou la connexion qui a créé la base de données que vous souhaitez copier. Pour que la copie de la base de données réussisse, les connexions autres que celle de l’administrateur du serveur doivent être membres du rôle dbmanager.

Cette commande copie Database1 dans une nouvelle base de données nommée Database2 sur le même serveur. Selon la taille de votre base de données, l'opération de copie peut prendre plus ou moins longtemps.

-- Execute on the master database to start copying
CREATE DATABASE Database2 AS COPY OF Database1;

Copier dans un pool élastique

Connectez-vous à la base de données master à l’aide de la connexion de l’administrateur du serveur ou la connexion qui a créé la base de données que vous souhaitez copier. Pour que la copie de la base de données réussisse, les connexions autres que celle de l’administrateur du serveur doivent être membres du rôle dbmanager.

Cette commande copie Database1 dans une nouvelle base de données nommée Database2 dans un pool élastique nommé pool1. Selon la taille de votre base de données, l'opération de copie peut prendre plus ou moins longtemps.

Database1 peut être une base de données unique ou mise en pool. La copie entre différents pools de niveaux est prise en charge, mais il arrive que certaines copies entre niveaux échouent. Par exemple, vous pouvez copier une base de données Standard unique ou élastique dans un pool à usage général, mais vous ne pouvez pas copier une base de données élastique Standard dans un pool Premium.

-- Execute on the master database to start copying
CREATE DATABASE Database2
AS COPY OF Database1
(SERVICE_OBJECTIVE = ELASTIC_POOL( name = pool1 ));

Copier sur un autre serveur

Connectez-vous à la base de données master du serveur cible où la nouvelle base de données doit être créée. Utilisez une connexion avec les mêmes nom et mot de passe que le propriétaire de la base de données de la base de données source sur le serveur source. La connexion sur le serveur cible doit également être membre du rôle dbmanager ou être la connexion de l’administrateur du serveur.

Cette commande copie Database1 sur server1 dans une nouvelle base de données nommée Database2 sur server2. Selon la taille de votre base de données, l'opération de copie peut prendre plus ou moins longtemps.

-- Execute on the master database of the target server (server2) to start copying from Server1 to Server2
CREATE DATABASE Database2 AS COPY OF server1.Database1;

Important

Les pare-feu des deux serveurs doivent être configurés pour autoriser la connexion entrante à partir de l’adresse IP du client émettant la commande T-SQL CREATE DATABASE ... AS COPY OF. Pour déterminer l’adresse IP source de la connexion actuelle, exécutez : SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID;

Remarque

La copie de base de données avec T-SQL n’est pas prise en charge lors de la connexion au serveur de destination via un point de terminaison privé. Si un point de terminaison privé est configuré mais que l’accès au réseau public est autorisé, la copie de base de données est prise en charge lorsqu’elle est connectée au serveur de destination à partir d’une adresse IP publique. Une fois l’opération de copie terminée, l’accès public peut être refusé.

De même, la commande ci-dessous copie Database1 de server1 vers une nouvelle base de données nommée Database2 au sein d’un pool élastique appelé pool2, sur server2.

-- Execute on the master database of the target server (server2) to start copying from Server1 to Server2
CREATE DATABASE Database2 AS COPY OF server1.Database1 (SERVICE_OBJECTIVE = ELASTIC_POOL( name = pool2 ) );

Copier sur un autre abonnement

Vous pouvez utiliser les étapes décrites dans la section Copier SQL Database sur un autre serveur pour copier votre base de données sur un serveur d’un autre abonnement à l’aide de T-SQL. Veillez à utiliser une connexion avec les mêmes nom et mot de passe que le propriétaire de la base de données source. En outre, la connexion doit être un membre du rôle dbmanager ou un administrateur de serveur, à la fois sur les serveurs source et cible.

Conseil

Lors de la copie de bases de données dans le même locataire Microsoft Entra ID, l’autorisation sur les serveurs source et de destination est simplifiée si vous lancez la commande de copie à l’aide d’une connexion d’authentification avec un accès suffisant sur les deux serveurs. Le niveau d’accès minimal nécessaire est l’appartenance au rôle dbmanager dans la base de données master sur les deux serveurs. Par exemple, vous pouvez utiliser une connexion Microsoft Entra ID qui est membre d’un groupe désigné administrateur des deux serveurs.

--Step# 1
--Create login and user in the master database of the source server.

CREATE LOGIN loginname WITH PASSWORD = 'xxxxxxxxx'
GO
CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE dbmanager ADD MEMBER loginname;
GO

--Step# 2
--Create the user in the source database and grant dbowner permission to the database.

CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE db_owner ADD MEMBER loginname;
GO

--Step# 3
--Capture the SID of the user "loginname" from master database

SELECT [sid] FROM sysusers WHERE [name] = 'loginname';

--Step# 4
--Connect to Destination server.
--Create login and user in the master database, same as of the source server.

CREATE LOGIN loginname WITH PASSWORD = 'xxxxxxxxx', SID = [SID of loginname login on source server];
GO
CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE dbmanager ADD MEMBER loginname;
GO

--Step# 5
--Execute the copy of database script from the destination server using the credentials created

CREATE DATABASE new_database_name
AS COPY OF source_server_name.source_database_name;

Conseil

La copie de base de données à l’aide de T-SQL prend en charge la copie d’une base de données d’un abonnement dans un locataire Azure différent. Cette fonctionnalité n’est prise en charge que lors de l’utilisation d’une connexion d’authentification SQL pour se connecter au serveur cible. La création d’une copie de base de données dans un autre client Azure n’est pas prise en charge lorsque l’authentification Microsoft Entra est active (activée) sur le serveur logique source ou cible.

Contrôle de la progression de l’opération de copie

Contrôlez le processus de copie en interrogeant les vues sys.databases, sys.dm_database_copies et sys.dm_operation_status. Pendant que la copie est en cours, la colonne state_desc de la vue sys.databases pour la nouvelle base de données a pour valeur COPYING.

  • Si la copie échoue, la colonne state_desc de la vue sys.databases pour la nouvelle base de données a pour valeur SUSPECT. Exécutez l'instruction DROP sur la nouvelle base de données et réessayez ultérieurement.
  • Si la copie réussit, la colonne state_desc de la vue sys.databases pour la nouvelle base de données a pour valeur ONLINE. La copie est terminée et la nouvelle base de données est une base de données normale, qui peut être modifiée indépendamment de la base de données source.

Remarque

Si vous décidez d’annuler la copie pendant qu’elle est en cours, exécutez l’instruction DROP DATABASE sur la nouvelle base de données.

Important

Si vous devez créer une copie avec un objectif de service beaucoup plus petit que la source, la base de données cible peut ne pas disposer de ressources suffisantes pour terminer le processus d’amorçage et peut entraîner l’échec de l’opération de copie. Dans ce scénario, utilisez une requête de géorestauration pour créer une copie sur un autre serveur et/ou dans une autre région. Consultez Récupérer Azure SQL Database à l’aide de sauvegardes de bases de connées pour en savoir plus.

Rôles et autorisations RBAC Azure pour gérer la copie de base de données

Pour créer une copie de base de données, vous devez disposer des rôles suivants :

  • propriétaire de l’abonnement ou
  • Rôle Contributeur de SQL Server
  • Rôle personnalisé sur le serveur source avec les autorisations suivantes :
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write et
  • Rôle personnalisé sur le serveur cible avec les autorisations suivantes :
    • Microsoft.Sql/servers/read
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write

Pour annuler une copie de base de données, vous devez disposer des rôles suivants :

  • propriétaire de l’abonnement ou
  • Rôle Contributeur de SQL Server
  • Rôle personnalisé sur la base de données cible avec les autorisations suivantes :
    • Microsoft.Sql/servers/databases/delete

Pour gérer la copie de bases de données à l’aide du Portail Azure, vous devez également disposer des autorisations suivantes :

  • Microsoft.Resources/subscriptions/resources/read
  • Microsoft.Resources/deployments/read
  • Microsoft.Resources/deployments/write
  • Microsoft.Resources/deployments/operationstatuses/read

Si vous voulez voir les opérations en cours de déploiement dans le groupe de ressources sur le portail, les opérations à travers plusieurs fournisseurs de ressources, y compris les opérations SQL, vous avez besoin de ces autorisations supplémentaires :

  • Microsoft.Resources/subscriptions/resourcegroups/deployments/operations/read
  • Microsoft.Resources/subscriptions/resourcegroups/deployments/operationstatuses/read

Résolution des connexions

Une fois que la nouvelle base de données est en ligne sur le serveur cible, utilisez l'instruction ALTER USER pour remapper les utilisateurs de la nouvelle base de données avec des connexions sur le serveur cible. Pour résoudre les problèmes d’utilisateurs orphelins, consultez Dépannage des utilisateurs orphelins. Vous pouvez également consulter Comment gérer la sécurité d’Azure SQL Database après une récupération d'urgence.

Tous les utilisateurs de la nouvelle base de données conservent les autorisations qu’ils avaient dans la base de données source. L'utilisateur qui a initié la copie de la base de données devient le propriétaire de celle-ci. Une fois la copie réussie et avant que les autres utilisateurs ne soient remappés, seul le propriétaire de la base de données peut se connecter à la nouvelle base de données.

Pour en savoir plus sur la gestion des utilisateurs et des connexions lors de la copie d’une base de données sur un autre serveur, consultez Comment gérer la sécurité d’Azure SQL Database après une récupération d'urgence.

Erreurs de copie de base de données

Les erreurs suivantes peuvent survenir lors de la copie d’une base de données dans Azure SQL Database. Pour en savoir plus, consultez Copie d’une base de données Azure SQL.

Code d'erreur severity Description
40635 16 Le client avec l'adresse IP '%.*ls' est désactivé temporairement.
40637 16 La copie de base de données est actuellement désactivée.
40561 16 La copie de base de données a échoué. La base de données source ou cible n'existe pas.
40562 16 La copie de base de données a échoué. La base de données source a été supprimée.
40563 16 La copie de base de données a échoué. La base de données cible a été supprimée.
40564 16 La copie de base de données a échoué en raison d'une erreur interne. Supprimez la base de données cible et réessayez.
40565 16 La copie de base de données a échoué. Pas plus d'une copie de base de données simultanée de la même source est autorisée. Supprimez la base de données cible et réessayez ultérieurement.
40566 16 La copie de base de données a échoué en raison d'une erreur interne. Supprimez la base de données cible et réessayez.
40567 16 La copie de base de données a échoué en raison d'une erreur interne. Supprimez la base de données cible et réessayez.
40568 16 La copie de base de données a échoué. La base de données source n'est plus disponible. Supprimez la base de données cible et réessayez.
40569 16 La copie de base de données a échoué. La base de données cible n'est plus disponible. Supprimez la base de données cible et réessayez.
40570 16 La copie de base de données a échoué en raison d'une erreur interne. Supprimez la base de données cible et réessayez ultérieurement.
40571 16 La copie de base de données a échoué en raison d'une erreur interne. Supprimez la base de données cible et réessayez ultérieurement.