it-swarm.asia

كيفية اكتشاف أي تغييرات في قاعدة البيانات (DDL و DML)

هناك الكثير من قواعد البيانات على خادم SQL الخاص بالعميل. قواعد البيانات هذه قيد التطوير ، بحيث يمكن للمطورين تصميم وإعادة بناء وإجراء تعديلات على البيانات وما إلى ذلك. هناك بعض قواعد البيانات التي نادرا ما تتغير. يجب على موكلي الحفاظ على أمانها (الاحتفاظ بنسخة احتياطية) وقضاء بعض الوقت في إدارة البيئة. (لا يوجد منصب مسؤول DB في الشركة.) بعد مناقشة مطولة ، قرر العميل استخدام إستراتيجية احتياطية يومية كاملة ، بسبب سهولة الاستعادة.

إذن هذا هو ملخص الوضع:

  • يمكن أن يختلف عدد قواعد البيانات كل يوم.
  • يجب نسخ قواعد البيانات التي تم تغييرها (بمعنى تغيير البيانات و/أو الهيكل).
  • قواعد البيانات التي لم تتغير لم يتم عمل نسخة احتياطية منها.
  • يجب ألا يؤثر الحل على بنية قاعدة البيانات (ليس متطلبًا مقيدًا)
  • يجب أن يعمل "محرك النسخ الاحتياطي" هذا تلقائيًا.

المشكلة الرئيسية: كيفية اكتشاف تغيير قاعدة البيانات. يمكن حل الجزء الأول من المشكلة (تغييرات DDL) باستخدام مشغلات DDL . لكن تغييرات البيانات (تغييرات DML) هي مشكلة. من المستحيل تطبيق مشغلات DML على جميع جداول جميع قواعد البيانات لتتبع التغييرات (الأداء وإدارة الكائنات الموسعة ...). يجب على محرك النسخ الاحتياطي تتبع جميع التغييرات لوضع علامة على كل قاعدة بيانات على أنها جاهزة للنسخ الاحتياطي.

  • Change Data Capture حل ولكنه يبدو ثقيلًا جدًا (يتطلب SQL Server Enterprise Edition أيضًا).

  • طريقة أخرى هي تتبع تغييرات ملف قاعدة البيانات (الحجم أو وقت التغيير الأخير) ، لكنها لا تعمل بشكل صحيح: يمكن لقاعدة البيانات تغيير حجمها عندما تتجاوز كل المساحة الخالية المحجوزة و sp_spaceused ليس حلاً.

  • التتبع هو حل ولكنه يسبب مشكلات في الأداء ويتطلب إدارة إضافية.

هل هناك أي حلول لحساب حجم استخدام قاعدة البيانات الفعلي دون التأثير على كائنات إدارة قاعدة البيانات الأخرى (مثل الإحصائيات ..)؟ من المؤكد أن التغيير في بيانات الجدول الذي لا يغير حجم الجدول لن يؤدي إلى (أعتقد) ، ولكنه أفضل من لا شيء. أنا حقًا أبحث عن حل مباشر أو غير مباشر لـ SQL Server 2008.

شكرا لك على أي تعليقات أو حلول أو أفكار.

مضاف:

هنا هو الحل (بفضل Marian ):

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%')
    )
13
garik

تتمثل إحدى الأفكار في عمل لقطة كل يوم ومراقبة حجم ملف اللقطة على القرص باستخدام مراقب الملفات. تعمل اللقطة على زيادة حجمها فقط عند إضافة البيانات هناك ، لذلك سيكون فكرة صحيحة إذا وجدت أداة لرصد الحجم الحقيقي (الحجم المبلغ عنه).

الآن .. لم أستخدم هذا ، لذلك لا يمكنني أن أعطيك رؤى فنية :-).

فكرة أخرى هي التحقق من سجل المعاملات لكل ديسيبل (إذا كنت تستخدم وضع الاسترداد الكامل عليها بالطبع) مع بعض الوظائف التي رأيتها في المنتديات (db_fnlog .. أو شيء ما) الذي يقرأ العمليات من السجل ، ومعرفة ما إذا كان لديك أي حذف/إدراج/تحديثات.

هذه ليست أشياء سهلة للقيام بها .. لكن آمل أن تجدها مفيدة.

ملاحظة: وجدت المقالة مع وظيفة قراءة السجل (انها fndblog ، بالمناسبة :-): اقرأ سجل المعاملات بواسطة Jens K. Suessmeyer .

7
Marian
  • لتغييرات DDL ، يمكنك قراءة التتبع الافتراضي .
  • بالنسبة إلى تعديلات DML نظرًا لأن CDC ثقيل بعض الشيء ، يمكنك تشغيل التتبع الجانبي للخادم خفيف الوزن الخاص بك والذي يتتبع الأحداث ذات الصلة فقط
1
Nomad

بالنسبة لتغييرات DML ، يمكنك الاستفادة من أي من ميزات تدقيق SQL Server الأصلية التالية.

  • تعقب تغيير خادم SQL
  • SQL Server تغيير التقاط البيانات
  • تدقيق خادم SQL

لكل منها مزاياه وعيوبه ، ولكن التدقيق هو أحدث ما قدمته Microsoft ، لذلك سيكون من الجيد بناء حلولك الحالية والمستقبلية ملفوفة بها.

لاحظ أن ميزة التدقيق فقط توفر معلومات حول من/متى/كيف

1
Ivan Stankovic

لتغييرات DDL ، يمكنك تشغيل مشغلات DDL ، ولكن يمكنك تغيير DML Changes باستخدام 3 خيارات مختلفة

1) تتبع التغيير 2) CDC (تغيير التقاط البيانات) 3) ميزة التدقيق

لتتبع التغييرات .. يمكنك مشاهدة الرابط أدناه http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/

سيتم استخدام تتبع التغيير هذا فقط أثناء تغيير الجدول أم لا ... ولكن من الصعب جدًا العثور على البيانات التي تغيرت .. إذا كنت تريد العثور على البيانات التي تم تغييرها ، فيمكنك الانتقال إلى Chnage data Capture.

بالنسبة لـ Aduit في sqlserver .. يمكنك التحقق من الرابط أدناه http://blogs.msdn.com/b/manisblog/archive/2008/07/21/sql-server-2008-auditing.aspx

1
Anil Inampudi

يمكنك الكشف عن أي تغييرات 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')
0
Anvesh