SQL-Server: Bir SQL Server yedekleme veya geri yükleme işleminin ilerlemesini belirlemek için kullanabileceğim bir SQL komut dosyası var mı?


97

MS SQL Server Management Studio kullanarak bir veritabanını yedeklediğimde veya geri yüklediğimde, işlemin ne kadar ilerlediğini ve dolayısıyla bitmesi için daha ne kadar beklemem gerektiğini görsel olarak görüyorum. Bir komut dosyasıyla yedeklemeyi veya geri yüklemeyi başlatırsam, ilerlemeyi izlemenin bir yolu var mı yoksa sadece arkanıza yaslanıp bitmesini mi bekliyorum (hiçbir şeyin ters gitmediğini umarak?)

Düzenlendi: İhtiyacım, özellikle yedekleme veya geri yükleme ilerlemesini, yedekleme veya geri yüklemenin başlatıldığı oturumdan tamamen ayrı olarak izleyebilmek.

Yanıtlar:


12

Evet. Eğer yüklediyseniz sp_who2k5 efendin veritabanına, sadece çalıştırabilirsiniz:

sp_who2k5 1,1

Sonuç kümesi tüm aktif işlemleri içerecektir. Şu anda çalışan yedekler, requestCommand alanında "BACKUP" dizesini içerecektir . Uygun şekilde adlandırılmış percentComplete alanı size yedeklemenin ilerlemesini verecektir.

Not: sp_who2k5 herkesin araç setinin bir parçası olmalıdır, bundan çok daha fazlasını yapar.


Sp_who2k5 kodundaki tuhaf alıntılara dikkat edin !! Bunu çalıştırmak için 'ile' değiştirmek zorunda kaldı
Dinglemeyer NeverGonnaGiveUUp

Bunun çok eski bir iş parçacığı olduğunun farkındayım, ancak depolanan proc'u alma bağlantısı kesildi.
John Waclawski

220

Oldukça iyi çalışıyor gibi görünen bu örnek komut dosyasını burada buldum :

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
Sağlanan kaynak bağlantısı artık makaleye işaret etmiyor. Bu güncellenmiş olanıdır: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien

Geri yükleme 15 dakikadır devam etse de, yalnızca% 0 ilerleme kaydeder. Büyük bir veritabanıdır (80 gig). Başka öneriniz var mı?
user64141

5
@ user63141; geri yükleme, bir dosya tahsisi ile başlar. Hiçbir şey yapmadıysanız, Anında Dosya Başlatma'ya izin verilmez (bkz. Msdn.microsoft.com/en-us/library/ms175935.aspx ). Eski diskleriniz veya büyük bir veritabanınız varsa bu biraz zaman alabilir
Henrik Staun Poulsen

2
Bu sorguyu çalıştırdığımda çıktıda satır yok
goutam

1
Bence, WHERE cümlesindeki listeye 'RESTORE HEADERON' eklerseniz, daha sonra çalıştırılan tüm yedekleme doğrulama işlerinde de ilerleme kaydedersiniz.
goorj

17

Oturum kimliğini biliyorsanız, aşağıdakileri kullanabilirsiniz:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Veya onu daraltmak istiyorsanız:

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

7
Bu aslında benim için iyi çalıştı SELECT komutu, percent_complete, start_time FROM sys.dm_exec_requests burada command = 'RESTORE DATABASE'
eythort

13

İşte benim için genellikle işe yarayan basit bir komut dosyası:

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'da Yedekleme ve Geri Yükleme ilerlemesini kontrol etmek için komut dosyası :

Çoğu zaman yedekleme (veya geri yükleme) etkinliğiniz başka bir Veritabanı Yöneticisi tarafından veya bir iş tarafından başlatılmıştır ve bu Yedekleme / Geri Yükleme işleminin ilerlemesini kontrol etmek için GUI'yi başka hiçbir şey kullanamazsınız.

Birden fazla komutu birleştirerek, bize sunucuda gerçekleşen mevcut yedeklemelerin ve geri yüklemelerin bir özetini verebilecek aşağıdaki komut dosyasını oluşturdum.

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

Yalnızca bir komut dosyasıysa YEDEKLEME komutunda STATS kullanın.

Kodun içi biraz daha karmaşıktır. Örneğin ODBC'de, SQL_ATTR_ASYNC_ENABLE'ı ayarlarsınız ve sonra SQL_STILL_EXECUTING dönüş kodunu ararsınız ve bir SQL_SUCCESS (veya eqiv) elde edene kadar SQLExecDirect'in bazı tekrarlanan çağrılarını yaparsınız.


4

Aşağıdakileri deneyin:

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

Bir şeyi kaçırmıyorsam, bu, geribildirimi yedeklemeyi başlattığım oturumla aynı oturumda almamı sınırlıyor. Bizim durumumuzda, planlanmış bir BAT dosyasıyla sabah 4'te bir DB geri yüklemesini başlatıyoruz ve 3 veya 4 saat sonra sunucuya bağlanmak ve ilerlemeyi belirlemek istiyorum.
Veldmuis

Betik çıktısını günlük dosyasına yönlendirebileceğinizi ve daha sonra zaman zaman inceleyebileceğinizi düşünüyorum.
Pavel Chuchuva

3

Geri yükleme veya yedekleme ilerlemenizin nasıl olduğunu öğrenmenin en iyi yolunun aşağıdaki sorgu olduğunu düşünüyorum:

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

Yukarıdaki sorgu, oturumu kendi kendine tanımlar ve SSMS'de F5 veya Yürüt düğmesine her bastığınızda yüzde bir ilerleme gerçekleştirin!

Sorgu bunu yazmak adam tarafından gerçekleştirildi yazı


2

Yedekleme komutu ekleyin STATS=10veya ekleyin 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.

2

Sys.dm_exec_requests r CROSS UYGULAMA sys.dm_exec_sql_text (r.sqlEr.sql_handle.) komut ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')


1

RDS (AWS) üzerinde SQL Server çalıştıran herkes için, tüm yedekleme ve geri yükleme görevleri için kapsamlı bilgiler sağlayan veritabanında çağrılabilir yerleşik bir prosedür vardırmsdb :

exec msdb.dbo.rds_task_status;

Bu, her görevin tam bir özetini, yapılandırmasını, yürütmeyle ilgili ayrıntıları (tamamlanan yüzde ve toplam süre gibi) ve task_infobir yedekleme veya geri yüklemede neyin yanlış olduğunu anlamaya çalışırken son derece yararlı olan bir sütun verecektir .


1

MS SQL Server 2012'de Veritabanı geri yükleme işlemi üzerinde çalışırken benzer bir sorun yaşadım.

Ancak, kendi senaryom için, betik penceresinde VERİTABANI GERİ YÜKLEME işleminin ilerlemesini görmem gerekiyordu.

Tek yapmam gereken, STATS seçeneğini betiğe eklemekti:

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

Ve sonra VERİ TABANI GERİ YÜKLEME işleminin ilerlemesini görmek için Komut Dosyası penceresinin Mesajlar sekmesine geçtim :

görüntü açıklamasını buraya girin

VERİTABANI GERİ YÜKLEME işleminden sonra daha fazla bilgi almak istiyorsanız eythort tarafından önerilen bu komutu kullanabilirsiniz :

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

Bu kadar.

Umarım bu yardımcı olur


0

Yedekleme veya geri yükleme ilerlemesini, yedekleme veya geri yüklemenin başlatıldığı oturumdan tamamen ayrı olarak izlemek için. Üçüncü taraf araçlara gerek yoktur. Microsoft SQL Server 2012'de test edilmiştir.

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

0

Sp_whoisactive, oldukça bilgilendirici bir temelde endüstri standardı kullanıyorum. tamamlanma yüzdesini de döndürür.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.