Có tập lệnh SQL nào mà tôi có thể sử dụng để xác định tiến trình của quá trình sao lưu hoặc khôi phục SQL Server không?


94

Khi tôi sao lưu hoặc khôi phục cơ sở dữ liệu bằng MS SQL Server Management Studio, tôi nhận được chỉ báo trực quan về quá trình đã tiến triển đến đâu và do đó tôi vẫn cần đợi thêm bao lâu nữa để quá trình kết thúc. Nếu tôi bắt đầu sao lưu hoặc khôi phục bằng tập lệnh, có cách nào để theo dõi tiến trình không, hay tôi chỉ cần ngồi lại và đợi quá trình hoàn tất (hy vọng rằng không có gì sai?)

Đã chỉnh sửa: Đặc biệt nhu cầu của tôi là có thể theo dõi tiến trình sao lưu hoặc khôi phục hoàn toàn tách biệt với phiên bắt đầu sao lưu hoặc khôi phục.

Câu trả lời:


12

Đúng. Nếu bạn đã cài đặt sp_who2k5 vào cơ sở dữ liệu chính của mình, bạn chỉ cần chạy:

sp_who2k5 1,1

Tập kết quả sẽ bao gồm tất cả các giao dịch đang hoạt động. (Các) bản sao lưu hiện đang chạy sẽ chứa chuỗi "BACKUP" trong trường requestCommand . Trường phần trămComplete được đặt tên phù hợp sẽ cung cấp cho bạn tiến trình sao lưu.

Lưu ý: sp_who2k5 nên là một phần của bộ công cụ của mọi người, nó còn làm được nhiều điều hơn là chỉ cái này.


Hãy coi chừng những dấu ngoặc kép kỳ lạ trong mã sp_who2k5 !! Phải thay thế 'với' để làm việc này
Dinglemeyer NeverGonnaGiveUUp

Tôi nhận ra đây là một chủ đề rất cũ nhưng liên kết để lấy proc được lưu trữ đã chết.
John Waclawski

216

Tôi tìm thấy tập lệnh mẫu này ở đây có vẻ đang hoạt động khá tốt:

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
Liên kết nguồn được cung cấp không trỏ đến bài viết nữa. Đây là bản cập nhật: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien

Mặc dù quá trình khôi phục đã diễn ra trong 15 phút, nó chỉ ghi lại tiến trình 0%. Nó là một cơ sở dữ liệu lớn (80 hợp đồng biểu diễn). Bất cứ một đề nghị nào khác?
user64141

5
@ người dùng63141; quá trình khôi phục bắt đầu bằng phân bổ tệp. Nếu bạn chưa làm bất cứ điều gì, thì Khởi tạo tệp tức thì không được phép (xem msdn.microsoft.com/en-us/library/ms175935.aspx ). Nó có thể mất nhiều thời gian, nếu bạn có đĩa cũ hoặc một cơ sở dữ liệu lớn
Henrik Staun Poulsen

2
Không có hàng nào trong đầu ra khi tôi thực hiện truy vấn này
goutam

1
Tôi nghĩ rằng, Nếu bạn thêm 'RESTORE HEADERON' vào danh sách trong mệnh đề WHERE, bạn cũng sẽ nhận được tiến độ đối với bất kỳ công việc xác minh sao lưu nào cũng diễn ra sau đó.
goorj

16

Nếu bạn biết sessionID thì bạn có thể sử dụng như sau:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Hoặc nếu bạn muốn thu hẹp nó lại:

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

6
Điều này thực sự hoạt động tốt đối với tôi lệnh SELECT, phần trăm_complete, start_time FROM sys.dm_exec_requests nơi command = 'KHÔI PHỤC CƠ SỞ DỮ LIỆU'
eythort

10

Đây là một tập lệnh đơn giản thường làm được mẹo đối với tôi:

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

Tập lệnh để kiểm tra tiến trình Sao lưu và Khôi phục trong SQL Server :

Nhiều khi xảy ra trường hợp hoạt động sao lưu (hoặc khôi phục) của bạn đã được bắt đầu bởi Quản trị viên cơ sở dữ liệu khác hoặc do một công việc và bạn không thể sử dụng GUI bất kỳ thứ gì khác để kiểm tra tiến trình của việc Sao lưu / Khôi phục đó.

Bằng cách kết hợp nhiều lệnh, tôi đã tạo tập lệnh dưới đây có thể cung cấp cho chúng tôi bản tóm tắt về các bản sao lưu và khôi phục hiện tại đang diễn ra trên máy chủ.

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

Sử dụng STATS trong lệnh BACKUP nếu nó chỉ là một script.

Mã bên trong nó phức tạp hơn một chút. Ví dụ: trong ODBC, bạn đặt SQL_ATTR_ASYNC_ENABLE rồi tìm mã trả về SQL_STILL_EXECUTING và thực hiện một số lệnh gọi lặp lại SQLExecDirect cho đến khi bạn nhận được SQL_SUCCESS (hoặc eqiv).


4

Hãy thử wih:

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

Trừ khi tôi thiếu thứ gì đó, điều này hạn chế tôi nhận được phản hồi trong cùng phiên với phiên mà tôi bắt đầu sao lưu. Trong trường hợp của chúng tôi, chúng tôi bắt đầu khôi phục DB với tệp BAT đã lên lịch vào lúc 4 giờ sáng và tôi muốn kết nối với máy chủ 3 hoặc 4 giờ sau đó và xác định tiến trình.
Veldmuis 30/09/08

Tôi nghĩ bạn có thể chuyển hướng đầu ra tập lệnh đến tệp nhật ký và sau đó kiểm tra nó theo thời gian.
Pavel Chuchuva

3

Tôi nghĩ rằng cách tốt nhất để tìm hiểu tiến trình khôi phục hoặc sao lưu của bạn như thế nào bằng truy vấn sau:

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

Truy vấn ở trên, tự xác định phiên và thực hiện tiến trình phần trăm mỗi khi bạn nhấn F5 hoặc nút Execute trên SSMS!

Người viết bài này đã thực hiện truy vấn


1

Thêm STATS=10hoặc STATS=1trong lệnh sao lưu.

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.

1

CHỌN session_id làm SPID, lệnh, start_time, phần trăm_complete, dateadd (thứ hai, ước tính_completion_time / 1000, getdate ()) dưới dạng ước tính_completion_time, a.text AS Truy vấn FROM sys.dm_exec_requests r CROSS ÁP DỤNG sys.dm_exec_sql_text (r.sql_handr). lệnh trong ('CƠ SỞ DỮ LIỆU DỰ PHÒNG', 'NHẬT KÝ DỰ PHÒNG', 'PHỤC HỒI CƠ SỞ DỮ LIỆU', 'PHỤC HỒI NHẬT KÝ')


1

Đối với bất kỳ ai đang chạy SQL Server trên RDS (AWS), có một thủ tục tích hợp có thể gọi được trong msdbcơ sở dữ liệu cung cấp thông tin toàn diện cho tất cả các tác vụ sao lưu và khôi phục:

exec msdb.dbo.rds_task_status;

Điều này sẽ cung cấp tóm tắt đầy đủ về từng tác vụ, cấu hình của nó, thông tin chi tiết về việc thực thi (chẳng hạn như tỷ lệ phần trăm hoàn thành và tổng thời lượng) và một task_infocột vô cùng hữu ích khi cố gắng tìm ra vấn đề với bản sao lưu hoặc khôi phục.


0

Để theo dõi tiến trình sao lưu hoặc khôi phục hoàn toàn tách biệt với phiên bắt đầu sao lưu hoặc khôi phục. Không yêu cầu công cụ của bên thứ ba. Đã thử nghiệm trên Microsoft SQL Server 2012.

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

0

Tôi đang sử dụng sp_whoisactive, rất nhiều thông tin, một tiêu chuẩn ngành về cơ bản. nó cũng trả về phần trăm hoàn thành.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.