डेटाबेस (DDL और DML) में किसी भी परिवर्तन का पता कैसे लगाएं


13

मेरे क्लाइंट के SQL सर्वर पर बहुत सारे डेटाबेस हैं। ये डेटाबेस विकास के अधीन हैं, इसलिए डेवलपर्स डिजाइन, रिफ्लेक्टर, डेटा संशोधन आदि कर सकते हैं। कुछ डेटाबेस हैं जो शायद ही कभी बदलते हैं। मेरे मुवक्किल को उन सभी को सुरक्षित (बैकअप) रखना है और कुछ समय पर्यावरण के प्रबंधन में लगाना है। (कंपनी में कोई डीबी प्रशासक की स्थिति नहीं है।) लंबी चर्चा के बाद, ग्राहक ने बहाल करने में आसानी के कारण दैनिक पूर्ण बैकअप रणनीति का उपयोग करने का निर्णय लिया है।

तो यहाँ स्थिति का सारांश है:

  • डेटाबेस की संख्या हर दिन भिन्न हो सकती है।
  • डेटाबेस जो बदल दिए गए थे (मतलब डेटा और / या संरचना को बदल दिया गया है) का बैकअप लिया जाएगा।
  • जो डेटाबेस नहीं बदले गए थे, उनका बैकअप नहीं लिया जाएगा।
  • समाधान डेटाबेस संरचना को प्रभावित नहीं करेगा (यह प्रतिबंधित आवश्यकता नहीं है)
  • यह "बैकअप इंजन" अपने आप काम करेगा।

मुख्य समस्या: कैसे पता लगाया जाए कि एक डेटाबेस को बदल दिया गया है। समस्या का पहला भाग (DDL परिवर्तन) DDL ट्रिगर का उपयोग करके हल किया जा सकता है । लेकिन डेटा परिवर्तन (डीएमएल परिवर्तन) एक समस्या है। परिवर्तन (प्रदर्शन, विस्तारित वस्तुओं के प्रबंधन ...) को ट्रैक करने के लिए सभी डेटाबेस के सभी तालिकाओं में डीएमएल ट्रिगर को लागू करना असंभव है। बैकअप इंजन को बैकअप के लिए तैयार के रूप में प्रत्येक डेटाबेस को चिह्नित करने के लिए सभी परिवर्तनों को ट्रैक करना होगा।

  • चेंज डेटा कैप्चर एक समाधान है लेकिन यह बहुत भारी लगता है (इसके लिए SQL सर्वर एंटरप्राइज एडिशन की भी आवश्यकता होती है)।

  • एक अन्य तरीका डेटाबेस फ़ाइल परिवर्तनों (आकार या अंतिम परिवर्तन समय) को ट्रैक करना है, लेकिन यह सही ढंग से काम नहीं करता है: एक डेटाबेस अपना आकार बदल सकता है जब यह सभी आरक्षित मुक्त स्थान से अधिक हो जाता है और sp_spaceused कोई समाधान नहीं है।

  • ट्रेसिंग एक समाधान है, लेकिन यह प्रदर्शन के मुद्दों का कारण बनता है और अतिरिक्त प्रबंधन की आवश्यकता होती है।

क्या अन्य डेटाबेस प्रबंधन वस्तुओं (जैसे आँकड़े ..) पर प्रभाव के बिना वास्तविक डेटाबेस उपयोग आकार की गणना करने के लिए कोई समाधान है? दी कि तालिका के आकार में परिवर्तन नहीं करने वाली तालिका के डेटा में परिवर्तन ट्रिगर नहीं होगा (मुझे लगता है), लेकिन यह कुछ भी नहीं से बेहतर है। वास्तव में मैं SQL Server 2008 के लिए प्रत्यक्ष या अप्रत्यक्ष समाधान की तलाश कर रहा हूं।

किसी भी टिप्पणी, समाधान और विचारों के लिए धन्यवाद।

जोड़े गए:

यहाँ समाधान है ( मारियन के लिए धन्यवाद ):

Select
    NextLSN = MAX(fn.[Current LSN])
    ,Databasename = DB_NAME()
 from fn_dblog(NULL,    NULL) fn
     LEFT JOIN sys.allocation_units au
         ON fn.AllocUnitId = au.allocation_unit_id
     LEFT  JOIN sys.partitions p
         ON p.partition_id = au.container_id
     LEFT  JOIN sys.objects so
         ON so.object_id = p.object_id  
    WHERE 
    (
        (Operation IN 
       ('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
            'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT') 
            AND so.is_ms_shipped = 0)
        OR 
        ([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
    )

तो क्या आपने इसे नौकरी के हिस्से के रूप में लागू किया या ??? मुझे पिछले 24 घंटों से एक निर्देशिका में सभी परिवर्तनों को दैनिक आउटपुट (2 बजे तक) कहने की विधि पसंद है, इसलिए मैं अपने लिए थोड़ा चैंज कर सकता हूं।
jcolebrand

@jcolebrand हाँ, मैंने किया था। मेरा मामला है कि मुझे किसी भी डेटाबेस गतिविधि की जांच करनी है और फिर बैकअप (पूर्ण या अंतर) बनाने के लिए। मैं LSN (लॉग रिकॉर्ड की प्राथमिक कुंजी) की जांच कर रहा हूं, जो फ़ंक्शन fn_dblog रिटर्न देता है। बस इतना ही। मुझे नहीं लगता कि यह आपके मामले में काम करेगा। मैंने उन सभी विशेषताओं के डेटा की जांच नहीं की है जिन्हें fn_dblog द्वारा लौटाया जा सकता है, लेकिन मुझे लगता है कि यह करने के लिए सभी जानकारी वापस नहीं करता है। जैसा कि आप देख सकते हैं कि इसमें शामिल होने के लिए कई अन्य सिस्टम टेबल हैं। अगर यह आसान था तो हमारे पास बहुत सारे सामान्य, सस्ते उपकरण होंगे :)
garik

जवाबों:


7

एक विचार हर दिन एक स्नैपशॉट बनाने और एक फ़ाइल मॉनिटर का उपयोग करके डिस्क पर स्नैपशॉट फ़ाइल आकार की निगरानी करना होगा। स्नैपशॉट केवल आकार में वृद्धि कर रहा है जब डेटा वहां जोड़ा जाता है, इसलिए यह एक वैध विचार होगा यदि आपको वास्तविक आकार (रिपोर्ट किए गए आकार) की निगरानी करने के लिए एक उपकरण मिलेगा।

अब .. मैंने इसका उपयोग नहीं किया, इसलिए आपको तकनीकी जानकारी नहीं दी जा सकती :-)।

एक अन्य विचार प्रत्येक db (यदि आप उन पर पूर्ण पुनर्प्राप्ति मोड का उपयोग कर रहे हैं, तो लेन-देन लॉग को सत्यापित करना होगा) कुछ फ़ंक्शन के साथ मैंने मंचों पर देखा है (db_fnlog .. या कुछ और) जो लॉग से संचालन पढ़ता है। , और देखें कि क्या आपके पास कोई डिलीट / इन्सर्ट / अपडेट है।

वे कोई आसान काम नहीं हैं .. लेकिन मुझे आशा है कि आप उन्हें उपयोगी पाएंगे।

पुनश्च: लॉग रीड फ़ंक्शन के साथ लेख मिला (यह fndblog है, वैसे :-):: जेन्स के। सुस्मेयर द्वारा लेनदेन लॉग पढ़ें


1
मैं db फ़ाइलों के आकार के बारे में बात नहीं कर रहा था, लेकिन स्नैपशॉट स्थानीय फ़ाइल के बारे में, जिसके साथ बनाया गया है: yyydb के स्नैपशॉट के रूप में डेटाबेस xxxdb बनाएँ। : यहाँ स्नैपशॉट बारे में विवरण देखें msdn.microsoft.com/en-us/library/ms175158.aspx
मैरियन

1
  • DDL परिवर्तनों के लिए आप डिफ़ॉल्ट ट्रेस पढ़ सकते हैं ।
  • डीएमसी संशोधनों के लिए चूंकि आप सीडीसी को थोड़ा भारी पाते हैं, आप अपने स्वयं के हल्के सर्वर साइड ट्रेस को चला सकते हैं जो केवल प्रासंगिक घटनाओं का पता लगाता है

1

DDL के लिए आप DDL ट्रिगर बदल देते हैं, लेकिन DML परिवर्तन आप 3 विभिन्न विकल्पों का उपयोग करके देख सकते हैं

1) 2 ट्रैकिंग बदलें) सीडीसी (डेटा कैप्चर बदलें) 3) ऑडिट फ़ीचर

परिवर्तन ट्रैकिंग के लिए .. आप नीचे दिए गए लिंक देख सकते हैं http://www.mssqltips.com/sqlservertip/1819/use-change-tracking-in-sql-server-2008/

यह परिवर्तन ट्रैकिंग का उपयोग केवल तभी किया जाएगा जब तालिका बदल गई हो या नहीं ... लेकिन यह पता लगाना बहुत मुश्किल है कि डेटा क्या बदल गया है .. यदि आप चाहते हैं कि कौन सा डेटा बदल गया है तो आप Chnage डेटा कैप्चर कर सकते हैं।

Sqlserver में Aduit के लिए .. आप नीचे दिए गए लिंक की जांच कर सकते हैं http://blogs.msdn.com/b/manisblog/archive/2008/07/21/sql-server-2008-auditing.aspx


1
+1, लेकिन एंटरप्राइज एडिशन के साथ CDC शिप किया गया
garik

1

DML परिवर्तनों के लिए आप followinh मूल SQL सर्वर ऑडिटिंग सुविधाओं में से किसी का उपयोग कर सकते हैं:

  • SQL सर्वर परिवर्तन ट्रैकिंग
  • SQL सर्वर डेटा कैप्चर बदलें
  • SQL सर्वर ऑडिटिंग

प्रत्येक के अपने फायदे और नुकसान हैं, लेकिन ऑडिटिंग माइक्रोसॉफ्ट द्वारा प्रस्तुत नवीनतम है, इसलिए यह आपके वर्तमान और भविष्य के समाधान को इसके साथ लिपटे एक अच्छा विचार होगा।

ध्यान दें कि केवल ऑडिटिंग सुविधा कौन / कब / कैसे के बारे में जानकारी प्रदान करती है


0

आप ट्रेस फ़ाइल का उपयोग करके किसी भी ddl परिवर्तनों का पता लगा सकते हैं। नीचे परिवर्तन पाने के लिए स्क्रिप्ट है।

SELECT 
    te.name AS eventtype
    ,t.loginname
    ,t.spid
    ,t.starttime
    ,t.objectname
    ,t.databasename
    ,t.hostname
    ,t.ntusername
    ,t.ntdomainname
    ,t.clientprocessid
    ,t.applicationname  
FROM sys.fn_trace_gettable
(
    CONVERT
    (VARCHAR(150)
    ,(
        SELECT TOP 1 
            value
        FROM sys.fn_trace_getinfo(NULL)  
        WHERE property = 2
    )),DEFAULT
) T 
INNER JOIN sys.trace_events as te 
    ON t.eventclass = te.trace_event_id 
WHERE eventclass=164

आप इस स्क्रिप्ट का उपयोग करके तालिका और संग्रहीत कार्यविधि में किसी भी संशोधन का पता लगा सकते हैं:

SELECT 
    SO.Name
    ,SS.name 
    ,SO.type_desc 
    ,SO.create_date
    ,SO.modify_date 
 FROM sys.objects AS SO
INNER JOIN sys.schemas AS SS 
    ON SS.schema_id = SO.schema_id 
WHERE DATEDIFF(D,modify_date, GETDATE()) < 50
AND TYPE IN ('P','U')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.