SQL Azure

注意事項

コピー元のSQL Azureサーバーとコピー先のSQL Azureサーバーは、同じDCを選択していますか?違うデータセンターの場合、次のエラーが発生し悩みまくります。

メッセージ 40532、レベル 11、状態 1、行 1
Cannot open server "lx88a7fkwl" requested by the login.  The login failed.

エラー内容から、異なるDC間でコピーしようとして失敗したっと気づくのは至難の業なのでご注意を。

コピー元SQL Azureサーバー

–① masterデータベースにログインを作成
CREATE LOGIN test WITH password=’P@ssw0rd’;
GO

–② コピー元データベースにユーザーを作成
CREATE USER test FROM LOGIN test;
GO

–③ コピー元データベースのユーザーにdb_onwerロールを付与
EXEC sp_addrolemember ‘db_owner’, ‘test’
GO

コピー先SQL Azureサーバー

–① masterデータベースにログインを作成
CREATE LOGIN test WITH password=’P@ssw0rd’;
GO

–② masterデータベースにユーザーを作成
CREATE USER test FROM LOGIN test;
GO

–③ ユーザーにロール付与
EXEC sp_addrolemember ‘dbmanager’, ‘test’;
GO

データベースのコピーを実行

–CREATE DATABASE コピー先データベース名 AS COPY OF (コピー元サーバ名).データベース名
–(例)
CREATE DATABASE test AS COPY OF rvpqy0fvb2.test

–実行状況の確認
SELECT * FROM sys.dm_database_copies

詳細

データベース・コピーを使用してSQL Azureデータベースをバックアップするを参照してください。

補足

コピーしたデータベースを運用するには、ログインとユーザーマッピングをし直す必要があるので、コピーだけして安心しないように。

SQL Azure

注意事項

コピー元のSQL Azureサーバーとコピー先のSQL Azureサーバーは、同じDCを選択していますか?違うデータセンターの場合、次のエラーが発生し悩みまくります。

メッセージ 40532、レベル 11、状態 1、行 1
Cannot open server "lx88a7fkwl" requested by the login.  The login failed.

エラー内容から、異なるDC間でコピーしようとして失敗したっと気づくのは至難の業なのでご注意を。

コピー元SQL Azureサーバー

–① masterデータベースにログインを作成
CREATE LOGIN test WITH password=’P@ssw0rd’;
GO

–② コピー元データベースにユーザーを作成
CREATE USER test FROM LOGIN test;
GO

–③ コピー元データベースのユーザーにdb_onwerロールを付与
EXEC sp_addrolemember ‘db_owner’, ‘test’
GO

コピー先SQL Azureサーバー

–① masterデータベースにログインを作成
CREATE LOGIN test WITH password=’P@ssw0rd’;
GO

–② masterデータベースにユーザーを作成
CREATE USER test FROM LOGIN test;
GO

–③ ユーザーにロール付与
EXEC sp_addrolemember ‘dbmanager’, ‘test’;
GO

データベースのコピーを実行

–CREATE DATABASE コピー先データベース名 AS COPY OF (コピー元サーバ名).データベース名
–(例)
CREATE DATABASE test AS COPY OF rvpqy0fvb2.test

–実行状況の確認
SELECT * FROM sys.dm_database_copies

詳細

データベース・コピーを使用してSQL Azureデータベースをバックアップするを参照してください。

SQL Azure Team Blog

Backing Up Your SQL Azure Database Using Database Copy – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

異なるSQL Azureサーバー間でDATABASE COPYを実行した も参照してください。

また記事内に誤りがありますので、コメント欄を参照してください。

SQL Azure Service Update 4のリリースで、SQL Azure上で動作しているデータベースのスナップショットを作成できるようになりました。

本番環境のデータベースを変更する前に簡単にバックアップを作成したり、本番環境のデータベースと同じテストデータベースを作成できるようになりました。

元のデータベースのダウンタイム無しでトランザクション・メカニズムを使用して、バックアップがSQL Azureデータセンターで実行されます。データベースは、同じデータセンター内に新しいデータベースに完全にコピーされます。同じデータセンター内の別のサーバにコピーするか、同じサーバの別のデータベース名にコピーするかを選択することができます。

コピープロセスで作成される新しいデータベースは、コピーが完了した時の時点で元のデータベースとのトランザクション一貫性があります。つまり、スナップショットのタイミングは、コピーを開始した時間では無く、コピーが終了した時間です。

事始め

次のようなT-SQLを使用します。

CREATE DATABASE destination_database_name
    AS COPY OF [source_server_name.]source_database_name

同じサーバーにAdventure Worksをコピーするために、次のようなクエリを実行します。

CREATE DATABASE [AdvetureWorksBackup] AS COPY OF [AdventureWorksLTAZ2008R2]

このコマンドは、コピー先のSQL Azureサーバーのmasterデータベースに接続して実行しなければなりません。

コピーのモニタリング

sys.dm_database_copiesと呼ばれる動的管理ビューを使用することで、データベースのコピー状況をモニタリングすることができます。クエリは次のようなものを使用します。

SELECT *
FROM sys.dm_database_copies

Adventure Worksのコピーの状況は次のように表示されます。

clip_image001

必要な権限

別のSQL Azureサーバーにデータベースをコピーするときは、コピー元のサーバーとコピー先のサーバーに、コマンドを実行するログインとパスワードが同じものが存在していなければなりません。コピー元のサーバーのログインには、db_owner権限が必要で、コピー先のサーバーのログインには、dbmanager権限が必要です。権限についての詳細情報はMSDNのドキュメント(Copying Databases in SQL Azure)を参照してください。

注意点は、コピー先のデータベースとコピー元のデータベースは同じサービスアカウント(Live ID)に所属している必要が無いということです。実際、あなたのデータベースをコピーコマンドを使用して、第三者のサーバーにコピーすることができます。

なぜ他のサーバーにコピーするのですか?

同じサーバーか、別のサーバーにデータベースをコピーした場合、同じデータセンター内で同じリソースを配分することになります。それぞれのサーバーは、同じエンドポイントですが、物理マシンは異なります。このことの詳細は、A Server Is Not a Machineにて説明しています。では、なぜ他のサーバーにコピーするのですか?その理由は2つあります。

  • 新しいデータベースでは、SQL Azureポータルの管理者アカウントを別の物にしたいときです。本番サーバーからテストサーバーにテストサーバーにデータベースをコピーした場合、テスト責任者がテストサーバーにデータベースを作成したり削除したりできるようにします。
  • 新しいデータベースの支払いを、別の支払い用のサービスアカウントに課金されるようにしたい時です。

まとめ

データベースコピーに関する追加情報は、MSDNのドキュメント(Copying Databases in SQL Azure)を参照してください。