2008-09-30 12 views
79

Podczas tworzenia kopii zapasowej lub przywracania bazy danych za pomocą programu MS SQL Server Management Studio uzyskuję wizualne wskazanie, jak daleko posunął się proces, a tym samym, jak długo jeszcze potrzebuję czekać na jego zakończenie. Gdybym inauguracją kopii zapasowej lub przywracania ze skryptu, czy istnieje sposób, aby monitorować postęp, czy mogę po prostu usiąść i czekać na to, aby zakończyć (w nadziei, że nic się nie popsuło?)Czy istnieje skrypt SQL, którego można użyć do określenia postępu procesu tworzenia kopii zapasowej lub przywracania programu SQL Server?

edycja: Moją potrzebą jest, aby móc monitorować postęp kopii zapasowej lub przywracania całkowicie oddzielony od sesji, w której zainicjowano tworzenie kopii zapasowej lub przywracanie.

Odpowiedz

7

Tak. Jeśli zainstalowano sp_who2k5 do swojej bazy danych master, można po prostu uruchomić:

sp_who2k5 1,1 

wynikowego będzie zawierała wszystkie aktywne transakcje. Aktualnie uruchomione kopie zapasowe będą zawierać ciąg "BACKUP" w polu requestCommand. Pole o trafnej nazwie o nazwie percentComplete wyświetli postęp kopii zapasowej.

Uwaga: sp_who2k5 powinien być częścią zestawu narzędzi każdego użytkownika, ma o wiele więcej, niż tylko to.

+0

Uważaj na dziwne cytaty w kodzie dla sp_who2k5 !! Musiał zastąpić "z", aby to zadziałało –

3
+0

ile ja czegoś brakuje, to mnie ogranicza, aby uzyskać informacje zwrotne w tej samej sesji jako ten, w którym ja rozpocząć tworzenie kopii zapasowej. W naszym przypadku uruchamiamy przywracanie DB z zaplanowanym plikiem BAT o 4 nad ranem i chcę połączyć się z serwerem 3 lub 4 godziny później i określić postęp. – Veldmuis

+0

Myślę, że możesz przekierować wyjście skryptu do pliku dziennika, a następnie go od czasu do czasu sprawdzać. –

190

znalazłem ten przykładowy skrypt here, który wydaje się być całkiem dobrze działa:

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

Podany link źródłowy nie wskazuje już tego artykułu. Jest to zaktualizowane: http://sql-articles.com/scripts/estimated-time-for-backup-restore/ – Marien

+0

Nawet jeśli przywracanie trwało 15 minut, po prostu zapisuje 0% postępu. Jest to duża baza danych (80 koncertów). Jakieś inne sugestie? – user64141

+5

@ user63141; przywracanie rozpoczyna się od przydzielenia pliku. Jeśli nic nie zrobiłeś, Inicjalizacja plików błyskawicznych jest niedozwolona (zobacz https://msdn.microsoft.com/en-us/library/ms175935.aspx). Może to zająć trochę czasu, jeśli masz stare dyski lub dużą bazę danych –

4

STATYSTYKI użytku w poleceniu BACKUP jeśli jest to tylko scenariusz.

Kod wewnętrzny jest nieco bardziej skomplikowany. Na przykład w ODBC ustawiasz SQL_ATTR_ASYNC_ENABLE, a następnie szukasz kodu powrotu SQL_STILL_EXECUTING i wykonujesz kilka powtarzających się wywołań SQLExecDirect, dopóki nie uzyskasz SQL_SUCCESS (lub eqiv).

8

Jeśli znasz sessionid następnie można użyć następujących:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62 

Albo jeśli chcesz sprowadzić:

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

To faktycznie działało dobrze dla mnie Polecenie SELECT, procent_complete, czas_początkowy Z sys.dm_exec_requests gdzie polecenie = 'PRZYWRÓĆ BAZY DANYCH' – eythort

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

Aby monitorować kopii zapasowej lub przywracania postępu całkowicie oddzielone od sesji, w której zainicjowano tworzenie kopii zapasowej lub przywracanie. Nie są wymagane żadne narzędzia innych firm. Testowane na Microsoft SQL Server 2012.

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

Oto prosty skrypt, który zazwyczaj wystarcza dla mnie:

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

Myślę, że najlepszym sposobem, aby dowiedzieć się, w jaki sposób przywrócić lub postęp tworzenia kopii zapasowej przez następujące zapytanie:

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 

zapytanie powyżej identyfikacji sesji sama i wykonać procentowy postęp każdym naciśnięciu klawisza F5 lub przycisk Execute na SSMS!

Zapytanie zostało przeprowadzone przez faceta, który piszę to post

0

Używam sp_whoisactive, bardzo pouczające zasadzie standardem przemysłowym. Zwraca również procent.

0

wystarczy uruchomić bkp_status na mistrza db otrzymasz stanu kopii zapasowej

Powiązane problemy