1

とりわけ、組み込みデバイスからのログデータの詳細なアーカイブが保持される Web アプリケーションがあります。内部分析用にこの詳細データを保持したいと考えていますが、このデータは、パブリックにアクセス可能な本番サーバーでは 3 か月以上必要ではありません。Web アプリケーションは新しいデータを挿入するだけで、詳細データの更新や削除はありません。

そこで、運用サーバーから新しいデータのコピーを定期的 (たとえば毎日) に取得し (過去 3 か月分を含む)、3 か月より古いすべてのデータを運用サーバーから削除するアーカイブ システムを構築したいと考えています。

残念ながら、一部の組み込みデバイスがしばらく (数日から数週間) オフラインになることがあります。この場合、すでにコピー/アーカイブされた時間の新しいデータがシステムに追加される可能性があります。

公開運用サーバーでは SQL Server 2008 Standard Edition を使用し、内部アーカイブ システムでは SQL Server 2008 R2 Enterprise Edition を使用して、アーカイブのパーティション分割と圧縮を利用したいと考えています。

現時点では、次のアプローチを検討しています。

  1. 本番環境からアーカイブ システムへのデータの毎日のレプリケーション。運用上の古いデータが削除された場合、これはアーカイブ システムに複製されるべきではありません。レプリケーション ターゲットでの削除操作を無視するオプションを見つけました。

  2. アーカイブ システムに現在のデータを保持する必要がない場合は、特定の時間より古いすべてのデータを定期的にアーカイブ システムに移動します。しかし、現在のデータを同期し、古いデータをすべて移動する必要があります。

    混合ソリューションを使用する必要があるかもしれません: アーカイブ システムと実稼働システムの間で現在のデータを同期し、古いデータをアーカイブ システムのアーカイブ テーブルに移動するためのレプリケーション (現在のテーブルから実稼働システムにアーカイブ データの削除をレプリケートしている間) )。

どう思いますか?このような問題に関する推奨事項やベストプラクティスを知っていますか? このトピックは他の場所 (書籍など) で取り上げられていますか?

事前にどうもありがとうございました。

PS: この質問をここで行うべきか、serverfault で行うべきかはわかりません。ここに投稿する私の決定が間違っていた場合は、移動してください。ありがとう。

4

2 に答える 2

1

できることの 1 つは、Web アプリを両方の DB に同時に挿入することです。この方法では、アーカイブは prod db に依存しません。まったく。

また、prod のパーティション分割を検討することもできます。これにより、prod DB からのデータの削除がより簡単になります。(ただし、prod DB は標準版であるため、これはオプションではありません。) その場合、prod DB から行を削除する必要がある場合があります。削除を行うには、1 つのトランザクションで削除全体を実行しないでください。バッチに分割することもできます。

最後に、削除を行っている間、tlog の成長を注意深く観察してください。それはかなり速く大きくなることができます。

于 2011-10-07T18:16:13.093 に答える
1

アーカイブする必要があるテーブルの数について話していますか?

テーブルが 1 つまたは数個しかない場合は、SQL Server エージェントを介して SQL を定期的に実行できます。

このようなもの(非常に単純化されています):

-- copy to archive database
insert into ArchiveServer.dbo.ArchiveTable (Column1, Column2, ...)
select Column1, Column2, ...
from ProductionTableOnThisServer
where DateColumn < dateadd(m, -3, getdate())

-- delete in production database
delete from ProductionTableOnThisServer
where DateColumn < dateadd(m, -3, getdate())

この例を機能させるには、運用サーバーで実行する必要があり、アーカイブ サーバーを運用サーバーのリンク サーバーとして構成する必要があります。

もちろん、この小さな例は完璧にはほど遠いものです (または、製品化の準備さえできています!)。
これは基本的な考え方を表現するためのものでした。

現実の世界では、次のことも必要になるでしょう。

  • 何らかの理由でアーカイブが機能しなかった場合に実際のデータが削除されないように、両方のクエリをトランザクションでラップします。
  • 本当に新しい行のみを挿入し、変更された行を更新します
  • 等々...
于 2011-10-07T19:00:03.943 に答える