programing

SQL 서버:SQL 서버 백업 또는 복원 프로세스의 진행률을 확인하는 데 사용할 수 있는 SQL 스크립트가 있습니까?

testmans 2023. 5. 10. 20:31
반응형

SQL 서버:SQL 서버 백업 또는 복원 프로세스의 진행률을 확인하는 데 사용할 수 있는 SQL 스크립트가 있습니까?

MS SQL Server Management Studio를 사용하여 데이터베이스를 백업하거나 복원할 때 프로세스가 얼마나 진행되었는지, 프로세스가 완료될 때까지 얼마나 더 기다려야 하는지 시각적으로 알 수 있습니다.스크립트를 사용하여 백업 또는 복원을 시작하는 경우 진행 상황을 모니터링할 수 있는 방법이 있습니까? 아니면 문제가 발생하지 않기를 바라며 가만히 앉아서 완료될 때까지 기다려야 합니까?

편집: 특히 백업 또는 복원이 시작된 세션과 완전히 별개로 백업 또는 복원 진행 상황을 모니터링할 수 있어야 합니다.

이 샘플 스크립트는 매우 잘 작동하는 것으로 보입니다.

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')

세션을 알고 있는 경우그러면 다음 ID를 사용할 수 있습니다.

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

다음은 일반적으로 유용한 간단한 스크립트입니다.

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

예. 마스터 데이터베이스에 sp_who2k5를 설치한 경우 다음을 실행하면 됩니다.

sp_who2k5 1,1

결과 집합에는 모든 활성 트랜잭션이 포함됩니다.현재 실행 중인 백업은 requestCommand 필드에 "BACKUP" 문자열을 포함합니다.적절한 이름의 percentComplete 필드에 백업 진행률이 표시됩니다.

참고: sp_who2k5는 모든 사용자의 툴킷에 포함되어야 합니다. 이는 단순한 기능 이상의 기능을 제공합니다.

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')
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')

사용:

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')

스크립트인 경우 백업 명령에서 STATS를 사용합니다.

내부 코드는 좀 더 복잡합니다.예를 들어 ODBC에서 SQL_ATTR_ASYNC_ENABLE을 설정한 다음 SQL_STILL_EXECUCTING 반환 코드를 찾고 SQL_SUCCESS(또는 equiv)가 표시될 때까지 SQLExecDirect를 반복 호출합니다.

STATS 옵션 사용: http://msdn.microsoft.com/en-us/library/ms186865.aspx

복원 또는 백업 진행 상황을 확인하는 가장 좋은 방법은 다음과 같은 질문을 하는 것입니다.

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 또는 Execute 버튼을 누를 때마다 백분율 진행률을 수행합니다!

게시물을 작성한 사람이 쿼리를 수행했습니다.

더하다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.
SELECT  session_id as SPID, command, start_time, percent_complete,
        dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time,
        a.text AS Query 
FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
WHERE r.command in ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

AWS(RDS)에서 SQL Server를 실행하는 모든 사용자를 위해 다음에서 호출할 수 있는 내장 프로시저가 있습니다.msdb모든 백업 및 복원 작업에 대한 포괄적인 정보를 제공하는 데이터베이스:

exec msdb.dbo.rds_task_status;

, 세부 예: 및 기간) 및 " " " " " " " " " " (" " " " " " " " " (" " " " " " " " " " " 이 표시됩니다.task_info백업 또는 복원의 문제를 파악할 때 매우 유용한 열입니다.

MS SQL Server 2012에서 데이터베이스 복원 작업을 수행할 때도 비슷한 문제가 있었습니다.

그러나 나만의 시나리오에서는 스크립트 창에서 데이터베이스 복원 작업의 진행 상황을 확인하기만 하면 되었습니다.

스크립트에 STATS 옵션을 추가하기만 하면 되었습니다.

USE master;
GO

ALTER DATABASE mydb SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
    
RESTORE DATABASE mydb
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_21-08-2020.bak'
    WITH REPLACE,
         STATS = 10,
         RESTART,
    MOVE 'my_db' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\my_db.mdf',
    MOVE 'my_db_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\mydb_log.ldf'
GO
    
ALTER DATABASE mydb SET MULTI_USER;
GO

그런 다음 스크립트 창의 메시지 탭으로 전환하여 데이터베이스 복원 작업의 진행률을 확인했습니다.

여기에 이미지 설명 입력

DATABASE RESTORE 작업 후 추가 정보를 얻으려면 eythort에서 제안하는 다음 명령을 사용할 수 있습니다.

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'

이상입니다.

이것이 도움이 되길 바랍니다.

백업 또는 복원이 시작된 세션과 완전히 별개로 백업 또는 복원 진행률을 모니터링합니다.타사 도구가 필요하지 않습니다.Microsoft SQL Server 2012에서 테스트되었습니다.

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

저는 기본적으로 업계 표준인 활동적이고 매우 유익한 sp_who를 사용하고 있습니다.완료율도 반환합니다.

마스터 DB에서 bkp_status를 실행하기만 하면 백업 상태가 표시됩니다.

언급URL : https://stackoverflow.com/questions/152447/sql-server-is-there-a-sql-script-that-i-can-use-to-determine-the-progress-of-a

반응형