SQL-Server: Apakah ada skrip SQL yang dapat saya gunakan untuk menentukan kemajuan proses pencadangan atau pemulihan SQL Server?

95

Ketika saya membuat cadangan atau memulihkan database menggunakan MS SQL Server Management Studio, saya mendapatkan indikasi visual tentang seberapa jauh proses telah berkembang, dan dengan demikian berapa lama lagi saya masih harus menunggu sampai selesai. Jika saya memulai pencadangan atau pemulihan dengan skrip, apakah ada cara untuk memantau kemajuan, atau apakah saya hanya duduk dan menunggu hingga selesai (berharap tidak ada yang salah?)

Diedit: Kebutuhan saya secara khusus adalah untuk dapat memantau kemajuan pencadangan atau pemulihan sepenuhnya terpisah dari sesi tempat pencadangan atau pemulihan dimulai.

Veldmuis
sumber

Jawaban:

12

Iya. Jika Anda telah menginstal sp_who2k5 ke dalam database master, Anda dapat menjalankan:

sp_who2k5 1,1

Kumpulan hasil akan mencakup semua transaksi aktif. Cadangan yang saat ini dijalankan akan berisi string "BACKUP" di bidang requestCommand . Bidang persenComplete yang diberi nama tepat akan memberi Anda kemajuan pencadangan.

Catatan: sp_who2k5 harus menjadi bagian dari toolkit semua orang, ia melakukan lebih dari itu.

Portman
sumber
Hati-hati dengan tanda kutip aneh di kode untuk sp_who2k5 !! Harus mengganti 'dengan' agar ini berfungsi
Dinglemeyer NeverGonnaGiveUUp
Saya menyadari ini adalah utas yang sangat lama tetapi tautan untuk mendapatkan proc yang disimpan sudah mati.
John Waclawski
217

Saya menemukan contoh skrip di sini yang tampaknya berfungsi dengan baik:

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')
Veldmuis
sumber
2
Tautan sumber yang diberikan tidak lagi mengarah ke artikel. Ini yang terbaru: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien
Meskipun pemulihan telah berlangsung selama 15 menit, itu hanya mencatat kemajuan 0%. Ini adalah database besar (80 pertunjukan). Ada saran lain?
pengguna64141
5
@ pengguna63141; pemulihan dimulai dengan alokasi file. Jika Anda belum melakukan apa pun, maka Inisialisasi File Instan tidak diperbolehkan (lihat msdn.microsoft.com/en-us/library/ms175935.aspx ). Ini bisa memakan waktu cukup lama, jika Anda memiliki disk lama atau database besar
Henrik Staun Poulsen
2
Tidak ada baris dalam output saat saya menjalankan kueri ini
goutam
1
Saya pikir, Jika Anda menambahkan 'KEMBALIKAN HEADERON' ke daftar di klausa WHERE, Anda juga akan mendapatkan kemajuan pada pekerjaan verifikasi cadangan yang dijalankan setelahnya.
goorj
16

Jika Anda mengetahui sessionID, Anda dapat menggunakan berikut ini:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Atau jika Anda ingin mempersempitnya:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
Allen
sumber
7
Ini benar-benar bekerja dengan baik untuk saya perintah SELECT, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'
eythort
11

Berikut skrip sederhana yang umumnya melakukan trik untuk saya:

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

Script untuk memeriksa kemajuan Pencadangan dan Pemulihan di SQL Server :

Sering kali terjadi bahwa aktivitas pencadangan (atau pemulihan) Anda telah dimulai oleh Administrator Basis Data lain atau oleh pekerjaan, dan Anda tidak dapat menggunakan GUI apa pun untuk memeriksa kemajuan Pencadangan / Pemulihan tersebut.

Dengan menggabungkan beberapa perintah, saya telah menghasilkan skrip di bawah ini yang dapat memberi kita ringkasan dari cadangan dan pemulihan saat ini yang terjadi di server.

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

sumber
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')
Shahbaz I Shaikh
sumber
4

Gunakan STATS dalam perintah BACKUP jika itu hanya sebuah skrip.

Di dalam kode itu sedikit lebih rumit. Dalam ODBC misalnya, Anda menetapkan SQL_ATTR_ASYNC_ENABLE dan kemudian mencari kode kembali SQL_STILL_EXECUTING, dan melakukan beberapa panggilan berulang SQLExecDirect hingga Anda mendapatkan SQL_SUCCESS (atau eqiv).

David L Morris
sumber
4

Coba dengan:

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')
Zaalouni Mohamed
sumber
3

Gunakan opsi STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx

Pavel Chuchuva
sumber
Kecuali saya melewatkan sesuatu, ini membatasi saya untuk mendapatkan umpan balik di sesi yang sama dengan sesi di mana saya memulai pencadangan. Dalam kasus kami, kami memulai pemulihan DB dengan file BAT yang dijadwalkan pada jam 4 pagi dan saya ingin terhubung ke server 3 atau 4 jam kemudian dan menentukan kemajuannya.
Veldmuis
Saya pikir Anda dapat mengarahkan output skrip ke file log dan kemudian memeriksanya dari waktu ke waktu.
Pavel Chuchuva
3

Menurut saya, cara terbaik untuk mengetahui bagaimana pemulihan atau kemajuan pencadangan Anda adalah dengan kueri berikut:

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

Kueri di atas, identifikasi sesi itu sendiri dan lakukan persentase kemajuan setiap kali Anda menekan F5 atau tombol Jalankan di SSMS!

Permintaan dilakukan oleh orang yang menulis posting ini

BMDaemon
sumber
2

Tambahkan STATS=10atau STATS=1dalam perintah cadangan.

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.
Zaalouni Mohamed
sumber
1

PILIH session_id sebagai SPID, perintah, start_time, persen_complete, dateadd (detik, estimasi_completion_time / 1000, getdate ()) sebagai estimasi_completion_time, a.text AS Kueri DARI sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_handec_sql_text (r.sql_ERE perintah di ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

Ben
sumber
1

Untuk siapa pun yang menjalankan SQL Server di RDS (AWS), ada prosedur bawaan yang dapat dipanggil dalam msdbdatabase yang memberikan informasi lengkap untuk semua tugas pencadangan dan pemulihan:

exec msdb.dbo.rds_task_status;

Ini akan memberikan ikhtisar lengkap dari setiap tugas, konfigurasinya, detail tentang eksekusi (seperti persentase selesai dan durasi total), dan task_infokolom yang sangat membantu ketika mencoba mencari tahu apa yang salah dengan pencadangan atau pemulihan.

bsplosion
sumber
0

Untuk memantau kemajuan pencadangan atau pemulihan yang sepenuhnya terpisah dari sesi tempat pencadangan atau pemulihan dimulai. Tidak diperlukan alat pihak ketiga. Diuji di Microsoft SQL Server 2012.

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

Saya menggunakan sp_whoisactive, sangat informatif standar industri dasarnya. itu juga mengembalikan persen selesai.

RC Burung
sumber
0

Saya mengalami masalah serupa saat bekerja pada operasi pemulihan database di MS SQL Server 2012.

Namun, untuk skenario saya sendiri, saya hanya perlu melihat kemajuan operasi DATABASE RESTORE di jendela skrip

Yang harus saya lakukan hanyalah menambahkan opsi STATS ke skrip:

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

Dan kemudian saya beralih ke tab Pesan dari jendela Script untuk melihat kemajuan operasi DATABASE RESTORE :

masukkan deskripsi gambar di sini

Jika Anda ingin mendapatkan informasi lebih lanjut setelah operasi DATABASE RESTORE, Anda dapat menggunakan perintah ini yang disarankan oleh eythort :

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

Itu saja.

saya harap ini membantu

Janji Preston
sumber
-1

cukup jalankan bkp_status pada master db Anda akan mendapatkan status cadangan

ahsan Mumtaz Abbasi
sumber