3

昨夜 SQL Azure Import/Export Service を使用して取得した BACPAC で奇妙な問題が発生しました。

私たちのデータベースには、2 つの関連するテーブルがあります。

dbo.Documents --All Documents in the database
  Id
  DocName
  Extension

dbo.ProcessDocuments --Doc's specific to a process
  Id
  DocumentId (FK -> dbo.Documents.Id with Check Constraint)
  ProcessId

そのスキーマに基づいてProcessDocuments、メイン テーブルにコンパニオン エントリがない行をテーブルに含めることはできませんDocuments

ただし、別の環境でデータベースの復元を行った後、最終的には

の 7001 エントリProcessDocuments。それらに相当するエントリは 7000 のみですDocuments(欠落 1)。そして、復元を試みたときに復元が失敗しましALTER TABLE CHECK CONSTRAINTProcessDocuments

私が想像できる唯一のことは、バックアップが取られているとき、テーブルを順番に (アルファベット順に???) 通過し、一度に 1 テーブルずつデータをバックアップしていて、次のようなことが起こったことです。

  • Documentsバックアップされます。7000 エントリを含む
  • 誰かが新しいプロセス ドキュメントをシステムに追加する / に挿入Documents&Process Documents
  • ProcessDocuementsバックアップされます。7001 エントリを含む

その場合、有効なディザスタ リカバリ アセットとして BACPAC を使用するという点で大きな問題が生じます。システムでデータが動いているときに BACPAC を取得すると、BACPAC にデータの整合性の問題が含まれる可能性があるからです。

これは事実ですか、それとも他に何がこれを引き起こしたのかについて誰かが光を当てることができますか?

4

2 に答える 2

1

Slav からの回答によると、bacpac は非トランザクションであり、bacpac の生成中にテーブルに新しい行が追加されると破損します。

これを回避するには:

1) ターゲット データベースをコピーします。すぐに返されますが、データベースのコピーには時間がかかります。この操作により、完全なトランザクション コピーが作成されます。

CREATE DATABASE <name> AS COPY OF <original_name>

2) コピー操作のステータスを確認します。

SELECT * FROM sys.dm_database_copies

3) 誰にも使用されていない、コピーしたデータベースで bacpac ファイルを生成します。

4) コピーしたデータベースを削除すると、作業用の bacpac ファイルが作成されます。

于 2014-01-22T17:40:55.870 に答える