トランザクション上一貫性のある Azure SQL Database のデータベースのコピーを作成する

適用対象: Azure SQL Database

Azure SQL Database では、同じサーバーまたは別のサーバーのいずれかに、既存のデータベースのコピーを作成するための複数の方法が用意されています。 Azure Portal、PowerShell、Azure CLI、または T-SQL を使って、データベースをコピーできます。

概要

データベースのコピーは、コピー要求が開始された時点でのソース データベースのトランザクション上一貫性のあるスナップショットになります。 コピーには、同じサーバーまたは別のサーバーを選択できます。 また、ソース データベースのバックアップの冗長性、サービス レベル、およびコンピューティング サイズを維持するか、同じまたは異なるサービス レベル内で別のバックアップ ストレージの冗長性とコンピューティング サイズ、またはそのいずれかを使用することもできます。 コピーの完了後、コピーは完全に機能する独立したデータベースになります。 コピーしたデータベースのログイン、ユーザー、およびアクセス許可は、ソース データベースとは別に管理されます。 コピーは geo レプリケーション テクノロジを使用して作成されます。 レプリカのシード処理が完了すると、geo レプリケーション リンクは自動的に終了します。 geo レプリケーションを使用するためのすべての要件が、データベースのコピー操作に適用されます。 詳細については、「アクティブ geo レプリケーションの作成と使用」を参照してください。

Azure SQL Hyperscale のデータベース コピー

Azure SQL Hyperscale では、ターゲット データベースによって、コピーが高速コピーかデータ コピーのサイズであるかが決定されます。

高速コピー: コピーがソースと同じリージョンで行われると、BLOB のスナップショットからコピーが作成されます。このコピー操作は、データベースのサイズに関係なく高速に行われます。

データ コピーのサイズ: ターゲット データベースがソースとは異なるリージョンにある場合、またはターゲットのデータベースのバックアップ ストレージの冗長性 (ローカル、ゾーン、Geo) がソース データベースと異なる場合、コピー操作はデータ操作のサイズになります。 コピー時間は、ページ サーバー BLOB が並列コピーされるときのように、サイズと直接比例しません。

データベースのコピーへのログイン

データベースを同じサーバーにコピーすると、両方のデータベースで同じログインを利用できます。 データベースをコピーするために使うセキュリティ プリンシパルが、新しいデータベースのデータベース所有者になります。

データベースを別のサーバーにコピーすると、ターゲット サーバーでコピー操作を開始したセキュリティ プリンシパルが、新しいデータベースの所有者になります。

ターゲットサーバーに関係なく、すべてのデータベース ユーザー、そのアクセス許可、およびそれらのセキュリティ識別子 (SID) がデータベースのコピーにコピーされます。 データ アクセスに 包含データベース ユーザー を使用すると、コピーしたデータベースのユーザー資格情報が同じであることが確認されます。これにより、コピーの完了後すぐに同じ資格情報でアクセスできるようになります。

データ アクセスにサーバー レベルのログインを使用し、別のサーバーにデータベースをコピーする場合、ログイン ベースのアクセスが機能しない可能性があります。 これは、ログインがターゲット サーバーに存在しないか、パスワードとセキュリティ識別子 (SID) が異なるために発生する場合があります。 別のサーバーにデータベースをコピーする場合のログイン管理の詳細については、ディザスター リカバリー後に Azure SQL Database のセキュリティを管理する方法に関するページをご覧ください。 別のサーバーへのコピー操作が成功した後、他のユーザーが再マップされる前に、データベース所有者に関連付けられているログインのみ、またはサーバー管理者がコピーしたデータベースにログインできます。 コピー操作の完了後にログインを解決し、データ アクセスを確立する方法については、「ログインの解決」をご参照ください。

Azure Portal を使用したコピー

Azure Portal を使ってデータベースをコピーするには、データベースのページを開き、 [コピー] をクリックします。

Database copy

PowerShell または Azure CLI を使用したコピー

データベースをコピーするには、次の例を使用します。

PowerShell の場合、New-AzSqlDatabaseCopy コマンドレットを使用します。

重要

PowerShell Azure Resource Manager (RM) モジュールは Azure SQL Database で引き続きサポートされますが、今後の開発はすべて Az.Sql モジュールを対象に行われます。 AzureRM モジュールのバグ修正は、少なくとも 2020 年 12 月までは引き続き受け取ることができます。 Az モジュールと AzureRm モジュールのコマンドの引数は実質的に同じです。 その互換性の詳細については、「新しい Azure PowerShell Az モジュールの概要」を参照してください。

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

データベースのコピーは非同期操作ですが、要求が受け入れられた直後にターゲット データベースが作成されます。 まだ進行中のコピー操作を取り消す必要がある場合は、Remove-AzSqlDatabase コマンドレットを使用してターゲット データベースをドロップします。

完全な PowerShell のサンプル スクリプトについては、「新しいサーバーにデータベースをコピーする」をご覧ください。

Transact-SQL を使用したコピー

サーバー管理者のログイン、またはコピーするデータベースを作成したログインを使用して、マスター データベースにログインします。 データベースのコピーを成功させるには、サーバー管理者ではないログインが dbmanager ロールのメンバーによるものである必要があります。 ログインおよびサーバーへの接続の詳細については、 ログインの管理に関するページを参照してください。

CREATE DATABASE AS COPY OF ... ステートメントを使用して、ソース データベースのコピーを開始します。 T-SQL ステートメントは、データベースのコピー操作が完了するまで実行を続けます。

Note

T-SQL ステートメントを終了しても、データベース コピー操作は終了しません。 操作を終了するには、ターゲット データベースを削除します。

T-SQL を使用したデータベース コピーは、プライベート エンドポイント経由で宛先サーバーに接続するときはサポートされません。 プライベート エンドポイントが構成されているが、パブリック ネットワーク アクセスが許可されている場合、パブリック IP アドレスからコピー先サーバーに接続されているとき、データベース コピーはサポートされます。 コピー操作が完了したら、パブリック アクセスを拒否してください。

重要

T-SQL CREATE DATABASE ...AS COPY OF コマンドを使用する際に、バックアップ ストレージの冗長性を選択することはできません。

同じサーバーにコピーする

サーバー管理者のログイン、またはコピーするデータベースを作成したログインを使用して、マスター データベースにログインします。 データベースのコピーを成功させるには、サーバー管理者ではないログインが dbmanager ロールのメンバーによるものである必要があります。

このコマンドは、Database1 を、同じサーバー上の Database2 という名前の新しいデータベースにコピーします。 データベースのサイズに応じて、コピー操作の完了に時間がかかる場合があります。

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

エラスティック プールにコピーする

サーバー管理者のログイン、またはコピーするデータベースを作成したログインを使用して、マスター データベースにログインします。 データベースのコピーを成功させるには、サーバー管理者ではないログインが dbmanager ロールのメンバーによるものである必要があります。

このコマンドは、Database1 を、pool1 という名前のエラスティック プール内の Database2 という名前の新しいデータベースにコピーします。 データベースのサイズに応じて、コピー操作の完了に時間がかかる場合があります。

Database1 には、単一データベースまたはプールされたデータベースを指定できます。 異なる層のプール間のコピーはサポートされていますが、一部の層間のコピーは成功しません。 たとえば、単一またはエラスティックの Standard データベースは汎用プールにコピーできますが、エラスティックの Standard データベースを Premium プールにコピーすることはできません。

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

別のサーバーへのコピー

新しいデータベースを作成するターゲット サーバーのマスター データベースにログインします。 コピー元の サーバーのコピー元データベースのデータベース所有者と同じ名前とパスワードを持つログインを使用します。 また、ターゲット サーバーでのログインは、dbmanager ロールのメンバーであるか、またはサーバー管理者のログインである必要があります。

このコマンドは、server1 上の Database1 を、server2 上の Database2 という新しいデータベースにコピーします。 データベースのサイズに応じて、コピー操作の完了に時間がかかる場合があります。

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

重要

両方のサーバーのファイアウォールは、T-SQL CREATE DATABASE ...AS COPY OF コマンドを発行するクライアントの IP からの受信接続を許可するように構成する必要があります。 現在の接続の送信元 IP アドレスを確認するには、SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID; を実行します。

同様に、以下のコマンドでは、サーバー 2 のプール 2 という名前のエラスティック プール内でサーバー 1 のデータベース 1 がデータベース 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 データベースを別のサーバーにコピーする」セクションの手順を使用して、T-SQL を使用して別のサブスクリプションでサーバーにデータベースをコピーできます。 ソース データベースのデータベース所有者と同じ名前とパスワードを持つログインを使用していることを確認します。 また、ログインは、ソース サーバーとターゲット サーバーの両方で、dbmanager ロールまたはサーバー管理者のメンバーである必要があります。

ヒント

同じ Azure Active Directory テナント内のデータベースをコピーするときに、移行元サーバーと移行先サーバーで十分なアクセス権を持つ AAD 認証ログインを使用してコピー コマンドを開始すると、両方のサーバーでの承認が簡略化されます。 必要最小限のアクセス レベルは、両方のサーバーのマスター データベースでの dbmanager ロールのメンバーシップです。 たとえば、両方のサーバーのサーバー管理者として指定された AAD グループのメンバーである AAD ログインを使用できます。

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

Note

Azure portal、PowerShell、および Azure CLI は、別のサブスクリプションへのデータベースのコピーをサポートしていません。

ヒント

T-SQL を使用するデータベースのコピーでは、異なる Azure テナント内のサブスクリプションからのデータベースのコピーがサポートされています。 これは、SQL 認証ログインを使用して対象サーバーにログインする場合にのみサポートされます。 ソースまたはターゲットのどちらかの論理サーバー上で Azure Active Directory 認証がアクティブ (有効) になっている場合、別の Azure テナント内の論理サーバー上でのデータベース コピーの作成はサポートされていません。

コピー操作の進行状況を監視する

に対してクエリを実行してコピー処理を監視し、 sys. dm_database_copiesdm_operation_status を表示します。 コピー操作の進行中は、新しいデータベースの sys.databases ビューの state_desc 列が COPYING に設定されます。

  • コピー操作が失敗すると、新しいデータベースの sys.databases ビューの state_desc 列が SUSPECT に設定されます。 新しいデータベースに対して DROP ステートメントを実行した後でもう一度やり直してください。
  • コピー操作が成功すると、新しいデータベースの sys.databases ビューの state_desc 列が ONLINE に設定されます。 コピー操作は完了しています。新しいデータベースは通常のデータベースであり、コピー元データベースから独立して変更することができます。

Note

進行中のコピー操作を取り消すには、新しいデータベースに対して DROP DATABASE ステートメントを実行します。

重要

ソースよりも非常に小さいサービス目標を使用してコピーを作成する必要がある場合、ターゲット データベースには、シード処理を完了するための十分なリソースがない可能性があります。これにより、コピー操作が失敗する可能性があります。 このシナリオでは、geo リストア要求を使用して、別のサーバーや別のリージョンにコピーを作成します。 詳細については、データベースのバックアップを使用した Azure SQL Database の復旧に関するページを参照してください。

データベース コピーを管理するための Azure RBAC のロールとアクセス許可

データベースのコピーを作成するには、次のロールが必要です

  • サブスクリプションの所有者または

  • SQL Server 共同作成者ロールまたは

  • 次のアクセス許可を持つ、ソース データベースとターゲット データベースのカスタム ロール:

    Microsoft.Sql/servers/databases/read Microsoft.Sql/servers/databases/write

データベースのコピーを取り消すには、次のロールが必要です

  • サブスクリプションの所有者または

  • SQL Server 共同作成者ロールまたは

  • 次のアクセス許可を持つ、ソース データベースとターゲット データベースのカスタム ロール:

    Microsoft.Sql/servers/databases/read Microsoft.Sql/servers/databases/write

Azure portal を使用してデータベースのコピーを管理するには、以下のアクセス許可も必要です。

Microsoft.Resources/subscriptions/resources/read Microsoft.Resources/subscriptions/resources/write 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 ステートメントを使用して、ユーザーを新しいデータベースからターゲット サーバーのログインに再マップします。 孤立したユーザーを解決するには、「 孤立ユーザーのトラブルシューティング」をご覧ください。 ディザスター リカバリー後に Azure SQL Database のセキュリティを管理する方法に関するページもご覧ください。

新しいデータベースのすべてのユーザーのアクセス許可は、コピー元データベースで保持していたものと同じです。 データベースのコピーを開始したユーザーが、新しいデータベースのデータベース所有者になります。 コピーが成功した後、他のユーザーが再マップされる前に、データベース所有者のみが新しいデータベースにログインできます。

別のサーバーにデータベースをコピーする場合のユーザーおよびログインの管理の詳細については、ディザスター リカバリー後に Azure SQL Database のセキュリティを管理する方法に関するページをご覧ください。

データベース コピー エラー

次のエラーは、Azure SQL Database でデータベースをコピーしているときに発生する可能性があります。 詳細については、「 Azure SQL Database のコピー」を参照してください。

エラー コード 重大度 説明
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 データベースのコピーに失敗しました。内部エラーが発生しました。 ターゲット データベースを削除してやり直してください。

次のステップ