2009-09-14 3 views
0

Данные из другой системы реплицируются в базу данных SQL Server 2005 в режиме реального времени (в течение дня, это сотни транзакций/секунд) с использованием Goldengate. Я хотел бы узнать, была ли недавно проведена транзакция, которая скажет мне, происходит ли в настоящее время репликация. Даже в нерабочее время я могу ожидать транзакции каждые несколько минут, хотя я не буду знать, из каких из 400 таблиц она войдет.Найти самую последнюю активность базы данных SQL Server

Вот мой текущий процесс:

  1. ИСД триггер на самом популярном реплицированный таблицы
  2. Даты обновления в таблице «Sync Notification» каждый раз, когда есть какая-либо деятельность в этой таблице
  3. SQL Agent задание выполняется каждые несколько минут и сравнивает эту дату с GETDATE(). Если он слишком длинный, он отправляет мне электронное письмо.

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

Любые другие предложения, не добавляющие этот же триггер для каждой таблицы в базе данных? Если я добавлю триггеры, как я могу предотвратить взаимоблокировки и утверждения в таблице «Уведомление о синхронизации»? Поскольку я не забочусь о том, что самая последняя дата была точной во время периодов высокой конкуренции, есть ли способ заставить SQL попытаться обновить дату, но просто пропустить ее, если какой-либо другой процесс заблокировал ее?

Единственный выбор «уровня приложения», который у меня есть, - это TELNET на мониторе Goldengate и попросите задержку реплики, затем экран очистит результаты. Я открыт для этого, но я бы хотел сделать что-то SQL-side, если это более осуществимо.

+0

Какая версия SQL Server? – RedFilter

+0

Я добавил версию к моему вопросу. – SqlRyan

ответ

2

Это для автоматизированной работы или что-то, что вы хотите смотреть время от времени? Если последний, то вы можете использовать инструмент проверки журнала транзакций (Redgate Log Rescue, Apex SQLLog, возможно, другие).

Другой вариант, открытый для вас, - это просмотр sysindexes (SQL Server 2000: dbo.sysindex; 2005: sys.sysindexes). Столбец rowmodctr (для цитирования MSDN) «Подсчитывает общее количество вставленных, удаленных или обновленных строк с момента последнего обновления статистики для таблицы«. Он может не возвращать все, что вам нужно знать, но, если у вас есть покрывающие индексы, это даст указание на то, сколько и где изменения были, если они были отобраны на регулярной основе.

+0

Я бы предпочел, чтобы это было для обоих - я хотел бы, чтобы автоматизированный процесс запускался каждую минуту или две, и напишите мне, если он будет «не синхронизирован», на какой-то срок, и я также хотел бы запросить его -demand, когда я запускаю определенные критически важные процессы, требующие обновления данных. Выполнение «select sum (rowmodctr) из sys.sysindexes», кажется, обновляется каждые несколько секунд, так что это может быть так, как я в конечном итоге иду. – SqlRyan

+0

Это работает как чемпион - спасибо! – SqlRyan

1

Вы можете проверить SELECT * FROM ::fn_dblog(@startLSN, NULL) и посмотреть, есть ли какая-либо операция LOP_MODIFY_ROW со времени последней проверки (с момента последнего проверки LSN).

+0

В настоящее время мы используем Simple logging - этот метод требует включения полного ведения журнала? – SqlRyan

+0

Да, требуется полная или объемная модель восстановления. С помощью простой модели восстановления записи журнала могут быть удалены и повторно использованы, как только произойдет контрольная точка. –

Смежные вопросы