web-dev-qa-db-ja.com

新しいアーカイブデータベースのリセット

アーカイブに関する質問があります。

メインシステムから古いレコードをアーカイブするために使用される履歴DBがあり、アプリケーションはそれをクエリすることを認識しています

ただし、大きくなりすぎます。

履歴DBを再初期化したいのですが。私の考えは-一言で言えば:

  • このDBを閉じて、

  • 読み取り専用にします。

  • 名前を* oldに変更します

  • 同様の履歴DB(同じ構造/テーブル)を作成します。

  • ビュー/シノニムの助けを借りて、アプリケーションはコードを変更せずに両方のDBのデータをクエリできるようになります。

私の質問は最後の部分についてです

それは機能しますか?

実際の元のテーブル名ではなく、デフォルトの移動先オブジェクト名となるビュー/シノニム(ビューはUNION ALLを使用して両方のテーブルDBを照会します)を作成できますか?

私たちの主な問題はバックアップです。アーカイブは毎日行われるため、このDBもバックアップする必要があります。また、巨大なDBであるため、時間とリソースが無駄になります。

ありがとう、ロニ。

1
Roni Vered

読み取り専用データを使用するVLDBのバックアップサイズを削減する組み込みの方法は、大きなテーブルを分割し、古いパーティションを読み取り専用ファイルグループに配置してから、読み取り専用ファイルグループ(またはデータベース全体)のバックアップを頻繁に行わないようにすることです。読み取り/書き込みファイルグループの定期的なバックアップを使用します。次に、 Piecemeal Restore を実行できます。

[複数のデータベースでUNIONALLビューを使用する]は機能しますか?

はい。通常、アプリケーションが異常なことをしない限り、アプリケーションを変更せずにテーブルをビューに置き換えることができます。複数のデータベースにわたるUNIONALLビューは実際には同じように実行されないため、リスクはパフォーマンスにあります。

アーカイブデータベースの大きなテーブルで 列ストア圧縮 を使用してみてください。

実際の元のテーブル名ではなく、デフォルトの移動先オブジェクト名となるビュー/シノニム(ビューはUNION ALLを使用して両方のテーブルDBを照会します)を作成できますか?

はい、クロスデータベースクエリのビュー/シノニムを作成できます。

これを実装するときに頭に浮かぶいくつかの副作用は次のとおりです。

  • アプリケーションは、テーブルを期待し、ビューを渡されることに依存している場合があります。 (これをマスクする方法があるはずですが、現時点では見つかりません)
  • テーブルの名前を変更すると、スクリプト/他のビュー/プロシージャ/ ..が破損する可能性があります。
  • データベース間の照合の不一致(異なる場合)
  • 1つに対する1つのクエリではなく、2つのデータベースに対する2つのクエリにより、余分なオーバーヘッドが発生する可能性があります。
  • 統計が更新されない、自動作成されないなど、読み取り専用データベースを使用する場合は、さらに多くの考慮事項があります。詳細 ここ
  • 2つのデータベースの2つのテーブル間の制約/関係は機能しません。これにより、主キーが重複したり、外部キー参照が機能しなくなったりする可能性があります。

  • .。

2つのデータベース内の2つのテーブルのビューの例

CREATE VIEW [dbo].[maintable]
AS
SELECT id,val FROM [dbo].[maintable_v2] --new table
UNION ALL
SELECT id,val FROM [my_test_old].[dbo].[maintable_old]; --old table

新しいデータベースでこの新しく作成されたビューをクエリする

SELECT id,val
FROM [dbo].[maintable]
ORDER BY id;

結果

id  val
1   oldvalue --old table 
2   NewValue --new table

代替

最良の選択肢は David Browne-Microsoft の答えです。

それが選択肢ではない場合、これは最適ではない解決策です:

  1. テーブル内のデータを、同じデータベース内の読み取り専用ファイルグループに作成された履歴テーブルに移動します。
  2. 新しいテーブルを作成します
  3. 履歴テーブルと新しいテーブルにビューを作成します
  4. 読み取り専用ファイルグループを個別にバックアップし、読み取り専用ファイルグループなしでデータベースを個別にバックアップします。

Read_writeファイルグループをバックアップするには:

BACKUP DATABASE DatabaseName READ_WRITE_FILEGROUPS  
TO DISK = N'C:\SQLBackups\DatabaseBackup.bak';
  1. エンタープライズの場合、オンラインファイルグループ(断片的)復元を実行できますが、標準ではこれを実行できません。つまり、読み取り専用ファイルグループの復元を待機する必要があります。

これにより、Standard Editionで非履歴データベースを最初に復元し、履歴データベースの復元中にクエリでアクセスできるようにする場合に、複数のデータベースに分割する唯一の本当の利点が得られます。

  • 別のオプション(SQL Server 2016以降のバージョンではありません):[SQLServerストレッチデータベース] [3。コールド履歴データがそれほど照会されない場合は、Azureに保存します。これは、クエリやアプリケーションを変更せずに実行できます。
3
Randi Vertongen