Копирование транзакционно согласованной копии базы данных в SQL Azure

Применимо к:База данных SQL Azure

База данных SQL Azure предоставляет несколько методов для создания копии существующей базы данных на том же, или на другом сервере. Вы можете скопировать базу данных с помощью портал Azure, PowerShell, Azure CLI или Transact-SQL.

Примечание.

Идентификатор Microsoft Entra ранее был известен как Azure Active Directory (Azure AD).

Обзор

Копия базы данных — это транзакционно согласованный моментальный снимок базы данных-источника на определенный момент времени после инициирования запроса копирования. Для копии можно выбрать один и тот же или другой сервер. Кроме того, вы можете сохранить избыточность резервного копирования и размер вычислительных ресурсов исходной базы данных или использовать другой объем избыточности хранилища резервных копий и (или) вычислительных ресурсов на одном уровне служб. Существует несколько исключений, в которых можно скопировать базу данных уровня "Стандартный" или "Общего назначения", а базу данных уровня "Премиум" можно скопировать на уровень "Премиум" или критически важный для бизнеса. После завершения копирования копия становится полностью работоспособной и независимой базой данных. Управление именами для входа, пользователями и разрешениями в скопированной базе данных осуществляется независимо от базы данных-источника. Эта копия создается с помощью технологии георепликации. После завершения заполнения реплик связь георепликации автоматически прекращается. Все требования для использования георепликации применяются к операции копирования базы данных. Дополнительные сведения см. в разделе Общие сведения об активной георепликации.

Примечание.

Портал Azure, PowerShell и Azure CLI не поддерживают копирование базы данных в другую подписку.

Копирование базы данных для гипермасштабирования SQL Azure

Для гипермасштабирования SQL Azure целевая база данных определяет, является ли копия быстрой копией или копией данных размера.

  • Быстрая копия: когда копирование выполняется в том же регионе, что и источник, копия создается из моментальных снимков больших двоичных объектов, эта копия является быстрой операцией независимо от размера базы данных.

  • Копирование размера данных: если целевая база данных находится в другом регионе, отличном от исходного или если избыточность хранилища резервных копий базы данных (локальная, зональная, гео) от целевой базы данных отличается от исходной базы данных, операция копирования — это операция копирования с размером данных. Время копирования не пропорционально размеру, так как большие двоичные объекты сервера страницы копируются параллельно.

Имена входа в копии базы данных

При копировании базы данных на тот же сервер можно использовать для обеих баз данных одинаковые имена входа. Субъект безопасности, используемый для копирования базы данных, становится владельцем новой базы данных.

При копировании базы данных на другой сервер субъект безопасности, инициирующий операцию копирования на целевой сервер, становится владельцем новой базы данных.

Независимо от целевого сервера все пользователи базы данных, разрешения и идентификаторы безопасности (SID) копируются в копию базы данных. Использование пользователей автономной базы данных для доступа к данным гарантирует, что скопированная база данных будет иметь те же учетные данные пользователя. Таким образом, после завершения копирования можно немедленно получить доступ к базе данных, используя те же учетные данные.

Если для доступа к данным и копирования базы данных на другой сервер используются имена для входа на уровне сервера, то доступ на основе имени для входа может не работать. Это может произойти, так как имена входа не существуют на целевом сервере или так как эти пароли и идентификаторы безопасности (SID) отличаются. Дополнительные сведения об управлении именами входа при копировании базы данных на другой сервер см. в статье "Управление безопасностью База данных SQL Azure после аварийного восстановления". После успешного завершения копирования на другой сервер и до того, как другие пользователи будут восстановлены, только имя входа, связанное с владельцем базы данных, или администратор сервера могут войти в скопированную базу данных. Чтобы разрешить имена входа и установить доступ к данным после завершения операции копирования, смотрите Разрешение имен входа.

Копирование с помощью портала Azure

Чтобы скопировать базу данных с помощью портал Azure, откройте страницу базы данных, а затем нажмите кнопку "Копировать", чтобы открыть страницу "Создать База данных SQL- Копировать базу данных". Введите значения целевого сервера, в который нужно скопировать базу данных.

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

Копирование с помощью PowerShell или Azure CLI

Чтобы скопировать базу данных, используйте следующие примеры:

Для PowerShell используйте командлет New-AzSqlDatabaseCopy.

Внимание

Модуль PowerShell Azure Resource Manager по-прежнему поддерживается базой данных SQL Azure, но вся будущая разработка сосредоточена на модуле Az.Sql. Исправления ошибок для модуля AzureRM будут продолжать выпускаться как минимум до декабря 2020 г. Аргументы команд в модулях Az и AzureRm практически идентичны. Дополнительные сведения о совместимости см. в статье Знакомство с новым модулем Az для Azure PowerShell.

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

Копирование базы данных является асинхронной операцией, но целевая база данных создается сразу после принятия запроса. Если необходимо отменить операцию копирования во время выполнения, удалите целевую базу данных с помощью командлета Remove-AzSqlDatabase .

Полный пример сценария см. в статье Копирование базы данных на новый сервер.

Копирование с использованием Transact-SQL

Войдите в master базу данных с помощью имени входа администратора сервера или имени входа, создавшего базу данных, которую вы хотите скопировать. Для успешного копирования базы данных имена входа, которые не являются администратором сервера, должны быть членами роли dbmanager . Дополнительные сведения об именах для входа и подключении к серверу см. в статье Проверка подлинности и авторизация в базе данных SQL: предоставление доступа.

Начните копирование исходной базы данных с инструкции CREATE DATABASE ... AS COPY OF . Инструкция T-SQL продолжит выполнение до тех пор, пока операция копирования базы данных не будет завершена.

Примечание.

Завершение инструкции T-SQL не завершает операцию копирования базы данных. Чтобы завершить операцию, удалите целевую базу данных.

Копирование на тот же сервер

Войдите в master базу данных с помощью имени входа администратора сервера или имени входа, создавшего базу данных, которую вы хотите скопировать. Для успешного копирования базы данных имена входа, которые не являются администратором сервера, должны быть членами роли dbmanager .

Эта команда копирует Database1 в новую базу данных с именем Database2 на том же сервере. Операция копирования может занять некоторое время в зависимости от размера базы данных.

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

Копирование в эластичный пул

Войдите в master базу данных с помощью имени входа администратора сервера или имени входа, создавшего базу данных, которую вы хотите скопировать. Для успешного копирования базы данных имена входа, которые не являются администратором сервера, должны быть членами роли dbmanager .

Эта команда копирует Database1 в новую базу данных с именем Database2 в эластичном пуле с именем pool1. Операция копирования может занять некоторое время в зависимости от размера базы данных.

Database1 может быть одной или одной базой данных в пуле. Копирование между различными пулами уровней поддерживается, но некоторые межуровневые копии завершаются сбоем. Например, можно скопировать одну или эластичную стандартную базу данных в пул общего назначения, но вы не можете скопировать стандартную эластичную базу данных в пул класса Premium.

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

Копирование на другой сервер

master Подключение в базу данных целевого сервера, где будет создана новая база данных. Используйте имя входа с таким же именем и паролем, как у владельца базы данных-источника на исходном сервере. Имя входа на целевом сервере также должно быть членом роли dbmanager или именем администратора сервера.

Эта команда копирует Database1 сервер1 в новую базу данных с именем Database2 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;

Внимание

Брандмауэры обоих серверов должны разрешать входящие подключения от IP-адреса клиента, который выдал команду T-SQL CREATE DATABASE ... AS COPY OF. Чтобы определить исходный IP-адрес текущего подключения, выполните SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID;

Примечание.

Копирование базы данных с помощью T-SQL не поддерживается при подключении к целевому серверу через частную конечную точку. Если частная конечная точка настроена, но доступ к общедоступной сети разрешен, копия базы данных поддерживается при подключении к целевому серверу с общедоступного IP-адреса с помощью проверки подлинности SQL. После завершения операции копирования в общем доступе может быть отказано.

Аналогичным образом приведенная ниже команда копирует Database1 на сервер1 новую базу данных с именем Database2 в эластичном пуле с именем pool2 на сервере 2.

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

Копирование в другую подписку

Вы можете выполнить действия, описанные в разделе копирование базы данных SQL Microsoft Azure в другой сервер, чтобы скопировать базу данных на сервер в другой подписке с помощью T-SQL. Используйте имя входа с таким же именем и паролем, как у владельца базы данных-источника. Кроме того, имя входа должно быть членом роли dbmanager или администратора сервера как на исходных, так и на целевых серверах.

Совет

При копировании баз данных в одном клиенте Идентификатора Microsoft Entra авторизация на исходных и целевых серверах упрощается, если вы инициируете команду копирования с использованием имени входа проверки подлинности с достаточным доступом на обоих серверах. Минимальный необходимый уровень доступа — членство в роли dbmanager в master базе данных на обоих серверах. Например, можно использовать имя входа Идентификатора Microsoft Entra, являющегося членом группы, назначенной администратором сервера на обоих серверах.

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

Совет

Копирование базы данных с помощью T-SQL поддерживает копирование базы данных из подписки другого клиента Azure. Это поддерживается только при использовании имени входа для проверки подлинности SQL для входа на целевой сервер. Создание копии базы данных на логическом сервере в другом клиенте Azure не поддерживается, если проверка подлинности Microsoft Entra активна (включена) на исходном или целевом логическом сервере.

Отслеживание хода операции копирования

Следить за ходом процесса копирования можно путем запроса к представлениям sys.databases, sys.dm_database_copies и sys.dm_operation_status. Пока выполняется копирование, state_desc для новой базы данных задан COPYINGстолбец sys.databases представления.

  • Если копирование завершается ошибкой, state_desc для новой базы данных задан SUSPECTстолбец sys.databases представления. Выполните инструкцию DROP для новой базы данных и повторите попытку позднее.
  • Если копирование выполнено успешно, state_desc для новой базы данных задан ONLINEстолбец sys.databases представления. Это означает, что копирование завершено и новая база данных является обычной базой данных, которую можно изменять независимо от исходной.

Примечание.

Если вы решите отменить копирование во время его выполнения, выполните инструкцию DROP DATABASE в новой базе данных.

Внимание

Если необходимо создать копию с существенно меньшим уровнем обслуживания, чем у источника, то целевая база данных может не иметь достаточных ресурсов для завершения процесса заполнения, что может привести к сбою операции копирования. В этом сценарии для создания копии на другом сервере и (или) другом регионе используется запрос географического восстановления. Дополнительные сведения см. в статье "Восстановление База данных SQL Azure с помощью резервных копий базы данных".

Роли и разрешения RBAC Azure для управления копированием базы данных

Чтобы создать копию базы данных, необходимо иметь следующие роли:

  • владельца подписки или
  • Роль участника SQL Server или
  • Настраиваемая роль на исходном сервере со следующими разрешениями:
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/database/write и
  • Настраиваемая роль на целевом сервере со следующими разрешениями:
    • Microsoft.Sql/servers/read
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write

Чтобы отменить копию базы данных, необходимо иметь следующие роли:

  • владельца подписки или
  • Роль участника SQL Server или
  • Пользовательская роль в целевой базе данных с следующим разрешением:
    • Microsoft.Sql/servers/databases/delete

Для управления копированием базы данных с помощью портал Azure также требуются следующие разрешения:

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

Если вы хотите просмотреть операции, выполняемые в развернутых группах ресурсов на портале, операции между несколькими поставщиками ресурсов, включая операции SQL, вам потребуются следующие дополнительные разрешения:

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

Разрешение имен для входа

После того как новая база данных на целевом сервере будет в сети, сопоставьте пользователей из новой базы данных с именами входа на целевом сервере с помощью оператора ALTER USER. Сведения о разрешении потерянных пользователей см. в разделе Диагностика пользователей, утративших связь с учетной записью. Ознакомьтесь также со статьей Как настроить безопасность базы данных SQL Azure после аварийного восстановления.

Все пользователи в новой базе данных получают такие же разрешения, как и в исходной базе данных. Пользователь, инициировавший копирование базы данных, становится владельцем новой базы данных. После успешного копирования и перед повтором других пользователей только владелец базы данных может войти в новую базу данных.

Дополнительные сведения об управлении пользователями и именами входа при копировании базы данных на другой сервер см. в статье Как настроить безопасность базы данных SQL Azure после аварийного восстановления.

Ошибки копирования базы данных

При копировании базы данных в базе данных SQL Azure могут возникнуть следующие ошибки. Дополнительные сведения см. в статье Копирование базы данных SQL Azure.

Код ошибки Статус Description
40635 16 Клиент с IP-адресом "%.*ls" временно отключен.
40637 16 Возможность создания копии базы данных в настоящее время отключена.
40561 16 Не удалось скопировать базу данных. Исходная или целевая база данных не существует.
40562 16 Не удалось скопировать базу данных. Исходная база данных удалена.
40563 16 Не удалось скопировать базу данных. Целевая база данных удалена.
40564 16 Произошел сбой при копировании базы данных из-за внутренней ошибки. Удалите целевую базу данных и повторите попытку.
40565 16 Не удалось скопировать базу данных. Допускается не более одной одновременной операции копирования базы данных из одного источника. Удалите целевую базу данных и повторите попытку позднее.
40566 16 Произошел сбой при копировании базы данных из-за внутренней ошибки. Удалите целевую базу данных и повторите попытку.
40567 16 Произошел сбой при копировании базы данных из-за внутренней ошибки. Удалите целевую базу данных и повторите попытку.
40568 16 Не удалось скопировать базу данных. Исходная база данных стала недоступна. Удалите целевую базу данных и повторите попытку.
40569 16 Не удалось скопировать базу данных. Целевая база данных стала недоступна. Удалите целевую базу данных и повторите попытку.
40570 16 Произошел сбой при копировании базы данных из-за внутренней ошибки. Удалите целевую базу данных и повторите попытку позднее.
40571 16 Произошел сбой при копировании базы данных из-за внутренней ошибки. Удалите целевую базу данных и повторите попытку позднее.