Fazer uma cópia consistente transicionalmente de um banco de dados no SQL do Azure

Aplica-se a:Banco de Dados SQL do Azure

O Banco de Dados SQL do Azure fornece vários métodos para criar uma cópia transacionalmente consistente do banco de dados existente no mesmo servidor ou em um servidor diferente. Você pode copiar um banco de dados usando o portal do Azure, o PowerShell, a CLI do Azure ou o Transact-SQL.

Observação

O Microsoft Entra ID era anteriormente conhecido como Azure Active Directory (Azure AD).

Visão geral

Uma cópia do banco de dados é um instantâneo transacionalmente consistente do banco de dados de origem como um ponto no tempo depois que a solicitação da cópia é iniciada. Você pode selecionar o mesmo servidor ou um servidor diferente para a cópia. Além disso, você pode optar por manter a redundância de backup, o tamanho de computação do banco de dados de origem ou usar uma redundância de armazenamento de backup e/ou um tamanho de computação diferente na mesma camada de serviço. Há algumas exceções em que um banco de dados na camada de serviço Standard pode ser copiado para a camada Standard ou General Purpose e um banco de dados na camada de serviço Premium pode ser copiado para a camada Premium ou Comercialmente Crítico. Após a conclusão da cópia, a cópia se tornará um banco de dados independente e totalmente funcional. Os logons, os usuários e as permissões no banco de dados copiado são gerenciados independentemente do banco de dados de origem. A cópia é criada usando a tecnologia de replicação geográfica. Depois que a propagação de réplica for concluída, o link de replicação geográfica será encerrado automaticamente. Todos os requisitos para usar a replicação geográfica se aplicam à operação de cópia do banco de dados. Confira detalhes em Visão geral da replicação geográfica ativa.

Observação

O portal do Azure, o PowerShell e a CLI do Azure não dão suporte à cópia de banco de dados para uma assinatura diferente.

Cópia do Banco de Dados para o SQL do Azure da Hiperescala

Para a Hiperescala do SQL do Azure, o banco de dados de destino determina se a cópia é uma cópia rápida ou um tamanho da cópia de dados.

  • Cópia rápida: quando a cópia é feita na mesma região que a origem, a cópia será criada a partir dos instantâneos de blobs, essa cópia é uma operação rápida, independentemente do tamanho do banco de dados.

  • Tamanho da cópia de dados: quando o banco de dados de destino estiver em uma região diferente da origem ou se a redundância de armazenamento de backup do banco de dados (Local, Zonal, Geográfica) do destino for diferente do banco de dados de origem, a operação de cópia é uma operação de tamanho de dados. A hora da cópia não é diretamente proporcional ao tamanho, pois os blobs do servidor de páginas são copiados em paralelo.

Logons na cópia do banco de dados

Quando você copia um banco de dados no mesmo servidor, os mesmos logons podem ser usados em ambos os bancos de dados. A entidade de segurança usada para copiar o banco de dados se tornará o proprietário do banco de dados do banco de dados.

Quando você copia um banco de dados para um servidor diferente, a entidade de segurança que iniciou a operação de cópia no servidor de destino torna-se a proprietária do novo banco de dados.

Independentemente do servidor de destino, todos os usuários do banco de dados, suas permissões e seus SIDs (identificadores de segurança) são copiados para a cópia do banco de dados. A utilização de usuários de banco de dados independentes para acessar os dados garante que o banco de dados copiado sempre tenha as mesmas credenciais de usuário. Portanto, depois que a cópia for concluída, será possível acessá-la imediatamente com as mesmas credenciais.

Se você usar logons no nível do servidor para acessar os dados e copiar o banco de dado para um servidor diferente, o acesso baseado em logon talvez não funcione. Isso pode acontecer porque os logons não existem no servidor de destino ou porque as senhas e SIDs (identificadores de segurança) são diferentes. Para obter mais informações sobre como gerenciar logons ao copiar um banco de dados para um servidor diferente, consulte Como gerenciar a segurança do Banco de Dados SQL do Azure após a recuperação de desastre. Depois que a operação de cópia para um servidor diferente for realizada com sucesso e antes que outros usuários sejam mapeados novamente, somente o logon associado ao proprietário do banco de dados ou ao administrador do servidor poderá fazer logon no banco de dados copiado. Para resolver logons e estabelecer o acesso aos dados após a conclusão da operação de cópia, confira Resolver logons.

Copiar usando o portal do Azure

Para copiar um banco de dados usando o portal do Azure, abra a página do banco de dados e escolha Copiar para abrir a página Criar Banco de Dados SQL – Copiar banco de dados. Preencha os valores do servidor de destino para o qual você deseja copiar o banco de dados.

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

Copiar usando PowerShell ou CLI do Azure

Para copiar um banco de dados, use os exemplos a seguir.

Para o PowerShell, use o cmdlet New-AzSqlDatabaseCopy.

Importante

O módulo ARM (Azure Resource Manager) do PowerShell ainda é compatível com o Banco de Dados SQL do Azure, mas todo o desenvolvimento futuro é para o módulo Az.Sql. O módulo AzureRM continuará a receber as correções de bugs até pelo menos dezembro de 2020. Os argumentos para os comandos no módulo Az e nos módulos AzureRm são substancialmente idênticos. Para saber mais sobre a compatibilidade entre eles, confira Apresentação do novo módulo Az do Azure PowerShell.

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

A cópia do banco de dados é uma operação assíncrona, mas o banco de dados de destino é criado imediatamente depois que a solicitação é aceita. Se você precisar cancelar a operação de cópia enquanto ainda estiver em andamento, remova o banco de dados de destino usando o cmdlet Remove-AzSqlDatabase.

Para ver um script do PowerShell de exemplo completo, confira Copiar um banco de dados para um novo servidor.

Copiar usando o Transact-SQL

Faça logon no banco de dados master com o logon do administrador do servidor ou o logon que criou o banco de dados que você deseja copiar. Para que a cópia do banco de dados seja bem-sucedida, os logons que não são do administrador do servidor devem ser membros da função dbmanager. Para saber mais sobre logons e como se conectar ao servidor, confira Gerenciar logons.

Inicie a cópia do banco de dados de origem com a instrução CREATE DATABASE ... AS COPY OF. A instrução T-SQL continua em execução até que a operação de cópia do banco de dados seja concluída.

Observação

Encerrar a instrução T-SQL não encerra a operação de cópia do banco de dados. Para encerrar a operação, descarte o banco de dados de destino.

Copiar para o mesmo servidor

Faça logon no banco de dados master com o logon do administrador do servidor ou o logon que criou o banco de dados que você deseja copiar. Para que a cópia do banco de dados seja bem-sucedida, os logons que não forem o administrador do servidor deverão ser membros da função dbmanager.

Esse comando copia Database1 para um novo banco de dados denominado Database2 no mesmo servidor. Dependendo do tamanho do banco de dados, a operação de cópia poderá demorar a ser concluída.

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

Copiar em um pool elástico

Faça logon no banco de dados master com o logon do administrador do servidor ou o logon que criou o banco de dados que você deseja copiar. Para que a cópia do banco de dados seja bem-sucedida, os logons que não forem o administrador do servidor deverão ser membros da função dbmanager.

Esse comando copia Database1 para um novo banco de dados denominado Database2 em um pool elástico chamado pool1. Dependendo do tamanho do banco de dados, a operação de cópia poderá demorar a ser concluída.

Database1 pode ser um banco de dados único ou em pool. A cópia entre pools de camadas diferentes tem suporte, mas algumas cópias entre camadas falham. Por exemplo, você pode copiar um só BD padrão elástico ou único para um pool de Uso Geral, mas não pode copiar um BD elástico padrão para um pool premium.

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

Copiar em um servidor diferente

Conecte-se ao banco de dados master do servidor de destino em que o novo banco de dados será criado. Use um logon que tenha os mesmos nome e senha que o proprietário do banco de dados do banco de dados de origem no servidor de origem. O logon no servidor de destino também deve ser um membro da função dbmanager ou ser o logon de administrador do servidor.

Esse comando copia Database1 no servidor1 para um novo banco de dados chamado Database2 no server2. Dependendo do tamanho do banco de dados, a operação de cópia poderá demorar a ser concluída.

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

Os firewalls dos servidores devem ser configurados para permitir a conexão de entrada do IP do cliente que emite o comando T-SQL CREATE DATABASE ... AS COPY OF. Para determinar o endereço IP de origem da conexão atual, execute SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID;

Observação

Não há suporte para a cópia do Banco de Dados usando T-SQL ao se conectar ao servidor de destino por meio de um ponto de extremidade privado. Se um ponto de extremidade privado estiver configurado, mas o acesso à rede pública for permitido, a cópia do banco de dados terá suporte quando conectada ao servidor de destino de um endereço IP público usando autenticação do SQL. Depois que a operação de cópia for concluída, o acesso público poderá ser negado.

Da mesma forma, o comando abaixo copia Database1 no servidor1 para um novo banco de dados denominado Database2 em um pool elástico chamado pool2, no 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 ) );

Copiar em uma assinatura diferente

Você pode usar as etapas na seção Copiar um Banco de Dados SQL em um servidor diferente para copiar seu banco de dados para um servidor em uma assinatura diferente usando o T-SQL. Use um logon que tenha os mesmos nome e senha que o proprietário do banco de dados de origem. Além disso, o logon deve ser um membro da função dbmanager ou de um administrador do servidor, nos servidores de origem e de destino.

Dica

Ao copiar bancos de dados no mesmo locatário do Microsoft Entra, a autorização nos servidores de origem e de destino será simplificada se você iniciar o comando de cópia usando um logon de autenticação com acesso suficiente em ambos os servidores. O nível mínimo necessário de acesso é a associação à função dbmanager no banco de dados master em ambos os servidores. Por exemplo, você pode usar um logon do Microsoft Entra ID que seja membro de um grupo designado como administrador do servidor em ambos os servidores.

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

Dica

A cópia do banco de dados usando o T-SQL dá suporte à cópia de um banco de dados de uma assinatura em um locatário do Azure diferente. Isso só tem suporte ao usar um logon de autenticação do SQL para fazer logon no servidor de destino. A criação de uma cópia de banco de dados em um servidor lógico em um locatário diferente do Azure não tem suporte quando a autenticação do Microsoft Entra está ativa (habilitada) no servidor lógico de origem ou de destino.

Monitorar o andamento da operação de cópia

Monitore o processo de cópia consultando as exibições sys.databases, sys.dm_database_copies e sys.dm_operation_status. Enquanto a cópia está em andamento, a coluna state_desc da exibição sys.databases do novo banco de dados é definida como COPYING.

  • Se a cópia falhar, a coluna state_desc da exibição sys.databases do novo banco de dados será definida como SUSPECT. Execute a instrução DROP no novo banco de dados e tente novamente mais tarde.
  • Se a cópia for bem-sucedida, a coluna state_desc da exibição sys.databases do novo banco de dados será definida como ONLINE. A cópia foi concluída e o novo banco de dados é um banco de dados normal, capaz de ser alterado de forma independente do banco de dados de origem.

Observação

Se você decidir cancelar a cópia enquanto ela estiver em andamento, execute a instrução DROP DATABASE no novo banco de dados.

Importante

Se você precisar criar uma cópia com um objetivo de serviço substancialmente menor do que a origem, o banco de dados de destino pode não ter recursos suficientes para concluir o processo de propagação e isso poderá fazer com que a operação de cópia falhe. Nesse cenário, use uma solicitação de restauração geográfica para criar uma cópia em um servidor diferente e/ou em uma região diferente. Para obter mais informações, consulte Recuperar um Banco de Dados SQL do Azure usando backups de banco de dados.

Funções e permissões do RBAC do Azure para gerenciar a cópia do banco de dados

Para criar uma cópia de banco de dados, você precisa estar nas seguintes funções:

  • Proprietário da assinatura ou ter
  • Função Colaborador do SQL Server ou
  • Função personalizada no servidor de origem com as seguintes permissões:
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write e
  • Função personalizada no servidor de destino com as seguintes permissões:
    • Microsoft.Sql/servers/read
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write

Para cancelar uma cópia de banco de dados, você precisa estar nas seguintes funções:

  • Proprietário da assinatura ou ter
  • Função Colaborador do SQL Server ou
  • Função personalizada nos bancos de dados de destino com a seguinte permissão:
    • Microsoft.Sql/servers/databases/delete

Para gerenciar a cópia do banco de dados usando o portal do Azure, você também precisa das seguintes permissões:

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

Para ver as operações sendo implantadas no grupo de recursos no portal e as operações de vários provedores de recursos, incluindo as operações SQL, é preciso ter estas funções adicionais:

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

Resolver logons

Depois que o novo banco de dados estiver online no servidor de destino, use a instrução ALTER USER para remapear os usuários do novo banco de dados para logons no servidor de destino. Para resolver usuários órfãos, confira Solução de problemas de usuários órfãos. Confira também Como gerenciar a segurança do Banco de Dados SQL do Azure após a recuperação de desastre.

Todos os usuários no novo banco de dados mantêm as permissões que tinham no banco de dados de origem. O usuário que iniciou a cópia do banco de dados se tornará o proprietário do novo banco de dados. Depois que a cópia for bem-sucedida e antes que outros usuários sejam remapeados, somente o proprietário do banco de dados poderá entrar no novo banco de dados.

Saiba mais sobre como gerenciar usuários e logons ao copiar um banco de dados para um servidor diferente em Como gerenciar a segurança do Banco de Dados SQL do Azure após a recuperação de desastre.

Erros de cópia de banco de dados

Os erros a seguir podem ser encontrados durante a cópia de um banco de dados no Banco de Dados SQL do Azure. Para saber mais, confira Copiar um Banco de Dados SQL do Azure.

Código do erro Severidade Descrição
40635 16 Cliente com endereço IP '%.*ls' desabilitado temporariamente.
40637 16 A criação da cópia do banco de dados está desabilitada no momento.
40561 16 Falha na cópia do banco de dados. O banco de dados de origem ou de destino não existe.
40562 16 Falha na cópia do banco de dados. O banco de dados de origem foi descartado.
40563 16 Falha na cópia do banco de dados. O banco de dados de destino foi descartado.
40564 16 Falha na cópia do banco de dados devido a um erro interno. Remova o banco de dados de destino e tente novamente.
40565 16 Falha na cópia do banco de dados. Não é permitida mais de uma cópia simultânea do banco de dados com a mesma origem. Remova o banco de dados de destino e tente novamente mais tarde.
40566 16 Falha na cópia do banco de dados devido a um erro interno. Remova o banco de dados de destino e tente novamente.
40567 16 Falha na cópia do banco de dados devido a um erro interno. Remova o banco de dados de destino e tente novamente.
40568 16 Falha na cópia do banco de dados. O banco de dados de origem tornou-se indisponível. Remova o banco de dados de destino e tente novamente.
40569 16 Falha na cópia do banco de dados. O banco de dados de destino tornou-se indisponível. Remova o banco de dados de destino e tente novamente.
40570 16 Falha na cópia do banco de dados devido a um erro interno. Remova o banco de dados de destino e tente novamente mais tarde.
40571 16 Falha na cópia do banco de dados devido a um erro interno. Remova o banco de dados de destino e tente novamente mais tarde.