मेरे क्लाइंट के 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%')
)