Задача перехвата DML-запросов и как она решается разными DB

oMoses
Уже с Приветом
Posts: 1255
Joined: 01 Jun 1999 09:01
Location: Irkutsk.RU -> Hamden, CT-> Princeton, NJ, USA

Задача перехвата DML-запросов и как она решается разными DB

Post by oMoses »

Эх давно мы не говорили о неоспоримых преимуществах Oracle над всякими там МэСэ Си-Ку-Элами и Ай-Би-Эм Ди-Би Два! :mrgreen: :mrgreen: :mrgreen:

Вводная: дана схема с сотней таблиц в ней. Пользователи (посредством некоего приложение) генеририуют десятки тысяч DML-запросов и меняют данные, заключенные в этих таблицах.

Задача: сформировать полный список всех успешных (after commit) INSERT/DELETE/UPDATE с сохранением полного синтаксиса и изменяемых величин. Т.е., результат "наката" перехваченных таким образом DML's должен совпадать с теми изменениями, которые генерируются приложением. Каждый запрос должен сопровождаться дополнительной служебной информацией, как-то именем пользователя, точным временем, SCN, наименованием схемы и объекта и т.д.

Вопрос: как такая задача решается средствами MS SQL и IBM DB2? Будет-ли такое решение работать unattended и обеспечивать гарантированный перехват сотен тысяч запросов на протяжении недель?
[b]"Счастье для всех, даром, и пусть никто не уйдет обиженный!"[/b]
[i]А. и Б. Стругацкие, "Пикник на обочине"[/i]
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

MS SQL:

Traces. (SQL Profiler using them)

Нащет времени работы так тут много соствляющих. :mrgreen:
oMoses
Уже с Приветом
Posts: 1255
Joined: 01 Jun 1999 09:01
Location: Irkutsk.RU -> Hamden, CT-> Princeton, NJ, USA

Post by oMoses »

Расскажу, как это может быть сделано средствами Oracle9i. Возможны несколько путей, как-то:
- auditing
- triggers
- streams
- CDC
- tracing
- logminer

Auditing легко и просто настраивается, "отлавливает" кучу служебной информации, но не решает главную задачу - перехвата полного синтаксиса всех DML-запросов. Вместо этого он лишь фиксирует тип запроса (insert или delete). Обидно. :(

Triggers, увы, позволяют сравнительно легко отслеживать изменения в самих данных, но не позволяют перехватывать полные DML's. К тому-же, они способны запросто "посадить" производительность целой базы и имеют серьезные ограничения.

Streams (в 8i - репликация) и CDC (Capture Data Changing) базируются на технологии logminer и в данном случае будут явным overkill. Более того, опять следует упомянуть про существенные ограничения.

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

Logminer, кажется, наиболее подходящим для решения поставленной задачи, поскольку позволяет читать и анализировать абсолютно все запросы сделанные к базе через архивные логи, генерируемые последней. Однако, и эта технология не лишена своих ограничений и неудобств. Во-первых, база должна быть в archivelog mode. Более того, этот режим должен быть включенным c опцией Force, дабы гарантированно защититься от direct-INSERTs (SQL*Loader, DIRECT=Y). Далее, каждый лог может иметь сотни тысяч транзакций, из которых интерес для нас может представлять лишь десяток. Logminer требует исключительных прав, которыми простого пользователя не наделишь. Процесс чтения/анализа/складирования нужной информации требует дополнительно "автоматизации" через PL/SQL процедуры, shell-scripting, cron или Oracle jobs... Вывод: даже технология logminer вряд-ли будет удобна и адекватна при продолжительно использовании и значительной нагрузке.

Что осталось??? А ничего... :pain1:

P.S. Только не спрашивайте меня зачем это может понадобиться!
[b]"Счастье для всех, даром, и пусть никто не уйдет обиженный!"[/b]
[i]А. и Б. Стругацкие, "Пикник на обочине"[/i]
oMoses
Уже с Приветом
Posts: 1255
Joined: 01 Jun 1999 09:01
Location: Irkutsk.RU -> Hamden, CT-> Princeton, NJ, USA

Post by oMoses »

katit wrote:MS SQL:
Traces. (SQL Profiler using them)

Боюсь, что этот механизм не позволит Вам отловить DML's "закомитченных" транзакций, и отсеить - все остальные. Или я не прав?
[b]"Счастье для всех, даром, и пусть никто не уйдет обиженный!"[/b]
[i]А. и Б. Стругацкие, "Пикник на обочине"[/i]
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Да, жто так
Выловить commit в принципе можно
Но commit в процедуре, и она commit-unbalanced, то да
А так можно проанализировать commit/rollback
Задача не тривиальная

А зачем ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Если Вам нужно именно всё заново "проиграть", то одими успешными транзакция обойтись нельзя, т.е. "отсеивание" незафиксированных транзакций может дать неправильный результат: например, значения колонок, для генерации которых используются последовательности, могут оказаться другими. Кроме того, если при "проигрывании" используется максимально приближенное к оригинальной ситуации приложение, включая исходное количество отдельных сессий, то реальный порядок последовательности запросов от разных транзакций может оказаться отличным от оригинального. Соответственно и результат тоже может оказаться другим.

Поэтому самыми точными оказываются методы, основанные на проигрывании реального журнала транзакций. В SQL Server это тот же log shipping, например, или log-based репликация.
Cheers
Michael Popov
Уже с Приветом
Posts: 991
Joined: 09 Sep 2001 09:01
Location: The Earth

Post by Michael Popov »

oMoses wrote:Tracing, будучи включенным на клиенте или сервере, позволяет в логах отаражать все запросы, переданные клиентом к серверу. НО, вопрос, как среди них выделить успешные запросы и отсеить откаченные транзакции?


На клиенте включать ничего не надо. Tracing включается на сервере. В полученных логах есть вся необходимая информация, включая commits/rollbacks, SQL syntax, bind vars, etc. Анализировать логи - для этого надо или самому скрипты писать или тулы соответствующие. Две (но очень большие) проблемы с tracing: performance overhead (10-20%) and security (all your data in plain text files).

Можно еще это посмотреть:
http://www.quest.com/foglight/foglight_SQLtrans.asp
Best regards,

Michael Popov
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Не думаю что все это можно корректно проиграть во всех случаях
Пример: триггеры реагируют на время
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
oMoses
Уже с Приветом
Posts: 1255
Joined: 01 Jun 1999 09:01
Location: Irkutsk.RU -> Hamden, CT-> Princeton, NJ, USA

Post by oMoses »

Спасибо всем откликнувшимся! Жаль, что про DB2 пока еще никто не рассказал, однако сильно подозреваю, что и там ситауция схожая - ни одна база не дает надежного и вполне рабочего механизма решения подобной задачи. Потому как идея сама по себе - бредовая и является порождением чуждого индусского разума. К счастью, мне удалось своих коллег отговорить от попытки ее реализации. Более того, сам смысл и реальная необходимость в подобном была поставлена под сомнение.
[b]"Счастье для всех, даром, и пусть никто не уйдет обиженный!"[/b]
[i]А. и Б. Стругацкие, "Пикник на обочине"[/i]
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Кстати о DB2
а куда делся zVlad ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
oMoses
Уже с Приветом
Posts: 1255
Joined: 01 Jun 1999 09:01
Location: Irkutsk.RU -> Hamden, CT-> Princeton, NJ, USA

Post by oMoses »

Как. разве он вам не сказал? :pain1: :pain1: :pain1:
Окончательно разочаровался в IBM и мигрировал под крышу Oracle! :mrgreen:
[b]"Счастье для всех, даром, и пусть никто не уйдет обиженный!"[/b]
[i]А. и Б. Стругацкие, "Пикник на обочине"[/i]
zVlad
Уже с Приветом
Posts: 15410
Joined: 30 Apr 2003 16:43

Post by zVlad »

Dmitry67 wrote:Кстати о DB2
а куда делся zVlad ?


Как. разве он вам не сказал?
Окончательно разочаровался в IBM и мигрировал под крышу Oracle!


Никуда я не девался и повода разочаровываться в DB2 и IBM у меня не было.
Наоборот, oMoses своими рассуждениями в этом топике добавил повод лишний раз убедиться что DB2 в этом разрезе ни чем не уступает Ораклу и более того ощутить преимущество DB2, хотя бы в вопросе возможности доступа к записям журнала транзакций. Никаких ограничений и неудобств в этом у DB2 нет. Читать можно не только архивный журнал, но и активный никак не влияя на работу самого DB2. На этом как раз, как правило, базируются средства репликаций. Хотя для последнего имеются и другие возможности, как то DataCapture, который перехватывает все DML и пишит в специальные для этого созданные таблицы DB2 всю необходимую для воспроизведения изменений информацию.

Мигрировать же под крышу Оракла у меня нет, никогда не было и не будет ни малейшего желания и необходимости. И слава богу.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Хорошо что появились а то я уже беспокоился

Несколько вопросов по DB2 навеянных Yukon

А как в DB2 c хранением XML в базе ? Не как длинный текст, а с индексацией XML полей ?

stored procedures, которые пишутся в DB2 представляют с точки зрения Microsoft, 'unmanaged' code ? то есть не котролируются утечки памяти, 'run aways' по ресурсам... Как построена конкуренция за память кода процедур и самого ядра DB2 (с кешем)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
zVlad
Уже с Приветом
Posts: 15410
Joined: 30 Apr 2003 16:43

Post by zVlad »

Dmitry67 wrote:......

1. А как в DB2 c хранением XML в базе ? Не как длинный текст, а с индексацией XML полей ?

2. stored procedures, которые пишутся в DB2 представляют с точки зрения Microsoft, 'unmanaged' code ? то есть не котролируются утечки памяти, 'run aways' по ресурсам... Как построена конкуренция за память кода процедур и самого ядра DB2 (с кешем)


1. К сожалению приложение, для которого я DBA, не использует ничего кроме голых таблиц с индексами. Недавно стали использоваться триггеры. В своих приложениях (автоматизации задач DBA) я еще использую первичные и внешние ключи и другие мелочи. Поэтому сказать что-либо о XML, базирующеся на моем личном опыте и знаниях я не могу. Из статей и аннонсов у меня сложилось впечатление что у ИБМ в этом вопросе все в порядке и они едва ли не лидеры в стандарте xSQL или как это там называется. Спекулировать не буду.

2. Первый раз слышу о таких недостатках. У Вас есть примеры?
Такие проблемы как "утечка памяти", "не контролируемое использование ресурсов" были открыты, изучены и "сняты" на МФ ИБМ-ом годах так в 70х. На ЕС ЭВМ это еще проявлялось в 80х, то есть до того как появился Мicrosoft (не в обиду будет сказано). Не думаю что на других платформах ИБМ забыл про этот опыт.

Мне кажется ни один DB2 DBA не сможет рассказать как работает механизм конкуренции за память в DB2 по той простой причине что они никогда не испытывают проблем с этим. А раз так - зачем это знать. Правильно?
Я пропустил несколько дискуссий на эту тему, просто потому что мне было ничего не известно о подобных проблемах в ДБ2. Если я не прав прошу других ДБ2-шников меня поправить.

А вообще, уже давно мне не приходится разрешать проблем ДБ2 как такового. За последние 4 года это было всего может быть два раза и каждый раз оказывалось что ИБМ уже имеет решение - просто мы были не в курсе.
Главной моей проблемой, как DB2 DBA, на сегодня являются люди окружающие DB2. В двух словах: за последние месяцы я обнаружил больше чем два десятка мест в приложении работающих не эффективно и предложил меры по исправлению, практически без изменения кода. И не могу "продавить" это через людей, кто принимает решение о внедрении. Большинство предложений протестированно, доказана их эффективность, каким то чудом два-три были внедренны, были восторги СOOL!!!, но вот с основными предложениями - вилы. Людской фактор.
Другая проблема - это приложения написаные либо для Оракл, либо для Windows и желающие соединяться с нашей базой на DB2. Это тоже ночной кошмар. Решения на уровне 2-ого класса, никакого понятия о реальных нагрузках и проблемах. Розовые очки, и удивленные глаза.
Наверное месяц объяснять пришлось, что когда ресурс занят, то запрос ставится в очередь, а когда ожидание в очереди превышает определенное время, то запрос терминируется и его просто нужно повторить. Нет говорят там у вас в ДБ2 что-то не так. Да я согласен, что что-то не так, но не в ДБ2, а опять же в том как приложение для этого ДБ2 написано. Но в свою очередь попробуйте докажите что-нибудь тем кто пишет это приложение.
Другой пример. Создатели приложения используют кодировку представленную кодовой страницей 1034, а говорят в документации что у них страница номер 37. Никакие доказательства (официальные документы) так и не были признаны. А проблема "всплыла" когда приложение из-под Windows начало соединяться и брать информацию из ДБ2. Поскольку мы, на основании документации приложения, установили номер 37 в ДБ2, а на самом деле несколько символов кодировались иначе, то и получился "сыр-бор". И так почти всегда. Люди - это самая большая проблема в моей практике.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Да, людской фактор в большиз фирмах вещь еще та
Что касается памяти то я вот что имел ввиду конкретно
Пусть stored procedure делает ref=malloc(1024*1024*1024), то есть аллокирует доЯя чего то один гиг памяти. Откуда он возьмется ?

Для примера допустим что у вас всего полтора гига. Естественно база, точнее ее кеш занимает почти всю оперативку. В случае managed code SQL server поймет что ситуация конфликтная и будет пытаться поджаться, это лучше чем page faults от него и stored procedures. Как жто построено в IBM ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014

Return to “Вопросы и новости IT”