Как обнаружить какие -либо изменения в базу данных (DDL и DML)

dba.stackexchange https://dba.stackexchange.com/questions/985

  •  16-10-2019
  •  | 
  •  

Вопрос

На SQL Server моего клиента много баз данных. Эти базы данных находятся в стадии разработки, поэтому разработчики могут разрабатывать, рефактор, делать модификации данных и так далее. Есть некоторые базы данных, которые меняются редко. Мой клиент должен обеспечить их безопасным (резервным копированием) и потратить некоторое время на управление окружающей средой. (В компании нет должности администратора БД.) После длительного обсуждения клиент решил использовать ежедневную стратегию резервного копирования из -за простоты восстановления.

Итак, вот краткое изложение ситуации:

  • Количество баз данных может варьироваться каждый день.
  • Базы данных, которые были изменены (означающие данные и/или структуру) должны быть резервированы.
  • Базы данных, которые не были изменены, не должны быть резервированы.
  • Решение не должно влиять на структуру базы данных (это не ограниченное требование)
  • Этот «резервный двигатель» должен работать автоматически.

Основная проблема: как обнаружить, что база данных была изменена. Первая часть проблемы (изменения DDL) может быть решена с помощью использования DDL триггеры. Анкет Но изменения данных (изменения DML) являются проблемой. Невозможно применить триггеры DML ко всем таблицам всех баз данных для отслеживания изменений (производительность, управление расширенными объектами ...). Двигатель резервного копирования должен отслеживать все изменения, чтобы отметить каждую базу данных как готовую к резервной копии.

  • Изменить захват данных это решение, но оно кажется слишком тяжелым (также требуется также SQL Server Enterprise Edition).

  • Другой способ - отслеживать изменения файла базы данных (размер или последнее время изменения), но он работает неправильно: база данных может изменить свой размер, когда она превышает все зарезервированное свободное пространство и 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%')
    )
Это было полезно?

Решение

Одна идея - делать снимок каждый день и контролировать размер файла снимка на диске с помощью монитора файла. Снимок увеличивает свой размер только при добавлении данных, поэтому было бы действительной идеей, если бы вы нашли инструмент для мониторинга реального размера (сообщаемый размер).

Теперь .. Я не использовал это, так что не могу дать вам техническую информацию :-).

Другая идея - проверить журнал транзакций каждого БД (если вы используете режим полного восстановления, конечно, с некоторой функцией, которую я видел на форумах (db_fnlog .. или что -то в этом роде), которая считывает операции из журнала и посмотрите, есть ли у вас какие -либо удаления/вставки/обновления.

Это нелегко сделать ... но я надеюсь, что вы найдете их полезными.

PS: Нашел статью с функцией чтения журнала (кстати, это fndblog :-): Прочитайте журнал транзакций Jens K. Suessmeyer.

Другие советы

  • Для изменений DDL вы можете прочитатьСлед по умолчанию.
  • Для модификаций DML, так как вы находите CDC немного тяжелым, вы можете запустить свой собственный легкий серверный след, который прослеживает только соответствующие события

Для изменений DDL вы триггеры DDL, но DML изменяется, вы можете попробовать, используя 3 разных параметра

1) Изменить отслеживание 2) CDC (Изменение сбора данных) 3) Функция аудита

Для отслеживания изменений .. Вы можете увидеть ссылку ниже http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/

Это отслеживание изменений будет использоваться только в то время как таблица изменилась или нет ... но очень сложно найти то, что изменилось данные ... если вы хотите найти, какие данные изменились, вы можете перейти к сбору данных.

Для Aduit в SQLServer .. вы можете проверить ссылку ниже http://blogs.msdn.com/b/manisblog/archive/2008/07/21/sql-server-2008-auditing.aspx

Для изменений DML вы можете использовать любую из следующих функций аудита SQL Server:

  • SQL Server изменение отслеживания
  • SQL Server Изменить данные данных
  • SQL Server Auditing

У каждого есть свои преимущества и недостатки, но аудит является последним представлением Microsoft, поэтому было бы неплохо создать ваши текущие и будущие решения, обернутые им.

Обратите внимание, что только функция аудита предоставляет информацию о том, кто / когда / как

Вы можете обнаружить любые изменения DDL, используя File Trace. Ниже приведен скрипт, чтобы получить изменения.

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')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top