किसी भी अन्य घटना के बाद स्वचालित रूप से निष्पादित प्रक्रिया


9

SQL Server 2008 R2 मानक को किसी भी दिए गए डेटाबेस में संग्रहीत प्रक्रिया को स्वचालित रूप से निष्पादित करना संभव है जो कि पुनर्स्थापित या उदाहरण के लिए संलग्न है?

मैं एक सर्वर स्तर ट्रिगर बनाकर समाधान के करीब पहुंच गया हूं जो DDL घटना के बाद किसी संग्रहीत डेटाबेस में संग्रहीत कार्यविधि को निष्पादित करता है CREATE_DATABASEया ALTER_DATABASEनिकाल दिया जाता है। दुर्भाग्य से, यह डेटाबैक बैकअप बैकअप के लिए काम नहीं करता है।

विस्तृत करने के लिए, हमारे पास एक 'क्लीन अप' संग्रहीत कार्यविधि है जो हर डेटाबेस में मौजूद है जिसे हम पुनर्स्थापित करते हैं और मैं एक तरीका खोज रहा हूं कि जब भी कोई बैकअप उदाहरण के लिए पुनर्स्थापित हो जाए तो यह स्वचालित रूप से निष्पादित हो जाए।

Googling ने मुझे इस कार्यक्षमता को प्राप्त करने के लिए SQL सर्वर में ऑडिट या नीतियों को कॉन्फ़िगर करने के लिए कहा है , लेकिन ये विशेषताएं पहली नज़र में काफी भारी हैं, इसलिए मैं यह नहीं बता सकता कि क्या ऑडिट या पॉलिसियाँ जांच शुरू करने के लिए पर्याप्त हैं।

जवाबों:


10

क्या पुनर्स्थापना खत्म होने के तुरंत बाद इसे निष्पादित करना पड़ता है, या इसे थोड़ी देरी हो सकती है? एक विचार मेरे पास था कि एक नौकरी है जो हर मिनट चलती है, और Audit Backup/Restore Eventडिफ़ॉल्ट ट्रेस के लिए जाँच करता है ।

DECLARE @fn VARCHAR(MAX);

SELECT @fn = SUBSTRING([path], 0, LEN([path])-CHARINDEX(CHAR(92), REVERSE([path]))+1) 
  + CHAR(92) + 'Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT 
    DatabaseName,
    StartTime, 
    TextData
FROM sys.fn_trace_gettable(@fn, DEFAULT)  
WHERE EventClass = 115
AND TextData LIKE '%RESTORE%'; -- since can't differentiate between backup/restore

आप पहले से ही StartTime के आधार पर किए गए क्लीनअप्स को स्टोर कर सकते हैं, और यहां तक ​​कि ट्रेस क्वेरी को सीमित कर सकते हैं जो हर मिनट (या जो भी आपकी स्वीकार्य देरी सीमा है) केवल आपके द्वारा खींची गई अंतिम पंक्ति, या अंतिम से अधिक StartTime मूल्यों को देखने के लिए है समय काम चला, जो भी कम हो।


1
बहुत चालाक, अच्छी सोच। +1
थॉमस स्ट्रिंगर

थोड़ी देरी स्वीकार्य होगी। मैं इसे आज़माने जा रहा हूं।
मैथ्यू रस्टन

1
ध्यान दें कि मैंने पुष्टि नहीं की है कि सभी मामलों में ट्रेस पंक्ति लिखे जाने से पहले घटना वास्तव में समाप्त हो गई है। मुझे संदेह है कि यह एक घटना के बाद का लेखन है लेकिन मैं केवल इसलिए संदिग्ध हूं क्योंकि EndTimeकभी भी ऐसा लगता नहीं है कि यह आबादी है। यह मामला हो सकता है कि आपको डेटाबेस से कनेक्ट करने का प्रयास करना चाहिए और, यदि आप नहीं कर सकते हैं, तो इसे छोड़ दें और इस पुनर्स्थापना घटना को दस्तावेज़ न करें, लेकिन अगली बार जब नौकरी चलती है, तो फिर से प्रयास करें। मैं कोशिश करूंगा और मान्य करूंगा लेकिन मेरे स्थानीय वीएम पर मेरे पास केवल एसएसडी है, लेकिन उनके पास डिस्क स्थान नहीं है ताकि वे व्यवहार को सही ढंग से देख सकें। :-)
हारून बर्ट्रेंड

6

database_started विस्तारित घटना के बाद एक डेटाबेस पुनर्स्थापित किया जाता है सक्रिय किया जाता है।

एक ईवेंट सत्र बनाएं जो database_idफ़ील्ड को उस विधेय के साथ कैप्चर करता है जो फ़ील्ड %RESTORE%में दिखता है sql_text(नोट: मेरा मानना ​​है कि यह पर्याप्त है - आप अपने लिए परीक्षण करना चाहेंगे)।

मैं विस्तारित ईवेंट के साथ पर्याप्त रूप से परिचित नहीं हूं कि आप इस घटना पर प्रतिक्रिया देने का सबसे अच्छा तरीका बताएं। यह अच्छा होगा यदि आप सीधे संग्रहीत प्रक्रिया को आग लगा सकते हैं; मुझे नहीं पता कि यह संभव है, हालांकि। हालाँकि, आप निश्चित रूप से ईवेंट बफ़र को प्रदूषित कर सकते हैं, और वह डिफ़ॉल्ट ट्रेस को स्कैन करने के लिए बेहतर है - न केवल प्रदर्शन कारणों के लिए, लेकिन अगर सर्वर बहुत व्यस्त है और मतदान अंतराल बहुत लंबा है, तो आप गुम घटनाओं को एकमुश्त समाप्त कर सकते हैं। विस्तारित ईवेंट विधि के साथ, एक ईवेंट गुम होना बहुत संभावना नहीं होगी।


4

जैसा कि आप डीडीएल घटनाओं की सूची से देख सकते हैं , डीडीएल ट्रिगर आपकी आवश्यकता के लिए पर्याप्त स्पष्ट नहीं हो सकता है।

मैं पुनर्स्थापना या संलग्न करने के लिए एक PowerShell स्क्रिप्ट लिखने की सलाह दूंगा और फिर तुरंत बाद संग्रहीत कार्यविधि निष्पादित करूंगा । ध्यान रखें, आपकी दुकान को एक विशिष्ट पुनर्स्थापना या संलग्न के बजाय इसका उपयोग करने का निर्देश देना होगा।

दुर्भाग्य से मुझे विश्वास नहीं है कि इसे पूरा करने का एक अंतर्निहित तरीका है।


4

आप अपना बैकअप कैसे चला रहे हैं? यदि आप अपने बैकअप के बाद एसपी को चलाने के लिए देख रहे हैं, तो आप इसे नौकरी में किसी अन्य कार्य के रूप में सेट कर सकते हैं, यदि आप उनका उपयोग कर रहे हैं, या रखरखाव योजना।

तो आप ईवेंट लॉग में लिखने के लिए ऑडिटिंग सेट कर सकते हैं और फिर एक अलर्ट बना सकते हैं जो नौकरी निष्पादित करेगा। यह जटिल लगता है लेकिन यह वही करेगा जो आप पूछ रहे हैं।

निम्नलिखित कोड पर एक नज़र डालें:

--Create the Server Audit
USE master
GO
CREATE SERVER AUDIT BackupTrap
TO APPLICATION_LOG
WITH (QUEUE_DELAY = 0, ON_FAILURE = CONTINUE)
GO

--Turn the Audit On
ALTER SERVER AUDIT BackupTrap
WITH (STATE = ON)
GO

--Create the Database Audit Specification
USE AdventureWorks2012
GO
CREATE DATABASE AUDIT SPECIFICATION BackupTrapAdventureWorks
FOR SERVER AUDIT BackupTrap
    ADD (BACKUP_RESTORE_GROUP)
WITH (STATE = ON)
GO

--Create the job to run
USE msdb
GO
EXECUTE dbo.sp_add_job
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobserver
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobstep
    @job_name = N'BackupAlertJob',
    @step_name = N'RunSP',
    @subsystem = N'TSQL',
    @command = N'EXECUTE dbo.MyStoredProcedure',
    @database_name = N'AdventureWorks2012'
GO

एक बहाल नौकरी जो इसे कैप्चर करती है वह एक अच्छा विचार है। हालांकि, मुझे आश्चर्य है कि अगर ओपी को "किसी भी" पुनर्स्थापना घटना को पकड़ना है, तो यह एक पूर्ण समाधान है।
निक चामास

किसी भी पुनर्स्थापना घटना के पूरा होने के बाद एक मनमानी संग्रहीत प्रक्रिया को निष्पादित करने में सक्षम होना वास्तव में वही है जो हम बाद में हैं। फिर भी एक मान्य सुझाव।
मैथ्यू रस्टोन

मैंने अपना दूसरा उत्तर हटा दिया और जानकारी को शामिल करने के लिए उपरोक्त को संपादित किया। उस एक पर टिप के लिए @Shark धन्यवाद। पूरी तरह से ऐसा करने के बारे में नहीं सोचा था।
jgardner04

0

आप अपना बैकअप कैसे चला रहे हैं? Commvault के साथ आप एक स्वचालित रिस्टोर जॉब सेट कर सकते हैं और इसमें प्री और पोस्ट रिस्टोर स्क्रिप्ट्स को रन कर सकते हैं जो SQL या पावरशेल हो सकती हैं। मैं संस्करण के अंतर के लिए DDL चलाने के लिए और परिवेशों के बीच पुनर्स्थापित करते समय अनुमतियों को बैकअप और पुनर्स्थापित करने के लिए हर समय ऐसा करता हूं।

मेरा मानना ​​है कि नेटबैकअप अन्य उत्पादों की समान कार्यक्षमता हो सकती है

यदि आप एसक्यूएल का उपयोग करते हैं, तो बस इसे डेटाबेस को पुनर्स्थापित करने वाले कार्य के चरण के रूप में जोड़ें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.