Copiare una copia coerente in modo transazionale di un database in database SQL di Azure

Si applica a:database SQL di Azure

database SQL di Azure fornisce diversi metodi per la creazione di una copia di un database esistente nello stesso server o in un server diverso. È possibile copiare un database usando portale di Azure, PowerShell, l'interfaccia della riga di comando di Azure o Transact-SQL.

Nota

Microsoft Entra ID era precedentemente noto come Azure Active Directory (Azure AD).

Panoramica

Una copia del database è uno snapshot coerente in modo transazionale del database di origine a partire da un punto nel tempo dopo l'avvio della richiesta di copia. È possibile selezionare lo stesso server o un server diverso per la copia. È anche possibile scegliere di mantenere la ridondanza del backup e le dimensioni di calcolo del database di origine oppure usare una ridondanza dell'archiviazione di backup diversa e/o le dimensioni di calcolo all'interno dello stesso livello di servizio. Esistono due eccezioni in cui un database nel livello di servizio Standard può essere copiato nel livello Standard o Per utilizzo generico e un database nel livello di servizio Premium può essere copiato nel livello Premium o Business Critical. Al termine del processo di copia, questa diventa un database indipendente e completamente funzionante. Accessi, utenti e autorizzazioni nel database copiato vengono gestiti in modo indipendente rispetto al database di origine. La copia viene creata usando la tecnologia di replica geografica. Al termine del seeding della replica, il collegamento di replica geografica viene terminato automaticamente. All'operazione di copia del database si applicano tutti i requisiti per l'uso della replica geografica. Per informazioni dettagliate, vedere Panoramica della replica geografica attiva.

Nota

Le portale di Azure, PowerShell e l'interfaccia della riga di comando di Azure non supportano la copia del database in una sottoscrizione diversa.

Copia del database per Azure SQL Hyperscale

Per Azure SQL Hyperscale, il database di destinazione determina se la copia è una copia veloce o una copia di dati di dimensioni.

  • Copia rapida: quando la copia viene eseguita nella stessa area dell'origine, la copia viene creata dagli snapshot dei BLOB, questa copia è un'operazione veloce indipendentemente dalle dimensioni del database.

  • Copia delle dimensioni dei dati: quando il database di destinazione si trova in un'area diversa dall'origine o se la ridondanza dell'archiviazione di backup del database (locale, zonale, geografica) dalla destinazione è diversa dal database di origine, l'operazione di copia è un'operazione di dimensioni dei dati. Il tempo di copia non è direttamente proporzionale alle dimensioni, perché i BLOB del server di pagine vengono copiati in parallelo.

Account di accesso nella copia del database

Quando si copia un database nello stesso server, è possibile usare gli stessi account di accesso in entrambi i database. L'entità di sicurezza usata per copiare il database diventa il proprietario del database nel nuovo database.

Quando la copia del database viene eseguita su un server diverso, l'entità di sicurezza che ha avviato l'operazione di copia nel server di destinazione diventa il proprietario del nuovo database.

Indipendentemente dal server di destinazione, tutti gli utenti del database, le autorizzazioni e gli identificatori di sicurezza (SID) vengono copiati nella copia del database. L'uso di utenti di database indipendenti per l'accesso ai dati garantisce che il database copiato abbia le stesse credenziali utente, in modo che dopo il completamento della copia sia possibile accedervi immediatamente con le stesse credenziali.

Se si usano accessi a livello di server per l'accesso ai dati e si copia il database in un server diverso, l'accesso potrebbe non funzionare. Ciò può verificarsi perché gli account di accesso non esistono nel server di destinazione o perché tali password e identificatori di sicurezza (SID) sono diversi. Per altre informazioni sulla gestione degli account di accesso quando si copia un database in un server diverso, vedere Come gestire database SQL di Azure sicurezza dopo il ripristino di emergenza. Dopo che l'operazione di copia in un server diverso ha esito positivo e prima che altri utenti vengano rieseguiti il mapping, solo l'account di accesso associato al proprietario del database o l'amministratore del server può accedere al database copiato. Per risolvere gli account di accesso e stabilire l'accesso ai dati al termine dell'operazione di copia, vedere Risolvere gli account di accesso.

Copiare usando il portale di Azure

Per copiare un database usando il portale di Azure, aprire la pagina per il database e quindi scegliere Copia per aprire la pagina Crea database SQL - Copia database. Immettere i valori per il server di destinazione in cui si desidera copiare il database.

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

Copiare usando PowerShell o l'interfaccia della riga di comando di Azure

Per copiare un database, usare gli esempi seguenti.

Per PowerShell, usare il cmdlet New-AzSqlDatabaseCopy .

Importante

Il modulo Azure Resource Manager (RM) di PowerShell è ancora supportato dal database SQL di Azure, ma tutte le attività di sviluppo future sono incentrate sul modulo Az.Sql. Il modulo AzureRM continuerà a ricevere correzioni di bug almeno fino a dicembre 2020. Gli argomenti per i comandi nei moduli Az e AzureRm sono sostanzialmente identici. Per altre informazioni sulla compatibilità, vedere Introduzione del nuovo modulo Az di Azure PowerShell.

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

La copia del database è un'operazione asincrona, ma il database di destinazione viene creato immediatamente dopo l'accettazione della richiesta. Se è necessario annullare l'operazione di copia mentre è ancora in corso, eliminare il database di destinazione usando il cmdlet Remove-AzSqlDatabase .

Per uno script di PowerShell di esempio completo, vedere Copiare un database in un nuovo server.

Copiare con Transact-SQL

Accedere al master database con l'account di accesso dell'amministratore del server o l'account di accesso che ha creato il database da copiare. Affinché la copia del database abbia esito positivo, gli account di accesso che non sono l'amministratore del server devono essere membri del ruolo dbmanager . Per ulteriori informazioni sugli account di accesso e la connessione al server, vedere Gestire gli accessi.

Iniziare a copiare il database di origine con CREATE DATABA edizione Standard ... ISTRUZIONE COPY OF. L'istruzione T-SQL continua l'esecuzione fino al completamento dell'operazione di copia del database.

Nota

L'interruzione dell'istruzione T-SQL non termina l'operazione di copia del database. Per terminare l'operazione, eliminare il database di destinazione.

Copiare nello stesso server

Accedere al master database con l'account di accesso dell'amministratore del server o l'account di accesso che ha creato il database da copiare. Affinché la copia del database abbia esito positivo, gli account di accesso che non sono l'amministratore del server devono essere membri del ruolo dbmanager .

Questo comando copia Database1 in un nuovo database denominato Database2 nello stesso server. A seconda delle dimensioni del database, l'operazione di copia potrebbe richiedere alcuni minuti.

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

Copiare in un pool elastico

Accedere al master database con l'account di accesso dell'amministratore del server o l'account di accesso che ha creato il database da copiare. Affinché la copia del database abbia esito positivo, gli account di accesso che non sono l'amministratore del server devono essere membri del ruolo dbmanager .

Questo comando copia Database1 in un nuovo database denominato Database2 pool elastico denominato pool1. A seconda delle dimensioni del database, l'operazione di copia potrebbe richiedere alcuni minuti.

Database1 può essere un database singolo o in pool. La copia tra pool di livelli diversi è supportata, ma alcune copie tra livelli hanno esito negativo. Ad esempio, è possibile copiare un database standard singolo o elastico in un pool per utilizzo generico, ma non è possibile copiare un database elastico standard in un pool Premium.

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

Copiare in un server diverso

Connessione al master database del server di destinazione in cui creare il nuovo database. Usare un account di accesso con lo stesso nome e la stessa password del proprietario del database di origine nel server di origine. L'account di accesso nel server di destinazione deve anche essere un membro del ruolo dbmanager o essere l'account di accesso amministratore del server.

Questo comando copia Database1 su server1 in un nuovo database denominato Database2 in server2. A seconda delle dimensioni del database, l'operazione di copia potrebbe richiedere alcuni minuti.

-- 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;

Importante

I firewall di entrambi i server devono essere configurati per consentire la connessione in ingresso dall'INDIRIZZO IP del client che emette T-SQL CREATE DATABA edizione Standard ... COME COMANDO COPY OF. Per determinare l'indirizzo IP di origine della connessione corrente, eseguire SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID;

Nota

La copia del database con T-SQL non è supportata durante la connessione al server di destinazione tramite un endpoint privato. Se un endpoint privato è configurato ma è consentito l'accesso alla rete pubblica, la copia del database è supportata quando è connessa al server di destinazione da un indirizzo IP pubblico usando l'autenticazione SQL. Al termine dell'operazione di copia, l'accesso pubblico può essere negato.

Analogamente, il comando seguente copia Database1 in server1 in un nuovo database denominato Database2 all'interno di un pool elastico denominato pool2, in 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 ) );

Copiare in una sottoscrizione diversa

È possibile usare la procedura descritta nella sezione Copiare un database SQL in un server diverso per copiare il database in un server in una sottoscrizione diversa usando T-SQL. Assicurarsi di usare un account di accesso con lo stesso nome e la stessa password del proprietario del database di origine. Inoltre, l'account di accesso deve essere membro del ruolo dbmanager o di un amministratore del server, sia nei server di origine che in quello di destinazione.

Suggerimento

Quando si copiano database nello stesso tenant di Microsoft Entra ID, l'autorizzazione nei server di origine e di destinazione viene semplificata se si avvia il comando di copia usando un account di accesso di autenticazione con accesso sufficiente su entrambi i server. Il livello minimo di accesso necessario è l'appartenenza al ruolo dbmanager nel master database in entrambi i server. Ad esempio, è possibile usare un account di accesso microsoft Entra ID membro di un gruppo designato come amministratore del server in entrambi i server.

--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;

Suggerimento

La copia del database con T-SQL supporta la copia di un database da una sottoscrizione in un tenant di Azure diverso. Questa opzione è supportata solo quando si usa un account di accesso di autenticazione SQL per accedere al server di destinazione. La creazione di una copia di database in un server logico in un tenant di Azure diverso non è supportata quando l'autenticazione di Microsoft Entra è attiva (abilitata) nel server logico di origine o di destinazione.

Monitorare lo stato dell'operazione di copia

Monitorare il processo di copia eseguendo query sulle viste sys.databases, sys.dm_database_copies e sys.dm_operation_status . Mentre la copia è in corso, la state_desc colonna della sys.databases vista per il nuovo database è impostata su COPYING.

  • Se la copia non riesce, la state_desc colonna della sys.databases vista per il nuovo database viene impostata su SUSPECT. Eseguire l'istruzione DROP sul nuovo database e riprovare in un secondo momento.
  • Se la copia ha esito positivo, la state_desc colonna della sys.databases vista per il nuovo database viene impostata su ONLINE. La copia è stata completata e il nuovo database è un database standard, che può essere modificato indipendentemente dal database di origine.

Nota

Se si decide di annullare la copia mentre è in corso, eseguire l'istruzione DROP DATABA edizione Standard nel nuovo database.

Importante

Se è necessario creare una copia con un obiettivo di servizio notevolmente inferiore rispetto all'origine, il database di destinazione potrebbe non avere risorse sufficienti per completare il processo di seeding e può causare l'esito negativo dell'operazione di copia. In questo scenario usare una richiesta di ripristino geografico per creare una copia in un server diverso e/o in un'area diversa. Per altre informazioni, vedere Ripristinare un database SQL di Azure usando i backup del database.

Ruoli e autorizzazioni di Controllo degli accessi in base al ruolo di Azure per gestire la copia del database

Per creare una copia del database, è necessario trovarsi nei ruoli seguenti:

  • Proprietario della sottoscrizione
  • Ruolo di Collaboratore SQL Server o
  • Ruolo personalizzato nel server di origine con le autorizzazioni seguenti:
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write e
  • Ruolo personalizzato nel server di destinazione con le autorizzazioni seguenti:
    • Microsoft.Sql/servers/read
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write

Per annullare una copia del database, è necessario trovarsi nei ruoli seguenti:

  • Proprietario della sottoscrizione
  • Ruolo di Collaboratore SQL Server o
  • Ruolo personalizzato nel database di destinazione con l'autorizzazione seguente:
    • Microsoft.Sql/servers/databases/delete

Per gestire la copia del database usando il portale di Azure, sono necessarie anche le autorizzazioni seguenti:

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

Se si vogliono visualizzare le operazioni nelle distribuzioni nel gruppo di risorse nel portale, le operazioni in più provider di risorse, incluse le operazioni SQL, sono necessarie queste autorizzazioni aggiuntive:

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

Risolvere gli account di accesso

Dopo che il nuovo database è online nel server di destinazione, usare l'istruzione ALTER U edizione Standard R per eseguire nuovamente il mapping degli utenti dal nuovo database agli account di accesso nel server di destinazione. Per risolvere gli utenti isolati, vedere Risolvere i problemi relativi agli utenti isolati (SQL Server). Vedere anche Come gestire database SQL di Azure sicurezza dopo il ripristino di emergenza.

Tutti gli utenti nel nuovo database mantengono le autorizzazioni di cui disponevano nel database di origine. L'utente che ha avviato la copia del database diventa il proprietario del database del nuovo database. Dopo che la copia ha esito positivo e prima che altri utenti vengano rieseguiti il mapping, solo il proprietario del database può accedere al nuovo database.

Per informazioni sulla gestione di utenti e account di accesso quando si copia un database in un server diverso, vedere Come gestire database SQL di Azure sicurezza dopo il ripristino di emergenza.

Errori di copia del database

Durante la copia di un database nel database SQL di Azure, possono essere rilevati gli errori seguenti. Per altre informazioni, vedere Copiare un database SQL di Azure.

Codice di errore Gravità Descrizione
40635 16 Il client con indirizzo IP '%.*ls' è temporaneamente disabilitato.
40637 16 La creazione della copia del database è attualmente disabilitata.
40561 16 Copia del database non riuscita. Il database di origine o di destinazione non esiste.
40562 16 Copia del database non riuscita. Il database di origine è stato rimosso.
40563 16 Copia del database non riuscita. Il database di destinazione è stato rimosso.
40564 16 Copia del database non riuscita a causa di un errore interno. Rimuovere il database di destinazione e riprovare.
40565 16 Copia del database non riuscita. Non è consentita più di una copia simultanea del database dalla stessa origine. Rimuovere il database di destinazione e riprovare in un secondo momento.
40566 16 Copia del database non riuscita a causa di un errore interno. Rimuovere il database di destinazione e riprovare.
40567 16 Copia del database non riuscita a causa di un errore interno. Rimuovere il database di destinazione e riprovare.
40568 16 Copia del database non riuscita. Il database di origine non è più disponibile. Rimuovere il database di destinazione e riprovare.
40569 16 Copia del database non riuscita. Il database di destinazione non è più disponibile. Rimuovere il database di destinazione e riprovare.
40570 16 Copia del database non riuscita a causa di un errore interno. Rimuovere il database di destinazione e riprovare in un secondo momento.
40571 16 Copia del database non riuscita a causa di un errore interno. Rimuovere il database di destinazione e riprovare in un secondo momento.