3

次のようなデータベースがあるとします。

Users
-----
ID int PK Identity
Name vchar(max)

Sales
-----
UserID int FK
Description vchar(max)

そしていくつかのデータ:

Users
1, "Daniel"
2, "Barnie"
3, "Frank"

Sales
2, "New computer"
2, "Rubber duck"
3, "Cabbage"

この主キーにリンクする他のテーブルもいくつかあります。ここで、特定のユーザーのみをバックアップする必要があるという要件があります。たとえば、ユーザー 2 と 3 のデータとすべてのリンクされたデータのみをエクスポートしたいとします。

質問: 1) 部分的なデータのみを使用して .bak ファイルを作成する方法はありますか? 全体をバックアップするのではなく、選択したレコードだけをバックアップします。2) .bak ファイルが最善の方法ではない場合、他に何ができますか? csv ファイルまたは INSERT sql スクリプトを生成することを考えましたが、これらはインポート機能で問題を引き起こします。この問題は、2 つ以上のデータベースからエクスポートしたときに、users テーブルの主キーに競合が発生する可能性がある場合に発生します。これをどのように回避しますか?また、一部のテーブルでファイル ストリーミングを使用しているため、テキスト形式に簡単に取り出せないデータがあります。

また、これらすべてをプログラムで行いたいと考えています。SQL Server 2008 を使用しています。

4

7 に答える 7

2

比較的単純なオプションは、バックアップするユーザーをテーブルに入力し、アーカイブされたユーザー用に同じサーバー インスタンスに別の DB を作成してから、新しい DB を選択することです (明らかに最初にユーザー テーブル)。新しいDBに値が存在する古いDBから削除し、新しいDBをバックアップしてください。これでゴールデンです。

于 2010-07-21T16:04:07.523 に答える
2

パーティショニングを使用して、異なるファイル グループまたは異なるサーバー間でデータを分割できます。次に、ファイル グループ/サーバーに異なるバックアップ スケジュールを適用することで、各パーティションのバックアップ方法を選択できます。

しかし、全体として、最近のストレージは非常に安価です。これに費用がかかることが本当にわかっていない限り、私はすべてをバックアップします. バックアップ システムが複雑になればなるほど、障害が発生しやすくなり、数ギガを節約するコストは、すべてのデータを失うコストと等しくなりません。

于 2010-07-29T20:52:02.010 に答える
2

質問: 1) 部分的なデータのみを使用して .bak ファイルを作成する方法はありますか? 全体をバックアップするのではなく、選択したレコードだけをバックアップします。

いいえ。SQL Server では、バックアップ機能はデータベース全体のみをバックアップします。

2) .bak ファイルが最善の方法ではない場合、他に何ができますか?

元のサーバーと同じサーバーに 2 つ目のアーカイブ データベースをセットアップし、レプリケーションを使用して特定のレコードのみを同期することをお勧めします。次に、アーカイブ データベースのみをバックアップします (または両方を別のスケジュールでバックアップします)。

レプリケーションが好みでない場合は、このアーカイブ データベースに対してトリガー アップサートまたは削除を実行することもできます。

csv ファイルまたは INSERT sql スクリプトを生成することを考えましたが、これらはインポート機能で問題を引き起こします。この問題は、2 つ以上のデータベースからエクスポートしたときに、users テーブルの主キーに競合が発生する可能性がある場合に発生します。これをどのように回避しますか?また、一部のテーブルでファイル ストリーミングを使用しているため、テキスト形式に簡単に取り出せないデータがあります。

これはマルチテナントの状況ですか? とにかく、データベースごとに、実際に必要な情報のバックアップに使用される 2 つ目のアーカイブ データベースを作成します。したがって、2 つのデータベースが同じフィルター済みアーカイブ データベースにフィードすることはありません。

于 2010-07-28T22:34:43.690 に答える
1

この問題に対しては、一般化されたアーカイブ アプローチを採用します。

  • エクスポートする必要があるすべてのテーブルのすべてのスキーマを含む中央データベースを作成します

Filestream データを維持したいので、.csv または bcp ファイルをどのように使用できるかわかりません。さらに、これは、情報を蓄積するための巨大なデータベースを 1 つ持つという、あなたが言及したアイデアにも当てはまります。

  • テーブルごとに、DbName という名前の新しい列を追加します。

DbName は、元のレコードが由来するデータベースの名前になります。この列をユーザー ID と組み合わせて、 複合キーを作成できます。これにより、ID フィールドをテーブルに保持しながら、同じ ID を持つユーザーを 1 つのテーブルにマージすることができます。

  • 必要なデータを新しいデータベースにロードし、同時に削除する (または少なくとも削除のマークを付ける) ストアド プロシージャを作成します。

おそらく、このストアド プロシージャは SQL エージェント ジョブとして実行され、各データベースに 1 つ持つことができます。削除されるユーザーは、一元化されたテーブルを介して参照できます。

于 2010-07-29T04:34:16.947 に答える
1

このアイデアはどうですか:

  • バックアップする関連テーブルごとにバックアップ テーブルを作成します。
  • 簡単なクエリを使用して、このテーブルにデータを入力します (バックアップが必要なユーザーに関するデータを選択するだけです)。
  • 関連する各テーブルでの単純なトリガー (追加または更新) により、バックアップ テーブルが同期されます。
  • これで、この新しいテーブルからバックアップをエクスポートできます
  • データを復元するにはinsert ignore.

それは単なるアイデアです、批判しましょう:)

于 2010-07-21T16:12:37.810 に答える
1

バックアップは、データベースのスナップショットを作成して、後で復元できるようにすることを目的としています。特定のレコードを気にしない場合は、それらを削除してからバックアップを行ってください。

于 2010-07-21T12:07:13.333 に答える
1

もう 1 つの可能性は、SSIS をカスタムの select ステートメントと生データ出力と共に使用することです。コンテンツは、必要なレコードを正確に取得しながら、ネイティブ形式で非常に高速にインポートおよびエクスポートできます。さらに、エクスポート後にファイルの圧縮を実行したり、ファイル コマンドを実行してファイルを移動したりできます。

于 2010-07-30T06:25:40.717 に答える