適用対象:Azure SQL データベース
Azure SQL Database には、同じ Azure SQL Database 論理サーバーまたは別の論理サーバー上に既存の データベース のコピーを作成するためのいくつかの方法が用意されています。 Azure Portal、PowerShell、Azure CLI、または Transact-SQL を使って、データベースをコピーできます。
注意
Microsoft Entra ID の、旧称は Azure Active Directory(Azure AD)です。
概要
データベースのコピーは、コピー要求が開始された時点でのソース データベースのトランザクション上一貫性のあるスナップショットになります。 コピー用に同じ論理サーバーまたは別の論理サーバーを選択できます。 また、ソース データベースのバックアップの冗長性とコンピューティング サイズを維持するか、同じサービス レベル内で別のバックアップ ストレージの冗長性とコンピューティング サイズ、またはそのいずれかを使用することもできます。 Standard サービス レベルのデータベースを Standard レベルまたは General Purpose レベルにコピーでき、プレミアム サービス レベルのデータベースを プレミアム または Business Critical レベルにコピーできます。
コピーが完了すると、新しいデータベースは、ソース データベースに対して完全に機能し、独立したデータベースになります。 コピーしたデータベースのログイン、ユーザー、およびアクセス許可は、ソース データベースとは別に管理されます。 コピーは geo レプリケーション テクノロジを使用して作成されます。 レプリカのシード処理が完了すると、geo レプリケーション リンクは自動的に終了します。 geo レプリケーションを使用するためのすべての要件が、データベースのコピー操作に適用されます。 詳細については、「アクティブ geo レプリケーションの作成と使用」を参照してください。
注意
Azure portal、PowerShell、および Azure CLI は、別のサブスクリプションへのデータベースのコピーをサポートしていません。
Hyperscale データベースのデータベース コピー
Hyperscale サービス レベルのデータベースでは、ターゲット データベースによって、コピーが高速コピーとデータ サイズ コピーのどちらになるかが決定されます。
高速コピー: コピーがソースと同じリージョンで行われると、BLOB のスナップショットからコピーが作成されます。このコピー操作は、データベースのサイズに関係なく高速に行われます。
データ コピーのサイズ: ターゲット データベースがソースとは異なるリージョンにある場合、またはターゲットのデータベースのバックアップ ストレージの冗長性 (ローカル、ゾーン、Geo) がソース データベースと異なる場合、コピー操作はデータ サイズの操作になります。 コピー時間は、ページ サーバー BLOB が並列コピーされるときのように、サイズと直接比例しません。
データベースのコピーへのログイン
データベースを同じ論理サーバーにコピーする場合、両方のデータベースで同じログインを使用できます。 データベースをコピーするために使うセキュリティ プリンシパルが、新しいデータベースのデータベース所有者になります。
データベースを別の論理サーバーにコピーすると、ターゲット論理サーバーでコピー操作を開始したセキュリティ プリンシパルが新しいデータベースの所有者になります。
ターゲットサーバーに関係なく、すべてのデータベース ユーザー、アクセス許可、およびセキュリティ識別子 (SID) がデータベースのコピーにコピーされます。 データ アクセスに 包含データベース ユーザー を使用すると、コピーしたデータベースのユーザー資格情報が同じであることが確認されます。これにより、コピーの完了後すぐに同じ資格情報でアクセスできるようになります。
データ アクセスにサーバー レベルのログインを使用し、別のサーバーにデータベースをコピーする場合、ログイン ベースのアクセスが機能しない可能性があります。 これは、ログインがターゲット論理サーバーに存在しないか、パスワードとセキュリティ識別子 (SID) が異なっているために発生する可能性があります。 データベースを別のサーバーにコピーするときのログインの管理の詳細については、「 geo リストアまたはフェールオーバーのための Azure SQL Database セキュリティの構成と管理」を参照してください。 別の論理サーバーへのコピー操作が成功し、他のユーザーが再マップされる前に、データベース所有者に関連付けられているログインのみ、またはサーバー管理者がコピーしたデータベースにサインインできます。 コピー操作の完了後にログインを解決し、データ アクセスを確立する方法については、「ログインの解決」をご参照ください。
データベースをコピーする
PowerShell、Azure CLI、または Transact-SQL (T-SQL) を使って、データベースをコピーできます。
Azure portal を使用してデータベースをコピーするには、データベースのページを開き、[コピー] を選択して [SQL Database の作成 - データベースのコピー] ページを開きます。 データベースのコピー先となるターゲット論理サーバーの値を入力します。
Transact-SQL を使用してデータベースをコピーする
サーバー管理者ログインまたはコピーするデータベースを作成したログインを使用して、 master データベースにサインインします。 データベースのコピーを成功させるには、サーバー管理者ではないログインが dbmanager ロールのメンバーによるものである必要があります。 ログインと論理サーバーへの接続の詳細については、「 データベース アクセスの承認」を参照してください。
CREATE DATABASE AS COPY OF ... ステートメントを使用して、ソース データベースのコピーを開始します。 T-SQL ステートメントは、データベースのコピー操作が完了するまで実行を続けます。
このセクションでは、次の操作 Transact-SQL コマンドについて説明します。
注意
T-SQL ステートメントを終了しても、データベース コピー操作は終了しません。 操作を終了するには、ターゲット データベースを削除します。
同じ論理サーバーにコピーする
サーバー管理者ログインまたはコピーするデータベースを作成したログインを使用して、 master データベースにサインインします。 データベースのコピーを成功させるには、サーバー管理者ではないログインが dbmanager ロールのメンバーによるものである必要があります。
このコマンドは、同じ論理サーバー上の Database2 という名前の新しいデータベースにDatabase1をコピーします。 データベースのサイズに応じて、コピー操作の完了に時間がかかる場合があります。
-- 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 logical 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;
注意
プライベート エンドポイント経由で宛先論理サーバーに接続する場合、T-SQL を使用したデータベース コピーはサポートされません。 プライベート エンドポイントが構成されているが、パブリック ネットワーク アクセスが許可されている場合、SQL 認証を使用してパブリック IP アドレスから宛先論理サーバーに接続すると、データベース コピーがサポートされます。 コピー操作が完了したら、パブリック アクセスを拒否してください。
同様に、次のコマンドは、server1のDatabase1を、server2の pool2 というエラスティック プール内の Database2 という名前の新しいデータベースにコピーします。
-- Execute on the master database of the target logical server (server2) to start copying from Server1 to Server2
CREATE DATABASE Database2 AS COPY OF server1.Database1 (SERVICE_OBJECTIVE = ELASTIC_POOL( name = pool2 ) );
別のサブスクリプションへのコピー
「 SQL Database を別の論理サーバーにコピーする 」セクションの手順を使用して、T-SQL を使用して別のサブスクリプションの論理サーバーにデータベースをコピーできます。 ソース データベースのデータベース所有者と同じ名前とパスワードを持つログインを使用していることを確認します。 さらに、ログインは、ソースとターゲットの両方の論理サーバーの dbmanager ロールまたはサーバー管理者のメンバーである必要があります。
ヒント
同じ Microsoft Entra ID テナント内のデータベースをコピーする場合、両方の論理サーバーで十分なアクセス権を持つ認証ログインを使用してコピー コマンドを開始すると、ソースと宛先の論理サーバーでの承認が簡略化されます。 最低限必要なアクセス レベルは、両方の論理サーバー上の master データベースの dbmanager ロールのメンバーシップです。 たとえば、両方の論理サーバーのサーバー管理者として指定されたグループのメンバーである Microsoft Entra ID ログインを使用できます。
次のスクリプトでは、コピーするログイン名が loginname。
まず、ソース論理サーバーの master データベースに接続します。 ソース Azure SQL Database 論理サーバーの master データベースにログインとユーザーを作成します。
--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
ソース ユーザー データベースに接続します。 次に、ソース ユーザー データベースで、ソース データベースにユーザーを作成し、データベースの dbowner データベース ロールに追加します。
--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
次に、ソース論理サーバーの master データベースからユーザー loginnameのセキュリティ識別子 (SID) を見つけます。
--Step# 3
--Capture the SID of the user "loginname" from master database
SELECT [sid] FROM sysusers WHERE [name] = 'loginname';
新しい論理サーバーまたはコピー先の論理サーバーの master データベースで次のスクリプトを実行します。 まず、コピー先の論理サーバーの master データベースにログインとユーザーを作成し、それを dbmanager サーバー ロールに追加します。 
              <strong password>を指定し、<SID of loginname login on source server>をソース論理サーバーの SID に置き換えます。
--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 = '<strong password>', 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
コピー先の論理サーバーの master データベースで、新しいデータベースを作成します。 
              new_database_nameを目的の名前に置き換えます。 
              source_server_nameとsource_database_nameをソースの名前に置き換えます。
--Step# 5
--Execute the copy of database script from the destination logical server using the credentials created
CREATE DATABASE new_database_name
AS COPY OF source_server_name.source_database_name;
ヒント
別の Azure テナントのサブスクリプションからデータベースをコピーすることは、T-SQL と SQL 認証ログインを使用してターゲット論理サーバーにサインインする場合にのみサポートされます。 Azure SQL の Microsoft Entra 認証では、別の Azure テナント内の論理サーバーにデータベース コピーを作成することはできません。
コピー操作の進行状況の監視
              の に対してクエリを実行してコピー処理を監視し、 sys. dm_database_copies、dm_operation_status を表示します。 コピーの進行中は、新しいデータベースの state_desc ビューの sys.databases 列は COPYING に設定されます。
- コピーに失敗した場合は、新しいデータベースの 
state_descビューのsys.databases列はSUSPECTに設定されます。 新しいデータベースに対して DROP ステートメントを実行した後でもう一度やり直してください。 - コピーに成功した場合は、新しいデータベースの 
state_descビューのsys.databases列がONLINEに設定されます。 コピー操作は完了しています。新しいデータベースは通常のデータベースであり、コピー元データベースから独立して変更することができます。 
注意
進行中のコピー操作を取り消すには、新しいデータベースに対して DROP DATABASE ステートメントを実行します。
重要
ソースよりも非常に小さいサービス目標を使用してコピーを作成する必要がある場合、ターゲット データベースには、シード処理を完了するための十分なリソースがない可能性があります。これにより、コピー操作が失敗する可能性があります。 このシナリオでは、geo リストア要求を使用して、別の論理サーバーまたは別のリージョンにコピーを作成します。 詳細については、「データベースのバックアップを使用した Azure SQL Database の復旧」を参照してください。
アクセス許可
データベースのコピーを作成するには、次のロールが必要です:
- サブスクリプションの所有者または
 - SQL Server 共同作成者ロールまたは
 - 次のアクセス許可を持つソース論理サーバーのカスタム ロール: 
Microsoft.Sql/servers/databases/read- 
              
Microsoft.Sql/servers/databases/writeそして 
 - 次のアクセス許可を持つターゲット論理サーバーのカスタム ロール: 
Microsoft.Sql/servers/readMicrosoft.Sql/servers/databases/readMicrosoft.Sql/servers/databases/write
 
データベースのコピーを取り消すには、次のロールが必要です:
- サブスクリプションの所有者または
 - SQL Server 共同作成者ロールまたは
 - 次の権限を持つターゲットデータベース上のカスタムロール:
Microsoft.Sql/servers/databases/delete
 
Azure portal を使用してデータベースのコピーを管理するには、以下のアクセス許可も必要です。
Microsoft.Resources/subscriptions/resources/readMicrosoft.Resources/deployments/readMicrosoft.Resources/deployments/writeMicrosoft.Resources/deployments/operationstatuses/read
ポータルでリソース グループのデプロイの下の操作と、SQL 操作を含む、複数のリソースプロバイダーにまたがる操作を表示するには、これらの追加アクセス許可が必要です。
Microsoft.Resources/subscriptions/resourcegroups/deployments/operations/readMicrosoft.Resources/subscriptions/resourcegroups/deployments/operationstatuses/read
ログインの解決
新しいデータベースがターゲット論理サーバー上でオンラインになってから、 ALTER USER ステートメントを使用して、新しいデータベースのユーザーをターゲット論理サーバー上のログインに再マップします。 孤立したユーザーを解決するには、「 孤立ユーザーのトラブルシューティング」をご覧ください。 geo リストアまたはフェールオーバーのための Azure SQL Database セキュリティの構成と管理も参照してください。
新しいデータベースのすべてのユーザーのアクセス許可は、コピー元データベースで保持していたものと同じです。 データベースのコピーを開始したユーザーが、新しいデータベースのデータベース所有者になります。 コピーが成功した後、他のユーザーが再マップされる前に、データベース所有者のみが新しいデータベースにサインインできます。
データベースを別の論理サーバーにコピーするときのユーザーとログインの管理については、「 geo リストアまたはフェールオーバーのための 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 | データベースのコピーに失敗しました。内部エラーが発生しました。 ターゲット データベースを削除してやり直してください。 |