web-dev-qa-db-ja.com

SQL Server-ファイルのタイムスタンプは変更されていないため、何がバックアップされますか?

以下のスナップショットを参照してください。私の管理下にあるSQL Serverインスタンスの1つについて、すべてのデータファイルとトランザクションログファイルのタイムスタンプが示されています。これは本番インスタンスです。

enter image description here

今日は2019年12月27日です。しかし、ご覧のとおり、すべてのタイムスタンプははるかに古い時間を示しています。

真実は、私がこのスナップショットを数日前に撮ったことです。正確には、12月24日です。しかし、今日チェックしたように、状況は変わっていません。

上記のスナップショットは、ユーザーデータベースから取得されました。別のドライブの別のフォルダにあるシステムデータベースを確認したところ、状況が少し異なりました。

enter image description here

現在、これらのデータベースは確かに非常にアクティブではありません。しかし、トランザクションが常に実行されていることは確かです。さらに、それらのいくつかについて「スキーマ変更履歴」レポートを確認し、昨日-12月26日のように、メンテナンスジョブがインデックスを再構築していることを確認しました。

データベースはすべて完全復旧モデルになっています(ただし、それは事実ではありませんが、関連がない場合もあります)。 OSはWindows NT 6.0(Windows Server 2007)で、SQL Serverのバージョンは2008 SP3です。 OSとSQL Serveの両方が、来年の第1四半期のアップグレードの予定です。また、私が継承したこのサーバーの構成は最適ではなく、データファイルとログファイルが同じフォルダーにあります。したがって、うまくいけば、すべてが数か月後のアップグレード/移行アクティビティ中に修正されるでしょう。

私にとっての質問は、トランザクションがあるにもかかわらず、これらのファイルが変更されないのはなぜですか? 「チェックポイント」を手動で実行しても、何も変わりませんでした。それで、なぜですか?トランザクションログファイルが変更されていない場合、バックアップは適切ですか。彼らは本当に彼らが想定しているものを含んでいますか?

または、おそらく年を取っているため、何か不足していますか? :)

5
RGO

あなたの主な質問(「バックアップされているもの」)に答えて、あるはずのすべてのものは????さらに深刻なことに、データベースファイルで発生した変更の印としてこれらのタイムスタンプを使用することはできません。 SQL Serverは、データベースファイルの変更日がどのように変更または更新されるかについては保証しません。

ここに興味深いブログの投稿があり、MDFファイルで日付変更スタンプがいつどのように更新されるかをパターンで検索しようとしています。

SQL Serverデータベースファイル-変更日

彼らの観察はあなたの状況と一致すると私は思います:データファイルへの通常の書き込みは日付変更スタンプを更新しません。成長イベント(手動または自動)はその値を更新し、サービス(またはデータベースを「開く」または「閉じる」可能性があるもの-自動クローズ機能を使用して、明示的にDBをオフラインにするなど)を更新するように見えます。

2019年12月19日9:52 PMはWindowsまたはSQL Serverの再起動に対応します。これは、日付/時刻のいくつかが同期された方法です。

ただし、繰り返しますが、この動作は文書化されていません。私たちが気づくパターンはいつでも変更される可能性があり、予期しないEdgeケースがある可能性もあります。

NTFSファイルシステムにあるSQL Serverデータファイルの場合、 this が適用されます。

ファイルのタイムスタンプに関する唯一の保証は、変更を行うハンドルが閉じられたときにファイルの時刻が正しく反映されることです。

ただし、明確に言うと、これはWindowsが提供する保証です。 SQL Serverがどのようにしてすべてのシナリオでファイルハンドルを作成および破棄するのかについて、必ずしも理解できるとは限りません。

David Browne (トップマイクロソフトマン)がコメントでこれについて言及しました。

SQL Serverは、実行中は常にデータベースファイルを開いたままにします。これにより、パフォーマンスが向上し、他のプロセスがファイルを変更するのを防ぎます。したがって、属性はファイルの書き込みごとに変更されるわけではありません。

10
Josh Darnell