web-dev-qa-db-ja.com

SQL Serverのバックアップまたは復元プロセスの進行状況を判断するために使用できるSQLスクリプトはありますか?

MS SQL Server Management Studioを使用してデータベースをバックアップまたは復元すると、プロセスの進行状況が視覚的に示されます。そのため、プロセスが終了するまでどれくらいの時間が必要かがわかります。バックアップを開始するか、スクリプトで復元する場合、進行状況を監視する方法はありますか?

編集済み私のニーズは、バックアップまたは復元が開始されたセッションとは完全に分離して、バックアップまたは復元の進行状況を監視できることです。

90
Veldmuis

はい。 sp_who2k5 をmasterデータベースにインストールしている場合、単純に実行できます:

sp_who2k5 1,1

結果セットには、すべてのアクティブなトランザクションが含まれます。現在実行中のバックアップのrequestCommandフィールドに「BACKUP」という文字列が含まれます。適切な名前のpercentCompleteフィールドは、バックアップの進行状況を示します。

注:sp_who2k5は全員のツールキットの一部である必要がありますが、これだけではありません。

10
Portman

このサンプルスクリプトを見つけました here それはかなりうまく機能しているようです:

SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete)
AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time],
CONVERT(NUMERIC(10,2),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0) AS [ETA Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours],
CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2,
CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
FROM sys.dm_exec_sql_text(sql_handle))) AS [SQL]
FROM sys.dm_exec_requests r WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')
212
Veldmuis

SessionIDがわかっている場合は、次を使用できます。

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

または、絞り込みたい場合:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
12
Allen

一般的に私のためにトリックを行う簡単なスクリプトを次に示します。

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE') 
6
Wilfred Kimani
SELECT session_id as SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
5

SQL Serverでバックアップと復元の進行状況を確認するスクリプト

多くの場合、バックアップ(または復元)アクティビティが別のデータベース管理者またはジョブによって開始され、GUIを使用してそのバックアップ/復元の進行状況を確認することはできません。

複数のコマンドを組み合わせることで、サーバーで発生している現在のバックアップと復元の概要を提供できる以下のスクリプトを生成しました。

select 
r.session_id, 
r.blocking_session_id, 
db_name(database_id) as [DatabaseName],
r.command, 
[SQL_QUERY_TEXT] = Substring(Query.TEXT, (r.statement_start_offset / 2) + 1, (
            (
                CASE r.statement_end_offset
                    WHEN - 1
                        THEN Datalength(Query.TEXT)
                    ELSE r.statement_end_offset
                    END - r.statement_start_offset
                ) / 2
            ) + 1),
                [SP_Name] =Coalesce(Quotename(Db_name(Query.dbid)) + N'.' + Quotename(Object_schema_name(Query.objectid, Query.dbid)) + N'.' + 
     Quotename(Object_name(Query.objectid, Query.dbid)), ''),
r.percent_complete,
start_time,
CONVERT(VARCHAR(20), DATEADD(ms, [estimated_completion_time],
GETDATE()), 20) AS [ETA_COMPLETION_TIME],
CONVERT(NUMERIC(6, 2), r.[total_elapsed_time] / 1000.0 / 60.0) AS [Elapsed_MIN],
CONVERT(NUMERIC(6, 2), r.[estimated_completion_time] / 1000.0 / 60.0) AS [Remaning_ETA_MIN],
CONVERT(NUMERIC(6, 2), r.[estimated_completion_time] / 1000.0 / 60.0/ 60.0) AS [ETA_Hours],
wait_type,
wait_time/1000 as Wait_Time_Sec, 
wait_resource
from sys.dm_exec_requests r 
cross apply sys.fn_get_sql(r.sql_handle) as Query where r.session_id>50 and command IN ('RESTORE DATABASE','BACKUP DATABASE', 'RESTORE LOG', 'BACKUP LOG')
4
Kundan Dasange

単なるスクリプトの場合、BACKUPコマンドでSTATSを使用します。

コード内では、もう少し複雑です。たとえば、ODBCでは、SQL_ATTR_ASYNC_ENABLEを設定してからSQL_STILL_EXECUTINGリターンコードを探し、SQL_SUCCESS(またはeqiv)を取得するまでSQLExecDirectを繰り返し呼び出します。

4
David L Morris

次のクエリを使用して、復元またはバックアップの進捗を確認するのが最善の方法だと思います。

USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
        WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

上記のクエリは、セッション自体を識別し、SSMSでF5キーまたは実行ボタンを押すたびに進行状況をパーセンテージで示します。

クエリは、これを書く人によって実行されました post

3
BMDaemon
3
Pavel Chuchuva

で試してください:

SELECT * FROM sys.dm_exec_requests where command like '%BACKUP%'

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command like '%BACKUP%'

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')
2

SELECT session_id as SPID、command、start_time、percent_complete、dateadd(second、estimated_completion_time/1000、getdate())astimated_completion_time、a.text AS Query from FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)a WHERE r。コマンド(「BACKUP DATABASE」、「BACKUP LOG」、「RESTORE DATABASE」、「RESTORE LOG」)

0
Ben

RDS(AWS)でSQL Serverを実行している場合は、msdbデータベースに 組み込みプロシージャ 呼び出し可能があり、すべてのバックアップおよび復元タスクの包括的な情報を提供します。

exec msdb.dbo.rds_task_status;

これにより、各タスクの完全な概要、その構成、実行に関する詳細(完了したパーセンテージや合計期間など)、およびバックアップまたは復元の問題を把握する際に非常に役立つtask_info列が表示されます。 。

0
bsplosion

バックアップコマンドにSTATS=10またはSTATS=1を追加します。

BACKUP DATABASE [xxxxxx] TO  DISK = N'E:\\Bachup_DB.bak' WITH NOFORMAT, NOINIT,  
NAME = N'xxxx-Complète Base de données Sauvegarde', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO.
0

基本的に業界標準である非常に有益なsp_whoisactiveを使用しています。完了率も返されます。

0
RC Bird

バックアップまたは復元の進行状況を監視するには、バックアップまたは復元が開始されたセッションとは完全に分離します。サードパーティのツールは必要ありません。 Microsoft SQL Server 2012でテスト済み。

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )
0
Liam Fleming