SQL-Server: มีสคริปต์ SQL ที่ฉันสามารถใช้เพื่อตรวจสอบความคืบหน้าของกระบวนการสำรองหรือคืนค่า SQL Server หรือไม่?


98

เมื่อฉันสำรองหรือกู้คืนฐานข้อมูลโดยใช้ MS SQL Server Management Studio ฉันจะได้รับภาพที่บ่งบอกว่ากระบวนการดำเนินไปไกลแค่ไหนและฉันยังต้องรออีกนานแค่ไหนกว่าจะเสร็จ ถ้าฉันเริ่มต้นการสำรองข้อมูลหรือเรียกคืนด้วยสคริปต์มีวิธีตรวจสอบความคืบหน้าหรือไม่หรือฉันแค่นั่งรอให้เสร็จสิ้น (หวังว่าจะไม่มีอะไรผิดพลาด?)

แก้ไข:ความต้องการของฉันโดยเฉพาะเพื่อให้สามารถตรวจสอบการสำรองข้อมูลหรือเรียกคืนความคืบหน้าโดยแยกจากเซสชันที่เริ่มต้นการสำรองข้อมูลหรือกู้คืน

คำตอบ:


12

ใช่. หากคุณติดตั้งsp_who2k5ลงในฐานข้อมูลหลักของคุณคุณสามารถเรียกใช้:

sp_who2k5 1,1

ชุดผลลัพธ์จะรวมธุรกรรมที่ใช้งานอยู่ทั้งหมด ข้อมูลสำรองที่กำลังทำงานอยู่จะมีสตริง "BACKUP" ในฟิลด์requestCommand ฟิลด์percentCompleteชื่อ aptly จะให้ความคืบหน้าของการสำรองข้อมูล

หมายเหตุ: sp_who2k5 ควรเป็นส่วนหนึ่งของชุดเครื่องมือของทุกคนซึ่งทำได้มากกว่านี้


ระวังคำพูดแปลก ๆ ในรหัสสำหรับ sp_who2k5 !! ต้องแทนที่ 'ด้วย' เพื่อให้ทำงานได้
Dinglemeyer NeverGonnaGiveUUp

ฉันรู้ว่านี่เป็นเธรดเก่ามาก แต่ลิงก์เพื่อรับ proc ที่เก็บไว้นั้นตายไปแล้ว
John Waclawski

224

ฉันพบสคริปต์ตัวอย่างนี้ที่นี่ซึ่งดูเหมือนว่าจะทำงานได้ดี:

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

2
ลิงก์แหล่งที่มาที่ระบุไม่ได้ชี้ไปที่บทความอีกต่อไป นี่คือรายการที่อัปเดต: sql-articles.com/scripts/estimate-time-for-backup-restore
Marien

แม้ว่าการกู้คืนจะดำเนินไปเป็นเวลา 15 นาที แต่ก็บันทึกความคืบหน้าเพียง 0% เป็นฐานข้อมูลขนาดใหญ่ (80 กิ๊ก) ข้อเสนอแนะอื่น ๆ ?
user64141

5
@ user63141; การคืนค่าเริ่มต้นด้วยการจัดสรรไฟล์ หากคุณยังไม่ได้ทำอะไรเลยจะไม่อนุญาตให้ใช้ Instant File Initialization (ดูmsdn.microsoft.com/en-us/library/ms175935.aspx ) อาจใช้เวลาสักครู่หากคุณมีดิสก์เก่าหรือฐานข้อมูลขนาดใหญ่
Henrik Staun Poulsen

2
ไม่มีแถวในผลลัพธ์เมื่อฉันดำเนินการค้นหานี้
goutam

1
ฉันคิดว่าหากคุณเพิ่ม 'RESTORE HEADERON' ลงในรายการในส่วนคำสั่ง WHERE คุณจะได้รับความคืบหน้าเกี่ยวกับงานการตรวจสอบสำรองใด ๆ ที่ดำเนินการในภายหลังเช่นกัน
goorj

17

หากคุณทราบ 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

7
สิ่งนี้ใช้งานได้ดีสำหรับฉันคำสั่ง SELECT, percent_complete, start_time จาก sys.dm_exec_requests โดยที่คำสั่ง = 'RESTORE DATABASE'
eythort

13

นี่คือสคริปต์ง่ายๆที่โดยทั่วไปแล้วจะเป็นเคล็ดลับสำหรับฉัน:

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

สคริปต์เพื่อตรวจสอบความคืบหน้าในการสำรองข้อมูลและคืนค่าใน 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')

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

4

ใช้ STATS ในคำสั่ง BACKUP หากเป็นเพียงสคริปต์

รหัสภายในมันซับซ้อนกว่าเล็กน้อย ตัวอย่างเช่นใน ODBC คุณตั้งค่า SQL_ATTR_ASYNC_ENABLE จากนั้นค้นหาโค้ดส่งคืน SQL_STILL_EXECUTING และทำการเรียก SQLExecDirect ซ้ำ ๆ จนกว่าคุณจะได้รับ SQL_SUCCESS (หรือ eqiv)


4

ลองใช้:

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

3

ใช้ตัวเลือก STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx


สิ่งนี้จะ จำกัด ไม่ให้ฉันได้รับข้อเสนอแนะในเซสชันเดียวกับที่ฉันเริ่มการสำรองข้อมูล ในกรณีของเราเราเริ่มต้นการกู้คืนฐานข้อมูลด้วยไฟล์ BAT ที่กำหนดเวลาไว้ที่ 4 ในตอนเช้าและฉันต้องการเชื่อมต่อกับเซิร์ฟเวอร์ 3 หรือ 4 ชั่วโมงต่อมาและพิจารณาความคืบหน้า
Veldmuis

ฉันคิดว่าคุณสามารถเปลี่ยนเส้นทางเอาต์พุตสคริปต์ไปยังไฟล์บันทึกจากนั้นตรวจสอบเป็นครั้งคราว
Pavel Chuchuva

3

ฉันคิดว่าวิธีที่ดีที่สุดในการค้นหาความคืบหน้าในการกู้คืนหรือสำรองข้อมูลของคุณโดยใช้แบบสอบถามต่อไปนี้:

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

คำค้นหาด้านบนระบุเซสชันด้วยตัวเองและดำเนินการเปอร์เซ็นต์ความคืบหน้าทุกครั้งที่คุณกด F5 หรือปุ่มดำเนินการบน SSMS!

ข้อความค้นหาดำเนินการโดยคนที่เขียนโพสต์นี้



2

เลือก session_id เป็น SPID, คำสั่ง, start_time, percent_complete, dateadd (วินาที, ค่าโดยประมาณ _completion_time / 1000, getdate ()) เป็นค่าประมาณ completion_time, a.text เป็นแบบสอบถามจาก sys.dm_exec_requests r CROSS APPLY sys.dm_exechand_sql_ WHtext (rle. คำสั่งใน ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')


1

สำหรับใครก็ตามที่ใช้ SQL Server บน RDS (AWS) จะมีขั้นตอนในตัวที่เรียกได้ในmsdbฐานข้อมูลซึ่งให้ข้อมูลที่ครอบคลุมสำหรับงานสำรองและกู้คืนทั้งหมด:

exec msdb.dbo.rds_task_status;

สิ่งนี้จะให้รายละเอียดทั้งหมดของแต่ละงานการกำหนดค่ารายละเอียดเกี่ยวกับการดำเนินการ (เช่นเปอร์เซ็นต์ที่เสร็จสมบูรณ์และระยะเวลาทั้งหมด) และtask_infoคอลัมน์ที่มีประโยชน์อย่างมากเมื่อพยายามค้นหาว่าเกิดอะไรขึ้นกับการสำรองข้อมูลหรือการกู้คืน


1

ฉันมีปัญหาที่คล้ายกันเมื่อทำงานกับการดำเนินการคืนค่าฐานข้อมูลบน 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

จากนั้นฉันเปลี่ยนไปที่แท็บข้อความของหน้าต่างสคริปต์เพื่อดูความคืบหน้าของการดำเนินการคืนค่าฐานข้อมูล :

ป้อนคำอธิบายภาพที่นี่

หากคุณต้องการรับข้อมูลเพิ่มเติมหลังจากการดำเนินการคืนค่าฐานข้อมูลคุณสามารถใช้คำสั่งนี้ที่แนะนำโดยeythort :

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

นั่นคือทั้งหมด

ฉันหวังว่านี่จะช่วยได้


0

เพื่อตรวจสอบการสำรองข้อมูลหรือคืนค่าความคืบหน้าโดยแยกจากเซสชันที่เริ่มต้นการสำรองข้อมูลหรือกู้คืน ไม่ต้องใช้เครื่องมือของบุคคลที่สาม ทดสอบบน Microsoft SQL Server 2012

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

0

ฉันใช้ sp_whoisactive ซึ่งให้ข้อมูลเป็นมาตรฐานอุตสาหกรรมโดยทั่วไป มันคืนค่าเปอร์เซ็นต์ที่สมบูรณ์เช่นกัน


-1

เพียงแค่เรียกใช้ bkp_status บนฐานข้อมูลหลักคุณจะได้รับสถานะการสำรองข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.