web-dev-qa-db-ja.com

SQLデータベースのバックアップを開始した後で、停止することはできますか?

SQL Server 2008でSQLデータベースのフルデータベースバックアップを実行したいと考えています。

私の質問は:

  • 開始に時間がかかったり、速度が遅くなりすぎたりした場合、開始後にバックアップを停止、一時停止、またはキャンセルできますか?バックアップは単なるジョブですか? ジョブを停止する
  • バックアップを実行するときに、進行状況を表示して、バックアップの推定完了時間を確認できますか?もしそうなら、その進捗状況をどのように見ていますか?
5
kyle_13

直接あなたの質問に答えます:

開始に時間がかかったり、速度が遅くなりすぎたりした場合、開始後にバックアップを停止、一時停止、またはキャンセルできますか?

バックアップを一時停止することはできません。Tsqlを使用して実行するか、SQLエージェントジョブを使用して実行します。データベースがミラーリングされている場合、フェイルオーバーするとバックアップが強制終了されます。

SQL Server 2008を使用しているため、最近、重要なアプリの1つが停止するという奇妙な状況に遭遇しました。最新のSP(2008 SP4)を使用していない場合-バグがあり、SP1 + CU4で修正されたノードでsp1を実行していました-SP1のCU4で解決されました: https://support.Microsoft.com/en-US/help/973602 。「970133」で検索:FIX:SQL Server 2008でデータベースの圧縮バックアップを作成する場合、バックアップ操作が応答を停止すると、バックアップ操作を停止できません。

kill spidコマンドを使用して停止または強制終了できます。

すでに進行中のジョブを強制終了する場合は、ROLLBACKを実行する必要があるため、しばらく時間がかかるため、注意が必要です。

バックアップは単なるジョブですか、それともジョブを停止するだけですか?

バックアップの実行方法によって異なります。 SQLエージェントジョブを使用して実行する場合は、そのジョブをSTOPできます。SSMSまたはSQLCMDから直接実行する場合は、CANCELまたはKILLを実行できます。コマンド。

バックアップを実行するときに、進行状況を表示して、バックアップの推定完了時間を確認できますか?もしそうなら、その進捗状況をどのように見ていますか?

DMVを使用して、バックアップ(または復元)の進行状況を監視できます(WITH STATS = numberを使用していない場合):

----- find out the ETA time for restore and backup progress

SELECT command,
            s.text,
            start_time,
            percent_complete, 
            CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar) + ' hour(s), '
                  + CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar) + 'min, '
                  + CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar) + ' sec' as running_time,
            CAST((estimated_completion_time/3600000) as varchar) + ' hour(s), '
                  + CAST((estimated_completion_time %3600000)/60000 as varchar) + 'min, '
                  + CAST((estimated_completion_time %60000)/1000 as varchar) + ' sec' as est_time_to_go,
            dateadd(second,estimated_completion_time/1000, getdate()) as est_completion_time 
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
WHERE r.command in ('RESTORE DATABASE', 'BACKUP DATABASE', 'RESTORE LOG', 'BACKUP LOG')

思考のためのいくつかの食べ物:

10
Kin Shah

特定の製品について言及していないため、ネイティブバックアップを使用していると想定します。ただし、使用しているバックアップ製品(Litespeed、RedGate Hyperbacなど)によっては、バックアップを停止できる場合がありますが、アドホックバックアップコマンドの場合は、Management Studio内で[停止]をクリックするほど簡単ではありません。ネイティブバックアップの場合、エンジンは停止コマンドにすばやく応答する必要があります。

これを念頭に置いて、コミュニティからのより大きな質問は「なぜ進行中のバックアップを停止したいのか?」です。これを行うためのかなり確かな理由がない限り、パフォーマンスの低下が最良の理由ではないと私は言います(私にとっては、これは保守操作のより良いスケジューリングまたはより良い回復計画の議論です)、実際にそれを行うべきではありません。バックアップは、サーバーを回復し、データが南向きになった場合のリスクを最小限に抑える手段です。サーバーに十分な長さがあれば、DBAに依頼すると、最終的に南向きになります。私たちに質問してください、私たちは偏執狂ではありません、彼らは本当に私たちを捕まえるために出ています!

冗談はさておき、最初の質問の2番目のポイントまでは、バックアップをアドホックで実行するか、SQL Serverエージェントを使用して実行できます。バックアップルーチンのコーディングをあまり扱っていない場合は、メンテナンスプランは悪いためではなく、扱いにくいため、保守計画を立てないことをお勧めします。私はOla Hollengrenのメンテナンススイートを使用します。これは、箱から出してすぐに必要なすべてのものを提供し、スケジュールを作成するだけです。これは http://ola.hallengren.com で見つけることができ、そこでドキュメントを読むととても良いです。

2番目の質問は、エンジンのいくつかの非常に興味深い領域への扉を開きます。はい、バックアップの進行状況を表示できます。これを行うには、アドホックコマンドのWITH STATSパラメータに値を指定するか、sys.dm_exec_requestsを表示して、バックアップのSPIDをリクエストのセッションに一致させます。COMMAND列を使用して、絞り込みを支援できます。検索またはsp_who2。このDMVでは、BACKUPが1である特定のコマンドに対して入力される、返された列としてpercent_completeが表示されます。これと、ミリ秒単位の残り時間である見積もられた時間を使用して、コマンドが完了する時間の大まかな見積もりを取得できます。一部のコマンドでは、これは他のコマンドよりも正確です(DBCC SHRINKFILEは、過小評価で悪名高いことで有名です)。また、実行しようとしていることに応じて少し複雑になる可能性のある計算を支援するスクリプトをオンラインで見つけることもできます。

2
Travis Page