هل هناك برنامج نصي SQL التي يمكن استخدامها لتحديد التقدم المحرز في SQL Server النسخ الاحتياطي أو الاستعادة العملية ؟

StackOverflow https://stackoverflow.com/questions/152447

  •  02-07-2019
  •  | 
  •  

سؤال

عندما النسخ الاحتياطي أو استعادة قاعدة البيانات باستخدام MS SQL Server إدارة Studio, أحصل على إشارة مرئية من مدى العملية تقدم ، وبالتالي متى ما زلت في حاجة إلى الانتظار حتى الانتهاء.إذا لم يبدأ النسخ الاحتياطي أو الاستعادة مع السيناريو, هل هناك طريقة لرصد التقدم المحرز ، أو هل أنا مجرد الجلوس والانتظار حتى الانتهاء (على أمل أن لا شيء قد ذهب خاطئ؟)

تحرير: بلدي تحتاج على وجه التحديد أن تكون قادرة على رصد النسخ الاحتياطي أو استعادة التقدم منفصلة تماما عن الدورة حيث النسخ الاحتياطي أو الاستعادة شرع.

هل كانت مفيدة؟

المحلول

نعم.إذا كنت قد قمت بتثبيت sp_who2k5 في قاعدة البيانات الرئيسية ، يمكنك ببساطة تشغيل:

sp_who2k5 1,1

Resultset سوف تشمل جميع المعاملات النشطة.حاليا بتشغيل النسخ الاحتياطي(ق) تحتوي على السلسلة "النسخ الاحتياطي" في requestCommand الحقل.اسم على مسمى percentComplete المجال سوف تعطيك تقدم النسخ الاحتياطي.

ملاحظة:sp_who2k5 يجب أن تكون جزءا من الجميع أدوات يفعل أكثر من هذا.

نصائح أخرى

لقد وجدت هذه عينة البرنامج النصي هنا التي يبدو أن تعمل بشكل جيد:

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

إذا كنت تعرف 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

هنا سيناريو بسيط عموما لا حيلة لي:

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

استخدام الإحصائيات في الأمر النسخ الاحتياطي إذا كان مجرد سيناريو.

داخل الرمز هو قليلا أكثر تعقيدا.في ODBC على سبيل المثال ، يمكنك تعيين SQL_ATTR_ASYNC_ENABLE ثم ابحث عن SQL_STILL_EXECUTING رمز الإرجاع ، والقيام ببعض النداءات المتكررة من SQLExecDirect حتى تحصل على SQL_SUCCESS (أو eqiv).

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

البرنامج النصي التحقق من النسخ الاحتياطي واستعادة التقدم في SQL 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')

استخدام الخيار احصائيات: http://msdn.microsoft.com/en-us/library/ms186865.aspx

أعتقد أن أفضل طريقة لمعرفة كيفية النسخ الاحتياطي أو الاستعادة التقدم عن طريق الاستعلام التالي:

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!

الاستعلام كان يؤديها الرجل الذي يكتب هذا بعد

حاول مع :

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

رصد النسخ الاحتياطي أو استعادة التقدم منفصلة تماما عن الدورة حيث النسخ الاحتياطي أو الاستعادة شرع.لا يوجد طرف ثالث الأدوات المطلوبة.اختبار في Microsoft SQL Server عام 2012.

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

أنا باستخدام sp_whoisactive, مفيدة للغاية وهو في الأساس معيار الصناعة.فإنه يعود في المئة كاملة كذلك.

إضافة STATS=10 أو 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.

حدد session_id drop كما SPID الأمر ، start_time, percent_complete, dateadd(الثانية ، estimated_completion_time/1000 ، getdate()) كما estimated_completion_time, أ.نص الاستعلام من sys.dm_exec_requests r عبر تطبيق sys.dm_exec_sql_text(r.sql_handle) ، حيث r.الأمر في ('النسخ الاحتياطي قاعدة البيانات', 'سجل النسخ الاحتياطي', 'استعادة قاعدة البيانات', 'سجل الاستعادة')

ببساطة تشغيل bkp_status على سيد db سوف تحصل على حالة النسخ الاحتياطي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top