すべて、
私はデータベースを縮小しない正当な理由に精通しており、2TBのデータベースを縮小する過程にあります。大規模なデータベースがあり(ポリシーによって)毎日バックアップされます。サイズが大きいため、バックアップは1日のうちほとんど実行されます。私たちはしばらくの間60%以上無料で実行しており、それが大幅に変わることはありません。テーブルサイズを縮小して、バックアップがパフォーマンスに及ぼす影響を軽減しています。
テーブルが大きく、圧縮が非常に遅いため、ループスクリプトでDBCC SHRINKFILEを実行し、一度に250MBを圧縮します。バックアップを開始すると、ファイルシステムを変更できないというSHRINKFILEエラーが出力されるため、これを行っています。これは、バックアップ中にファイルがロックされているため、バックアップ中にファイルが変更されないためと考えています。私はバックアップが始まるときに真ん中だったので、小さな縮小を行っています。だから私はそれをループして、shrinkfileエラーを確認し、スクリプトを強制終了できるようにします。
私の質問は、バックアップの開始後、DBCC SHRINKFILEがファイルを変更できず、エラーメッセージが表示されますが、バックアップが完了すると、スクリプトの最初の反復が非常に速くなり、通常のリズムに落ち着きます。人々がSHRINKFILEを殺すと言ったように、あなたは「あなたの仕事を失わないでください」 tempdbでシュリンクを実行した結果、どこかに行く準備ができていますか?この圧縮をもう少し早く行うために、バックアップ中に完了していないことがわかっているより大きな圧縮ファイルを実行することは良い考えだと誰かが思いますか?それは私に次の日にジャンプを与えるでしょう。
おかげで、
パット
バックアップ時間が短縮されることを期待して、バックアップ前に縮小していますか?その場合でも、違いはありません。しかし、それを行っているために(復元時に)ターゲットに割り当てられるスペースが少ない場合は、役に立ちます。
バックアップの前に毎回これを行っているかどうかはわかりませんでした。はいの場合、これを永続的に解決し、これを行わないようにします。
次に、質問に答えます。
tempdbでの縮小の結果はどこかに準備ができていますか?
結果を保持する必要はありません。再起動すると、すべてが再度チェックされます。
この縮小をもう少し早く行うために、バックアップ中に、完了しないことがわかっているより大きな縮小ファイルを実行することをお勧めします
いいえ、一度に32ページを実行してコミットするためです。下記参照。
シュリンクは、最大32ページのトランザクションバッチで機能します。 32ページが切り捨てポイントの下に移動すると、トランザクションがコミットされ、新しいトランザクションが開始されます。これにより、トランザクションを長時間開いたままにし、アクティブなトランザクションを超えて切り捨てることができないためにログファイルが大きくなるという、shrink *の古い問題を回避できます。また、shrink *再起動が可能になります。縮小*操作をキャンセルまたは中止すると、現在アクティブなトランザクションのみがロールバックされます。これは、メンテナンス期間中に縮小*操作をスケジュールし、その実行時間をそのメンテナンス期間に制限できることを意味します。次のメンテナンス期間中に再起動でき、中断したところから再開します。これの唯一の欠点は、縮小が終了すると、ターゲットの後に割り当てが発生する可能性があることです。これには、新しく割り当てられたスペースに対して追加の作業を行うための縮小が必要になる場合がありますが、これは合理的に制限されているはずです。
余談ですが、2TBのバックアップには1日かかりません。ネイティブバックアップにはスイッチがあり、バックアップ時間を短縮/最適化できます。