web-dev-qa-db-ja.com

SQLサーバーのfile_guidを新しいGUIDに置き換える方法はありますか?

同じfile_guidを持つ2つのデータベースがあります。 Amazon RDSで2番目のデータベースを復元しようとすると、次のエラーが発生します。

タスクの失敗または同時RESTORE_DB要求が原因でタスクが中止されました。タスクID 8(RESTORE_DB)例外:インスタンスに同じfile_guidsの既存のデータベースがすでに存在するため、データベースDATABASENAMEを復元できません。

これは、同じfile_guidを使用して別のデータベースを既に復元しているためです(ただし、physical_nameは異なります)。これは、Amazon RDSの制限です。興味があれば herehere で詳細を見つけてください。

Query result on sys.database_files

Sys.database_filesレコードを更新するにはどうすればよいですか?

6
Shahdat

データベースを新しいデータベースにコピーして、名前とファイルIDを同時に変更したかったので、同じことをしなければなりませんでした。

ここに投稿された元のプロセスは再現性がないことがわかりました。これは、元のファイルIDがどのように作成されたかに依存すると思います。いずれにしても、私は次の手順を更新しましたが、これは繰り返し可能です。

  1. 標準のRDSデータベースバックアップを使用して、RDSからS3にデータベースをバックアップします。

    exec msdb.dbo.rds_backup_database
    @source_db_name = '<database-name>',
    @s3_arn_to_backup_to = 'arn:aws:s3:::<bucket-name>/<backup-filename>'
    
  2. ローカルマシンのSQL Serverに.bakファイルを復元します。私たちはMSDNアカウントを持っているので、SQL 2016をダウンロードしてインストールし、ローカルマシン上のSQLへのフルアクセスを提供しています。ただし、SQL Expressをダウンロードして同じように実行できると思います。SQLエンジンのソースバージョンによっては、一部の機能が失われる可能性があります。

  3. データベースのデータ層エクスポートアプリケーションを実行します。これにより、スキーマ、データ、コード(ストアドプロシージャなど)を含む.bacpacファイルが作成されます。

  4. 手順3でSQL Serverにインポートされた元のデータを削除します。

  5. データ層のインポートアプリケーションを実行し、手順3で作成した.bacpacファイルをポイントします。この手順では、ファイルguids = _Dataおよび_Logsを設定し、それらを一意にします。

  6. 完全バックアップを実行して、新しい.bakファイルを取得します。

  7. 新しい.bakファイルをS3にアップロードし、標準のRDSデータベースをインポートします。

    exec msdb.dbo.rds_restore_database
    @restore_db_name = '<database-name>',
    @s3_arn_to_restore_from = 'arn:aws:s3:::<bucket-name>/<backup-filename>'
    
7
NJITman

最後に、新しいRDSインスタンスを作成してそこで復元しました。小さなデータベースの場合は、他に回避策があります。1. .bacpacを作成して新しいデータベースにインポートし、バックアップ(.bak)を作成します。 こちら を参照してください。 2.スキーマとデータの両方を使用してスクリプトを生成し、新しいデータベースで実行します。

データベースサイズが大きい(10 GBを超える)ため、.bacpacまたはスクリプトを生成する方法は機能しませんでした。RDSはコスト効率は高くなりますが、DBAにとって苦痛です。

1
Shahdat