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

適用対象:Azure SQL Database

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

Note

Microsoft Entra ID の、旧称は Azure Active Directory(Azure AD)です。

概要

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

Note

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

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

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

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

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

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

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

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

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

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

Azure Portal を使用したコピー

Azure portal を使用してデータベースをコピーするには、データベースのページを開き、[コピー] を選択して [SQL Database の作成 - データベースのコピー] ページを開きます。 データベースのコピー先となるターゲット サーバーの値を入力します。

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

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 を使用したコピー

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

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

Note

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

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

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

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

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

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

サーバー管理者のログイン、またはコピーするデータベースを作成したログインを使用して、master データベースにログインします。 データベースのコピーを成功させるには、サーバー管理者ではないログインが 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 ));

別のサーバーへのコピー

新しいデータベースを作成するターゲット サーバーの master データベースに接続します。 コピー元の サーバーのコピー元データベースのデータベース所有者と同じ名前とパスワードを持つログインを使用します。 また、ターゲット サーバーでのログインは、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; を実行します。

Note

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

同様に、以下のコマンドでは、サーバー 1 上の Database1 を、サーバー 2 上で pool2 という名のエラスティック プール内の 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 (SERVICE_OBJECTIVE = ELASTIC_POOL( name = pool2 ) );

別のサブスクリプションへのコピー

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

ヒント

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

--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 認証ログインを使用して対象サーバーにログインする場合にのみサポートされます。 ソースまたはターゲットの論理サーバーで Microsoft Entra 認証がアクティブ (有効) である場合は、別の 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と
  • 次の権限を持つターゲットサーバーのカスタムロール:
    • Microsoft.Sql/servers/read
    • Microsoft.Sql/servers/databases/read
    • Microsoft.Sql/servers/databases/write

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

  • サブスクリプションの所有者または
  • SQL Server 共同作成者ロールまたは
  • 次の権限を持つターゲットデータベース上のカスタムロール:
    • Microsoft.Sql/servers/databases/delete

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

  • 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 ステートメントを使用して、ユーザーを新しいデータベースからターゲット サーバーのログインに再マップします。 孤立したユーザーを解決するには、「 孤立ユーザーのトラブルシューティング」をご覧ください。 ディザスター リカバリー後に 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 データベースのコピーに失敗しました。内部エラーが発生しました。 ターゲット データベースを削除してやり直してください。