|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Добрый день дано 2 базы база1 база2 в каждой базе есть таблица t_product поля id,name,change_id change_id это счётчик изменений если запись в таблице изменяют или добавляет change_id увенчивается на 1 1, товар 1,2 2, товар 2,3 если изменять наименование товара 1 на товара 5 то будет 1, товар 5,4 на второй базе все именные или доданные записи передаются на базу2 по схеме база 2 хранит последний номер change_id и забирает из базы 1 все записи где этот номер больше для change_id есть просто последовательно create sequence SQ_CHANGE_ID minvalue 1 maxvalue 999999999999999999 start with 994288686 increment by 1 cache 20 order; все работает достаточно стабильно но возникают ситуации когда в базе 2 не обновляются данные это происходить сели одновременно идет обмен и изменения в таблице т.е 1 доставляются пачка новых записей в таблицу 2 change_id передвигается 3 происходит запрос текущего change_id 4 запрос всех записей > последнего change_id (а их еще нет, так как не произошел коммит) 5 запрос пустой 6 записывается последний change_id в результате 1 запись теряется таких таблиц достаточно много > 100 у всех обмен настроен схожим образом есть какой вариант узнать сколько change_id находиться в открытых транзакциях или какой другой способ синхронизации ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 12:26 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, Используй commit scn, самописный журнал изменений или матвью. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 12:31 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
-2- или матвью. или mat. view log. или ogg/аналоги ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 16:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 4 запрос всех записей > последнего change_id (а их еще нет, так как не произошел коммит) Классическая иллюстрация того, почему не следует делать интеграцию данных подобным образом. Если нет возможности воспользоватся спец. инструментами типа OGG и нет желания возиться с mview log/прочей рукописью с commit_scn/ретроспективными запросами, то можно смягчить проблему, просто сделав Код: plaintext
Ессно, на "той стороне" при этом выполняется merge. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 16:25 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
У нас была похожая схема и похожие проблемы. Нужно использовать не неравенство а списки. Любой change_id сохраняется в таблицу unprocessed_ids. Когда приходит время синхронизации, то все из unprocessed_ids селектится в аналогичную по структуре таблицу processing_ids, и по этому списку забираются изменения. А потом выполняется delete from unprocessed_ids where id in (select * from processing_ids). При такой схеме не будет потеряно ни одного изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 00:26 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
MazoHist А потом выполняется delete from unprocessed_ids where id in (select * from processing_ids). При такой схеме не будет потеряно ни одного изменения. "наши руки не для скуки" (с) Откройте для тебя mat. view log. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 03:57 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
вариант который рассматриваем как основной 1 делаем табличку t_change_id с одним полем и одной записью 2 делаем функцию create or replace function f_ret_change_id return number is Result number; begin select sq_change_id.nextval into Result from dual; update t_change_id set CHANGE_ID = GREATEST(CHANGE_ID+1, Result); returning CHANGE_ID into Result; return(Result); end f_ret_change_id; 3 на все таблицы участвующие в обмене делаем триггер CREATE OR REPLACE TRIGGER TR_product_CBIU BEFORE INSERT or UPDATE ON t_product FOR EACH ROW BEGIN :NEW.CHANGE_ID :=f_ret_change_id; END; 4 теперь последний законченный CHANGE_ID в таблице возможно тут есть недостатки если одновременно происходит несколько транзакций с разным временем завершения ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 10:46 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
mat. view log не совсем понятно как это использовать на практике mat. view log используем для ускорения рефреша больших аналитических таблиц там хранятся изменения между после последнего рефреша и затираются если рефреш прошел если есть несколько таблиц обмена (некоторые большие) и есть несколько клиентов куда нужно изменения транслировать и все это нужно делать средствам которые доступны в XE11.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 10:51 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, т.е. на каждый чих будет взводиться change_id всей таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
oragraf, нет в этой таблице 1 запись с последним закомиченым CHANGE_ID ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:24 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 возможно тут есть недостатки если одновременно происходит несколько транзакций с разным временем завершения не совсем понятно как это использовать на практике все выстроятся в очередь (+ возможные деадлоки) превратите систему почти в "однопользовательскую" ps BEFORE INSERT or UPDATE удаление игнорируєте ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:48 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, еще раз: забудьте о диапазонах и максимальной границе, используйте списки и все получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:55 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
удаление из таблиц не делается есть поле логического удаления unprocessed_ids тут не совсем понятно как это делать на 100 клиентах у каждого клиента обмены приходят не регулярно интервал между обмена от 1-2 часа до 1-2 недели у разных клиентов по разному в некоторых табличках может накопиться до 1М записей одна строчка между обменами может изменяться несколько раз ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 13:08 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
MazoHist ilyuha111, еще раз: забудьте о диапазонах и максимальной границе, используйте списки и все получится. если на принимающей много ФК то не все так просто (может выстрелить в не неподходящий момент) в идеале писать лог и его применять (можно попыталься использовать логминер, но нужен опыт да и нюансов наверное много) зы для общего моего развития в новейших версиях GG остался платным? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 13:50 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 mat. view log ... mat. view log используем для ускорения рефреша больших аналитических таблиц ... все это нужно делать средствам которые доступны в XE11.2 Вот тут не понял - Вы "ИСПОЛЬЗУЕТЕ mview log" или "Средствами XE 11.2"? Оно относится к Advanced Replication и XE не положено. В любом случае - почитайте хотя бы http://blog.itpub.net/193161/viewspace-50262/ для общего понимания штатных механизмов и порядка их работы. На XE можно, в конце концов, просто воспроизвести требуемое поведение... без мазохизма :) ...по крайней мере, я когда-то успешно воспроизводил. Давно, не на XE и совершенно для других задач, но проверено лично. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 15:37 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax в новейших версиях GG остался платным? Ну как можно отказаться от монетизации Streams в наши сложные времена? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 15:38 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Stax в новейших версиях GG остался платным? Ну как можно отказаться от монетизации Streams в наши сложные времена? :) я так понял, пока за денежку spatial стал бесплатным предложили занятся GraphRDF Knowledge Graph я не совсем чесно спросил, подумал мож и GG амнистировали ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 16:14 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, тогда нужно делать полноценный журнал (копия таблицы со всеми изменениями) и механизм т.н. подписчиков, когда каждый забирает только то что ему положено. Данная схема применялась в одной крупной компании и за все время работы ни разу не дала сбоя. авторесли на принимающей много ФК то не все так просто (может выстрелить в не неподходящий момент) deferrable constraints ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 17:24 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
не много по другому поставлю вопрос поле change_id заполняется с помощью последовательности sq_change_id.nextval клиент при подключении запрашивает последний номер последовательности (last_change_id) клиент хранит у себя последний номер прошлого обмена old_change_id затем выгибает строки запросом select * from t_product whete change_id between old_change_id and last_change_id после удачного обмена записывает себе last_change_id если я как нибудь смогу узнать sq_change_id.nextval в незакрытых транзакциях на момент начала обмена (no_comm_change_id) то я могу передать клиенту этот no_comm_change_id и при следующем обмене делать select * from t_product whete change_id between no_comm_change_id and last_change_id ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2020, 13:52 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 если я как нибудь смогу узнать sq_change_id.nextval в незакрытых транзакциях Видимо, чукча не читатель. Ну успехов тогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2020, 14:01 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous ilyuha111 mat. view log ... mat. view log используем для ускорения рефреша больших аналитических таблиц ... все это нужно делать средствам которые доступны в XE11.2 Вот тут не понял - Вы "ИСПОЛЬЗУЕТЕ mview log" или "Средствами XE 11.2"? Оно относится к Advanced Replication и XE не положено. В любом случае - почитайте хотя бы http://blog.itpub.net/193161/viewspace-50262/ для общего понимания штатных механизмов и порядка их работы. На XE можно, в конце концов, просто воспроизвести требуемое поведение... без мазохизма :) ...по крайней мере, я когда-то успешно воспроизводил. Давно, не на XE и совершенно для других задач, но проверено лично. далеко не все живут в мире enterprise edition . эта статья не имеет никакого отношения к теме , ни слова про синхронизацию. не понятно для чего вы прислали статью 2003 года 17 лет прошло !!! если у вас есть статья, как на практике применять синхронизацию с использованием mview log присылайте если опустить ограничение XE я не вижу оптимального решения организации синхронизации через mat. view log если клиентов для обмена более 100. или пишите по теме или не пишите вообще ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2020, 20:39 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 или не пишите вообще Так тому и быть, боритесь самостоятельно - понимание или придет позже, или не придет совсем. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2020, 01:14 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, Во-первых, не грубите, а во-вторых, спокойно перечитайте то, что вам уже дали(чего в целом уже достаточно), если же опять не поймете, то спрашивайте вежливо и конкретно, что именно не поняли. ilyuha111 4 теперь последний законченный CHANGE_ID в таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2020, 01:50 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender, да согласен идея не удачная но других пока не нашли ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2020, 09:11 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
тестируем этот вариант создаем функцию Код: plsql 1. 2. 3. 4. 5. 6. 7.
которая заполняет CHANGE_ID через триггер Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
тут узнаем если открытые транзакции с таблицами которые участвуют в обмене Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
на стороне клиента Код: plsql 1.
храним эти транзакции чтобы перекачать позже получаем текущий change_id с мастер базы Код: plsql 1.
далее делаем запросу примерно такого вида Код: plsql 1. 2.
собственно получаем либо новые записи либо измененные завершение обмена записываем новый new_change_id в базу клиента, с ним будем начинать следующий обмен old_change_id := new_change_id второй блок обмена повторяет те же действия но только с таблицами из t_open_tran Код: plsql 1. 2.
вопрос есть ли у этого метода недостатки которые мы не заметили ? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2020, 21:34 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 собственно получаем либо новые записи либо измененные Носильщик пятнадцатый номер Везёт на тележке багаж: Диван, Чемодан, Саквояж, Картину, Корзину, Картонку, А сзади ведут собачонку. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2020, 22:17 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 CHANGE_ID Во-вторых, вы так упорно хотите наступить на грабли, что не хотите прочитать и осознать то, что вам уже посоветовали, что кажется помогать вам бесполезно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 02:22 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
-2-, да пропускаются записи которые не закончены для этого и просматривается открытые транзакции на момент обмена ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 08:25 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender, пересмотрел все что советовали большая часть не работает в XE вторая часть платная либо все эти снапшоты забьют паять настолько что XE не потянет такой объем и советы типа "напиши так как я раньше писал и оно как то работало вот ссылка которая тебе не подойдет" еще немного вводных таблиц для обмена больше 100 клиентов примерно столь-же примерно раз в месяц меняется набор таблиц для обмена или добавляются удаляются новые колонки качаем эти грабли, потому что они уже как то работают записи продают при обмене, но это не так критично, чтобы глобально что то переписывать или что то покупать согласованность особо не нужна, необходимо чтобы при завершении открытой транзакции на момент обмена change_id > START_SCN если некоторые данные передадутся дважды это не так критично ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 09:31 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, предлагаю упрощенный вариант 1) в каждой табличе в базе1 и базе2 есть поле change_id, которое только в базе1 заполняется триггером из последовательности 2) для синхронизации используем мерже Код: plsql 1. 2. 3. 4.
select max(change_id) from t1@b2) можно и как переменную вычислять до мерже @ чтоб поняно было из каких баз 3) синхронизировать СНАЧАЛА таблицы с ФК потом мастер схема не будет работать со сложной системой фк-пк (напр ссылка по кругу а-б-с-а) но мож у Вас нет такого критикуйте зы правильно лог и его накат, но ето сложнее pss насчет change_id в древних версиях была слабо документированная "ф-ция" userenv('COMMITSCN'); почитайте ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 10:02 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Staxпредлагаю упрощенный вариант 2 сессии. Вначале идет коммит с большим change_id, а потом с меньшим ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 10:08 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
последний new_change_id это и есть select max(change_id) from t1@b2 "если Вначале идет коммит с большим change_id,а потом с меньшим" то это не так важно так как обе транзакции попадут в неравенство единственная проблема это открытые транзакции в момент обмена change_id у же передвинулся а данные еще не закончены и его нельзя использовать как old_change_id ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 10:40 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax, зы правильно лог и его накат, но ето сложнее если матвью лог то его нет в XE :( ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 10:42 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 единственная проблема это открытые транзакции в момент обмена ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 11:11 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
123йй, не подумал что транзакции могут по разному закончится ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 11:15 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 если матвью лог то его нет в XE :( самому вручную триггером самодельный лог писать ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 11:17 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax ilyuha111 если матвью лог то его нет в XE :( самому вручную триггером самодельный лог писать ..... stax структура таблиц меняется следовательно надо менять структуру логов и за этим следить далее если клиентов 100 то 1 запись в справочнике = 100 записей в логе так ? если надо обновит 100К записей ? правильно я все понял ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 11:27 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender, не не совсем понятно зачем к тому же он больше change_id получился и еще на ora_rowscn я ни как не могу повлиять например я могу отключить триггер поставить change_id = 0 что бы эти строки времено не передавались ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 11:32 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 не не совсем понятно зачем ORA_ROWSCN тем и хорош что не будет 22119678 зы я надеялся на userenv('COMMITSCN') тож от коммита зависит ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 12:01 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax, поясните по ручным логам через триггер я правильно понял механизм или нет ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 12:11 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 Stax, поясните по ручным логам через триггер я правильно понял механизм или нет ? Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 12:34 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 к тому же он больше change_id получился ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 12:37 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 и еще на ora_rowscn я ни как не могу повлиять например я могу отключить триггер поставить change_id = 0 что бы эти строки времено не передавались ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 12:39 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 Stax, поясните по ручным логам через триггер я правильно понял механизм или нет ? надеюсь что правильно писать ВСЕ (вернее что необходимо) в лог, Вам возможно не подойдет из-за обьемов чем не подходит совет xtender (ORA_ROWSCN)? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 12:42 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Если вам вообще похрен на точность и консистентность6и прочее, то добавьте просто поле last_update_time и перезаливайте по этому временному полю . ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 12:44 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 структура таблиц меняется следовательно надо менять структуру логов и за этим следить далее если клиентов 100 то 1 запись в справочнике = 100 записей в логе так ? если надо обновит 100К записей ? правильно я все понял ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 13:04 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
вот пример был обмен old_change_id = 61582217550 далее мне нужно забрать все записи change_id > 61582217550 их все две и это так и есть, используя change_id я их вижу ora_rowscn я вижу кучу записей ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 13:50 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, change_id как(чем) заполняете? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 13:58 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 ora_rowscn я вижу кучу записей xtender К тому же, ORA_ROWSCN и так уже есть в таблице, только включите rowdependencies . ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:00 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
тут если есть незакрытая транзакция в момент обмена (1) то записей я еще не вижу (2) но вижу start_snc в (3) так что кода нибудь (через час например) когда транзакция закроется я смогу забрать change_id >=61663434929 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:01 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 тут если есть незакрытая транзакция ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:04 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax, 22119463 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:04 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 тут если есть незакрытая транзакция в момент обмена (1) то записей я еще не вижу (2) не закоммиченные записи ВЫ в оракле не увидите поетому xtender и предлогает ORA_ROWSCN (в древних COMMITSCN с нюансами) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:20 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 Stax, 22119463 у меня нет практики с Flashback поетому ничего не могу посоветовать Вам тестировать, напр запись меняется сутку (с утра update вечером commit) как синхронизация отработает, устраивает ли ето бизнес мож достаточно просто ночью все обновить и заморачиваться .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:29 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 тут если есть незакрытая транзакция в момент обмена (1) Жаль, что Вас не устраивают технологии, разработанные более 20 лет назад, работающие до сих пор в вендорском enterprise-коде, не нарушающие acid, а главное - легко воспроизводимые. Давно бы закрыли тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:32 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax поетому xtender и предлогает ORA_ROWSCN (в древних COMMITSCN с нюансами) Если бы Саян еще предложил эффективный метод доступа к данным по ora_rowscn - цены бы методу не было :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:48 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender, рассматривал ora_rowscn по этой ссылке http://torofimofu.blogspot.com/2016/12/orarowscn-oracle-11g.html 1 По умолчанию значение SCN, отображаемое в псевдостолбце ora_rowscn, хранится на уровне блока данных (если рандомно обновить 30% большой таблицы по передавать её придется почти целиком ) 2 К сожалению, с помощью alter table данное свойство включить нельзя. Нужно пересоздать таблицу: 3 Хранение SCN для каждой строки требует дополнительно 6 байт на строку.(как этот на xe повлияет вроде не должно но малоли) вот 3 пункта по которым ora_rowscn мне применять очень затратно ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:51 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 Хранение SCN для каждой строки требует дополнительно 6 байт на строку. Не, ну если все настолько плохо и ради экономии Вы готовы на любые затраты - то сразу рисуйте парсер [redo|archive]log-ов. Будет третий (?) - я лично знаю два - конкурент goldengate-у. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:58 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Stax поетому xtender и предлогает ORA_ROWSCN (в древних COMMITSCN с нюансами) Если бы Саян еще предложил эффективный метод доступа к данным по ora_rowscn - цены бы методу не было :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 15:06 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 3 Хранение SCN для каждой строки требует дополнительно 6 байт на строку ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 15:07 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
в общем то второй пункт не выполним пересоздать и перезалить все таблицы трудновыполнима select * from t_Country t WHERE T.ora_rowscn >=61663434930 Description Object owner Object name Cost Cardinality Bytes SELECT STATEMENT, GOAL = ALL_ROWS 3 5 110 TABLE ACCESS FULL ORGANIZ T_COUNTRY 3 5 110 TABLE ACCESS FULL - это тоже не понятно как решать ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 15:13 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 TABLE ACCESS FULL - это тоже не понятно как решать ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 15:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
-2-, t_Country это тестовая табличка другие побольше будут ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 15:22 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
-2-, предлагайте варианты без помех без дополнительно софта средствами хе на узких каналах связи для большого количества таблиц и клиентов офлан через ftp было работало,стабильно но мелено ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 15:31 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 для большого количества таблиц и клиентов клиенты ето базы или пользователи? большое количество ето 100, 1000, или миллионы? зы если синхронизация некретична, накатываем что вышло ночью (при минимальной активности), досихронизуруем (возможно по другому алгоритму) зыы прелесть логов в том что их можно офлайново передать и накатить но и обьемы соответствующие зыыы у нас пользуют капризный GG, но он платный .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 16:02 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax, клиентов максимально до 500-600 онлайн нужен чтобы перегонять накладные по сети , но накладные без справочников гонять нельзя часть обмена и так пол ночи идет онлайн из наблюдений решение которое работает для 20 клиентов не работает для 500 и наоборот :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 16:17 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, может проще решить на прикладном уровне синхронизуем не таблицы, а прикладные обьекты (накладные), с выставлением флажков (кто/когда/зачем/...) темболее, часто переданные (синхронизированые) уже нельзя изменить без санкции вышестоящих босов ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 16:24 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax может проще решить Это уже пошло кормление тролля, кмк. Круг доступных вариантов без привлечения стороннего ПО и в ограничениях XE 11.2, вообще говоря, обозначен. С учетом ограничений XE как источника изменений (в случае приемника вариантов больше): - дата изменения + перезаклад на максимально возможную/допустимую длительность транзакции. - самодельная реализация триггерной репликации на технологической основе mview log - отвергнута ТС, потому что "старая" и вообще разбираться лень - ora_rowscn - отвергнута ТС, потому что "6 байт на строку" и вообще "full table access" - парсинг redolog/archivelog - ТС проигнорирована Не упомянули разве что развитие вариантов триггерной репликации с выходом на: - AQ - utl_file - syslog - SOAP/REST/... - EXPPROC но оно тоже, наверное, не подходит :) Также не обсуждали замену триггера на OdciIndex при некоторых административных ограничениях, но это уже точно факультативно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 17:02 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111предлагайте варианты без помех без дополнительно софта средствами хе на узких каналах связи для большого количества таблиц и клиентов Это надо ждать розового единорога с Экскалибуром во лбу. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 17:42 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous, - дата изменения + перезаклад на максимально возможную/допустимую длительность транзакции. зачем закладка если при обмене точно знаю какие транзакции висят не завершенные - самодельная реализация триггерной репликации на технологической основе mview log - отвергнута ТС, потому что "старая" и вообще разбираться лень я так понимаю вы имеете ввиду следующий механизм заполонять триммерами точную копию таблицы а через какой то интервал времени проталкивать таблицу по всем клиентам затем очищать таблицу не подходит так как у кого то выходной ,нет инета, ком вырубили, и прочие проблемы. инициатива обмена идет от клиента тогда когда ему удобно - ora_rowscn - отвергнута ТС, потому что "6 байт на строку" и вообще "full table access" нет по причине того что надо пересоздать все таблицы которые участвуют в обмене rowdependencies. - парсинг redolog/archivelog - ТС проигнорирована базы noarchivelog Не упомянули разве что развитие вариантов триггерной репликации с выходом на: - AQ это не знаю что - utl_file это было - syslog это не знаю что - SOAP/REST/... это не знаю что - EXPPROC это не знаю что но оно тоже, наверное, не подходит :) Также не обсуждали замену триггера на OdciIndex при некоторых административных ограничениях, но это уже точно факультативно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 18:07 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 базы noarchivelog не понимаю я ето ps клиенты кто базы или пользователи (юсеры)? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:00 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 - самодельная реализация триггерной репликации на технологической основе mview log - отвергнута ТС, потому что "старая" и вообще разбираться лень я так понимаю вы имеете ввиду следующий механизм заполонять триммерами точную копию таблицы Я имею ввиду механизм, работающий в оракеле 25+ лет, детально описанный в статье 17-летней давности и который Вы отказались даже изучить. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:01 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 зачем закладка если при обмене точно знаю какие транзакции висят не завершенные "Проблема не в том, что человек смертен, а в том, что он - внезапно смертен."(с) МиМ ilyuha111 базы noarchivelog ТС, послушай анонимуса и не парь мозг. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:13 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 далее если клиентов 100 то 1 запись в справочнике = 100 записей в логе так ? если надо обновит 100К записей ? правильно я все понял ? при грамотной реализации - нет ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
MazoHistпри грамотной реализации - нет Значит существуют всего две реализации: грамотная и надёжно работающая. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:32 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov MazoHistпри грамотной реализации - нет две реализации: грамотная и надёжно работающая. Не порите чушь, ей больно. Грамотная и надежно работающая реализация не требует размножения записей в логе. Она требует, в случае множественных реплик, простого publish-subscribe механизма. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 20:17 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous ilyuha111 - самодельная реализация триггерной репликации на технологической основе mview log - отвергнута ТС, потому что "старая" и вообще разбираться лень я так понимаю вы имеете ввиду следующий механизм заполонять триммерами точную копию таблицы Я имею ввиду механизм, работающий в оракеле 25+ лет, детально описанный в статье 17-летней давности и который Вы отказались даже изучить. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139.
1 судя по всему CH_DT это дата ЗАВЕРШЕНИЕ транзакции я правильно понял ? подскажите как можно ёё получить в XE если эмулировать через триггеры 2 "и контрольный в голову: в логе без перемен. Когда отработают все нуждающиеся - можно будет почистить по ch_dt" и когда наступит этот момент никто не знает так же как ни кто не знает когда завершиться транзакция 3 скорей всего в этой процедуре SYNC_DROPME_T.syncronize('repsite1') вы используете что то вроде CH_DT >=RUN_DATE и связку лога с табличкой по ключу +- и результат этот запросы отстреливаете через бдлинк в базу клиента спасибо за разъяснение, гораздо проще чем в статье, не хватает еще команды создания лога. но я ограничен средствами ХЕ на данный момент внедряем на клиенте механизм dbms_flashback.get_system_change_number + V$TRANSACTION результат будет через неделю выложу тут пока бета-тетеры противоречий не нашли ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 20:54 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 1 судя по всему CH_DT это дата ЗАВЕРШЕНИЕ транзакции я правильно понял ? подскажите как можно ёё получить в XE если эмулировать через триггеры Нет. Это ключевой атрибут, позволяющий решить поставленную задачу и по сути не имеющий никакого отношения к каким-либо датам транзакций. Его вообще можно реализовать через sequence и назвать как-нибудь типа "bundle_id", но только когда поймете лежащую в основе гениально простую идею. Хинт: обратите внимание на начальное и конечное значение этого атрибута. Что касается XE: обратите внимание на тот факт, что в демо нет выборки из MLOG$_DROPME_T или вызовов dbms_mview. Вся демка реализована "с нуля" в предельно урезанном варианте, только показать, что "оно работает", минут за полчасика. Я к тому, что ни одной enterprise-фичи в демке не использовано. ilyuha111 2 "и контрольный в голову: в логе без перемен. Когда отработают все нуждающиеся - можно будет почистить по ch_dt" и когда наступит этот момент никто не знает так же как ни кто не знает когда завершиться транзакция Неверно. Этот момент легко отслеживается. Вернее, в любой момент времени можно однозначно сказать, какие именно записи лога можно удалить. Делается это по-разному. В том варианте, который я показал - выборкой "минимального из максимальных" repsite%_sync_log. В более общем варианте - из каталога "подписчиков", где каждый из них и отмечает что он уже забрал, а что - еще нет. ilyuha111 3 скорей всего в этой процедуре SYNC_DROPME_T.syncronize('repsite1') вы используете что то вроде CH_DT >=RUN_DATE и связку лога с табличкой по ключу +- и результат этот запросы отстреливаете через бдлинк в базу клиента Алгоритм в статье. И нет, dblink - совершенно не обязателен. Нет никаких проблем использовать этот механизм, к примеру, для выгрузки пакета изменений в файл и пересылки его электропочтой/флешкой на удаленный сайт с плохой связью. Я когда-то использовал данный подход для асинхронного уведомления тарификатор(ов) об изменениях в абонентских данных (баланс, услуги и т.п.), позже допилили до самодельного AQ (во времена 9i/10g AQ был недоступен/платной опцией). Т.е. никаких препятствий для реализации на XE нет. Что касается v$transaction. Первое, что следует знать - эти представления не гарантируют consistency, потому как не являются честными view. В принципе, мне этого более чем достаточно, чтобы не завязывать на них транзакционную логику. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 21:30 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymousОна требует, в случае множественных реплик, простого publish-subscribe механизма. Остаётся только решить простенькую задачу отличения уже отреплицированных записей от ещё нереплицированных для каждого подписчика отдельно. Что, внезапно, решается их размножением. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andrey_anonymousОна требует, в случае множественных реплик, простого publish-subscribe механизма. Остаётся только решить 22120152 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:36 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 на данный момент внедряем на клиенте механизм dbms_flashback.get_system_change_number + V$TRANSACTION andrey_anonymous, про ora_rowscn можно и упростить доступ и сделать эдакий самодельный mview log без пересоздания исходных таблиц с rowdependencies: достаточно создать отдельную таблицу лог с включенным rowdependencies и пулять туда rowid исходной таблицы. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
"TABLE_NAME""RID""ORA_ROWSCN""TEST1""AAAxFRAAMAAAAZ2AAA""111473320""TEST2""AAAxFSAAMAAAAcOAAA""111473324""TEST3""AAAxFTAAMAAAAcWAAA""111473328""TEST1""AAAxFRAAMAAAAZ2AAB""111473331""TEST1""AAAxFRAAMAAAAZ2AAC""111473331""TEST1""AAAxFRAAMAAAAZ2AAD""111473331""TEST1""AAAxFRAAMAAAAZ2AAE""111473331""TEST1""AAAxFRAAMAAAAZ2AAF""111473331""TEST1""AAAxFRAAMAAAAZ2AAG""111473331""TEST1""AAAxFRAAMAAAAZ2AAH""111473331""TEST1""AAAxFRAAMAAAAZ2AAI""111473331""TEST1""AAAxFRAAMAAAAZ2AAJ""111473331""TEST1""AAAxFRAAMAAAAZ2AAK""111473331""TEST1""AAAxFRAAMAAAAZ2AAG""111473335""TEST1""AAAxFRAAMAAAAZ2AAH""111473335""TEST1""AAAxFRAAMAAAAZ2AAI""111473335""TEST1""AAAxFRAAMAAAAZ2AAJ""111473335""TEST1""AAAxFRAAMAAAAZ2AAK""111473335" Можно добавить туда еще поле insert_time, для отсечки/чистки по дате с запасом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:54 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous, до коммита RID CH_DT ------------------ ----------- AAAk3AAAMAAAACEAAA 01.01.4000 после коммита RID CH_DT ------------------ -------------------- AAAk3AAAMAAAACEAAA 21.04.2020 18:45:50 у меня нет решения как это реализовано в статье это скорей всего MLOG $ _.SNAPTIME $$ но оно там просто есть а как его заполнили не написано ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:56 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 у меня нет решения как это реализовано в статье это скорей всего MLOG $ _.SNAPTIME $$ но оно там просто есть а как его заполнили не написано Really?! авторBasically the refresh operation consists of 3 phases: 1. Setup. During this phase the PL/SQL RPC dbms_snapshot.set_up is called from the snapshot site. Setup has to verify if the snapshot being refreshed is a ROWID or primary key snapshot. Then it is necessary to verify if a fast-refresh can be performed. Afterwards the snaptime$$ column is updated in the snapshot log mlog$_t1 of the altered rows to its own refresh date and time for the first snapshot that refreshes . This value does not change until the rows are eventually purged from the log. 2. Refresh Operation. 2.1 Call dbms_snapshot.verify_log and determine if a fast-refresh can take place. After dbms_snapshot.set_up is called a second check is made by calling the PL/SQL RPC dbms_snapshot.verify_log which is also called from the snapshot site to ensure that each refreshing snapshot can use the snapshot log. In order for the snapshot log to be used the timestamp of oldest/oldest_pk column in mlog$ must be older than the time of last refresh. 2.2 Delete the rows that are no longer in the master table. 2.3 Applying modifications from the master. 3. Wrap-up. The PL/SQL RPC dbms_snapshot.wrap_up called from the snapshot site checks if the least recently updated snapshot has refreshed and therefore the snapshot log entries can be purged. If the log gets purged and an error occurs after this routine the next time this snapshot refreshes, it will need to be entirely reinstantiated. Then it is checked if registration of the snapshot is required on the master. This is only the case if the snapshot id was increased/changed at some point. Кроме общего устройства и назначения отдельных компонент механизма, много букв посвящено разбору вопросов эксплуатации - какие они, эти вопросы, бывают и как с ними работать. Надо просто читать не по диагонали - текст информационно насыщенный, не маркетинговый буллшит. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 23:25 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous, Наверно не так выразился, я не понял как эмулировать это изменения средствами хе тригера вставляют Дату начала транзакции ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 23:40 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 andrey_anonymous, Наверно не так выразился, я не понял как эмулировать это изменения средствами хе тригера вставляют Дату начала транзакции Блин, ну битами по байтам же написано - триггер бьет default-значение, а Refresh в фазе setup должен провести update этого атрибута с default на текущее значение (sysdate или новым значением sequence), зафиксировав, таким образом, свой "улов". Вот так просто. Тупо, как валенок и надежно, как автомат Калашникова. Поскольку атрибут монотонно возрастает, то прочие операции refresh смело используют его в своем фильтре between. ...обратите, кстати, внимание на предложение xtender по ведению аналогичного лога на базе ora_rowscn - Саян, как обычно, изящен. ora_rowscn тоже монотонно возрастает, отвечая всем требованиям к snaptime$$, и при этом update в фазе setup проводить не потребуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:02 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous парсинг redolog/archivelog - ТС проигнорирована Он ипользуется мехнизм задач, чтоб отправлять изменения асинхронно, но если все джобы отключить, сделать изменения, а потом снова включить, то все изменения будут отправлены. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Вроде джобы на XE есть и notifications тоже хотя насчет последнего я не уверен. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:04 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег Database Change Notification примерно этим и занимается Я десять раз подумал бы, прежде чем поставить подобное решение на непатченную БД и заметные объемы. Хотя это, возможно, просто моя паранойя - поделитесь практическим опытом применения, if any. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Вот так просто. Вот теперь до меня дошло. Контрольный вопрос: вызовы syncronize() сериализованы или она может вызываться параллельно для разных реплик? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:39 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andrey_anonymous Вот так просто. Вот теперь до меня дошло. Контрольный вопрос: вызовы syncronize() сериализованы или она может вызываться параллельно для разных реплик? Между репликами имеет смысл сериализовывать update_snaptime$$, прочие операции можно выполнять параллельно. Если применить вместо snaptime$$ ora_rowscn - то сериализация refresh между репликами не потребуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:58 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Кобанчег Database Change Notification примерно этим и занимается Я десять раз подумал бы, прежде чем поставить подобное решение на непатченную БД и заметные объемы. Хотя это, возможно, просто моя паранойя - поделитесь практическим опытом применения, if any. В механизме уведомлений под капотом создается следующая задача Код: plsql 1. 2. 3. 4. 5.
DBMS_AQADM_SYS.REGISTER_DRIVER Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Если более детально - задача создается при возникновении уведомления, после его обработки смотрит были ли другие изменения и начинает их обрабатывать если надо. Если ничего не было - то по таймауту задание исчезает. Потом при изменениях появится новое. Самое приятное здесь как уже было сказано, что если задания отлючить, а потом снова включить, то все изменения подхватятся. И даже если база в noarchivelog. (впрочем noarchivelog я не тестировал с гигабайтами изменений ибо это уже совсем какой-то абсурд) Более того, в итоге под капотом вызываются сишные функции и этот механизм встроен в сам движок Оракла и никаких триггеров. Если высокая интенсивность DML, то как раз это будет создавать меньше overhead чем разнообразные поделки с триггерами. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 01:11 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег под капотом вызываются сишные функции Под капотом там банальный AQ. Системные триггеры пулят в очередь, Archivelog не при делах. Положите job_queue_process'ы - будет пухнуть Queue Table, принудительное похудание которой имеет свою специфику - на 11g не помню, но на 10g можно было влететь в нежданный блудняк. Поднимаете job_queue_process - он начинает обрабатывать очередь (подписчик). Как следствие, overhead по хранению там приличный, механизмы publish/subscribe похожи, хотя интерфейсы малость избыточны, да еще и не совсем понятный механизм собственно отлова событий - через регистрацию запросов - эффективность которого мне не очевидна. Из плюсов - можно сразу подписать на события очереди с реплик. Из минусов - специфическая эксплуатация, было несколько AQшных багов (к вопросу о непатченной XE) + возможные баги собственно нотификаций. Если уж идти на AQ, то делать свой отлов изменений и пакетировать их по много штук в одно сообщение - снизится нагрузка на очереди как таковые. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 01:28 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Кобанчег под капотом вызываются сишные функции Под капотом там банальный AQ. Системные триггеры пулят в очередь andrey_anonymous Если уж идти на AQ, то делать свой отлов изменений и пакетировать их по много штук в одно сообщение - снизится нагрузка на очереди как таковые. Как верно было замечено "Системные триггеры пулят" и пакетируют покомитно. В одном коммите может быть уйма изменений. Под "механизм собственно отлова событий" и подразумевалось "под капотом вызываются сишные функции". AQ and jobs это лишь обслуживающие механизмы, чтоб обеспечить асинхронность уведомлений и убрать всякую нагрузку на основной процесс. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:12 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег механизм Database Change Notification Кобанчег Если высокая интенсивность DML, то как раз это будет создавать меньше overhead чем разнообразные поделки с триггерами. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:13 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег AQ and jobs это лишь обслуживающие механизмы ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:15 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Есть еще такая хрень: Bug 14765437 : DATABASE CHANGE NOTIFICATION RETURNS INCORRECT ROWID DETAILED PROBLEM DESCRIPTION : database change notification returns incorrect rowid for rows which are chained/migrated WORKAROUND INFORMATION : reorg table so that there are not changed rows. Status 84 - Closed, not feasible to fix ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:24 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег AQ and jobs это лишь обслуживающие механизмы, чтоб обеспечить асинхронность уведомлений и убрать всякую нагрузку на основной процесс. Смешно, да. Нагрузка на основной процесс в виде записи в queue table никуда не делась в сравнении с уже обсуждавшимися вариантами - только тут дополнительно требуется создать объект, затем его сериализовать, отписать сопроводиловку и лишь после этого сложить в табличку очереди. Про обертки над обработчиком Саян, в принципе, уже написал - в рамках обсуждаемой темы это скорее зло и никакие "сишные функции" не отменят этого факта. В конце концов, можно применить native compilation и получить те же "сишные функции" из pl/sql, которые тоже будут вызываться ядром :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:27 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender Асинхронность - это здорово, но, как следствие, страдает консистентность и вообще упорядоченность. Непонятно какая консистентность страдает. Упорядоченность точно не нарушается поскольку сообщения выгребаются поочередно. xtender Он все-таки задуман для того, чтобы самому пулять что-то куда-то. xtender по опыту механизм рабочий, но не самый надежный Или use case потери изменения (только не от кривости callback процедуры :)). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:27 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Смешно, да. CDC тоже норм механизм если его уметь готовить, я ж не отрицаю. andrey_anonymous В конце концов, можно применить native compilation и получить те же "сишные функции" из pl/sql, которые тоже будут вызываться ядром :) Native compilation так же далеко по производительности от C как остров святой Елены от цивилизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:38 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег, Чтобы без лишних слов и споров, давай ты сделаешь полный рабочий пример на нескольких таблицах, а я просто над ним побалуюсь. Например, буду в одной транзакции сразу несколько таблиц буду менять? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:38 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Особенно интересно, что будет в твоей таблице-логе при этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:40 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Да и вообще, траблшутинг этой штуки на порядки сложнее и муторнее всех остальных вариантов. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:48 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender Особенно интересно, что будет в твоей таблице-логе при этом. Ну тогда берем пример из доки и делаем replace chnf_callback на t_callback. t_callback Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.
Create database tables to hold records of notification events received Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Потом Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Хотя я не очень понял что требуется от меня, ты и сам прекрасно мог бы это скопипастить. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:57 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег, где scn или метка изменения, по которой другие базы будут забирать изменения с...? xtender рабочий пример на нескольких таблицах , а я просто над ним побалуюсь. Например, буду в одной транзакции сразу несколько таблиц буду менять? xtender Особенно интересно, что будет в твоей таблице-логе при этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 03:09 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender что будет в твоей таблице-логе при этом. Использовать все это счастье ради ведения таблицы-лога, серьезно?! Я рассматривал лишь вариант доставки lcr непосредственно до целевой реплики - это хоть как-то оправдывает идею ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 03:33 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender, Так норм? Код: plsql 1. 2. 3. 4. 5. 6.
+ в callback Код: plsql 1. 2.
За сим спешу откланяться. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 03:35 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous вариант доставки ... непосредственно до ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 03:39 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег xtender, Так норм? Код: plsql 1.
. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 03:45 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous, Собственно, я про это и говорил, что механизм qcn не совсем для этого, но у тс как заявлено до 500 удалённых баз, которые ещё и недоступны периодически, что приводит к необходимости вытягивания измененных данных самими целевыми базами. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 03:49 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous, Неверно. Этот момент легко отслеживается. Вернее, в любой момент времени можно однозначно сказать, какие именно записи лога можно удалить. Делается это по-разному. В том варианте, который я показал - выборкой "минимального из максимальных" repsite%_sync_log. В более общем варианте - из каталога "подписчиков", где каждый из них и отмечает что он уже забрал, а что - еще нет. тут есть некоторые практические проблемы 1 пока все не скачают лог чистить нельзя, но вот есть объекты на побережье которые на пол года закрываются и соответственно ничего не качают держать логи не чищеными по пол года будет грустно, поэтому была идея множить записи (1=100) 2 некоторые объекты закрываются и качать не будут и нужно вручную исключать их из подписчиков, это задача операторов, но пока их не пнешь ничего не измениться ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 10:57 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Для случая XE, КМК, дешевле заливать каждый час/10 мин TTS со справочниками, чем парится с репликацией ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 11:33 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Vadim Lejnin Для случая XE, КМК, дешевле заливать каждый час/10 мин TTS со справочниками, чем парится с репликацией авторOracle® Database Express Edition Licensing Information 11g Release 2 (11.2) … 2 Feature Availability … 2.1 Options and Major Features Not Included The following options and major features are not included with Oracle Database XE: …
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 12:31 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, я просил бы Вас все-таки разобраться с цитированием на форуме - очень сложно читать. ilyuha111 тут есть некоторые практические проблемы 1 пока все не скачают лог чистить нельзя, но вот есть объекты на побережье которые на пол года закрываются и соответственно ничего не качают держать логи не чищеными по пол года будет грустно, поэтому была идея множить записи (1=100)
ilyuha111 Это тоже можно обыграть, установив предельный срок хранения логов. Подписчик, пытающийся синхронизироваться по истечении такого срока, получит exception на фазе setup и должен перейти к процедуре полной пересинхронизации. Критерии подобного поведения есть в статье (самая старая запись лога должна быть старше самого свежего ключа синхронизации конкретного подписчика). В статье также описаны процедуры принудительного отлучения подписчика от репликации и зачистки логов. Просто надо изучить тему в подробностях - все эти вопросы уже 25+ лет как рассмотрены и так или иначе решены. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 12:49 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender ну приехали... Совсем не норм. Все остальные свистопердлеки допиливаются будь на то необходимость. Моей ошибкой было начать предоставлять детальный код. Если сам захочешь разобраться - разберешься. В качестве доказательства ненадежности был предоставлен баг для версии 11.2.0.3 на солярке. С таким же успехом я могу предоставить на несколько порядков больше багов про параллельное выполнение. И что? Ты перестанешь его использовать? У дырявого Оракла баги есть чуть больше чем везде. Вон даже в самых базовых вещах типа внешних ключей бывает такое 10009012 . Я думал говоря про "ненадежность" тут будет беседа экспертов про архитектурные уязвимости, а увидел только "мы этого не знаем - потому это плохо". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 13:36 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег Если сам захочешь разобраться - разберешься. Кобанчег Моей ошибкой было начать предоставлять детальный код. Кобанчег В качестве доказательства ненадежности был предоставлен баг для версии 11.2.0.3 на солярке. Кобанчег Я думал говоря про "ненадежность" тут будет беседа экспертов про архитектурные уязвимости, а увидел только "мы этого не знаем - потому это плохо". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 14:11 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender Кобанчег Моей ошибкой было начать предоставлять детальный код. Тут абсолютно неразумно реализовывать логику в callback proc и полагаться что у всех у них все пройдет гладко. При таких вводных DIY с индексированным логом изменений типа показанного тобой смотрится достаточно предпочтительно. Кстати может я пропустил, но не было сказано кто такие клиенты. По всей вероятности это не базы. Если б их были десятки и драйвер JDBC (или .net), то можно было бы использовать другие уведомления . :) При таком раскладе для конкретной DatabaseChangeRegistration регистрируются клиентские листенеры и получают уведомления. xtender Я думал ты предоставишь код, а я предоставлю пару примеров, когда "консистентность и упорядоченность" нарушаются. Например, когда твой коллбэк для более ранней, но крупной транзакции, закончится позже более поздних, но коротких. Соответственно, более ранние изменения станут видны позже. DBMS_AQADM_SYS.REGISTER_DRIVER не приступит к обработке следуюшего изменения не закончив текущее. На одно уведомление не может быть более чем одной запущенной задачи AQ$_PLSQL_NTFN. Ну это все мои исследования, нигде в интернетах не попадался детыльный анализ внутренностей. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 14:57 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег ТС желал change_id, для этих целей элементарно используется registration_id. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
"REGID""EVENT_TYPE""XID""ORA_ROWSCN""301""7""08000A000F9C0000""111582628""301""7""0A0001007C340100""111582636""301""7""08000300159C0000""111582641" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 15:10 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender, То я херню сказал, это же айдишник из метаданных. Придется прибегать к тяжелой артиллерии в виде identity/sequence. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 15:21 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег ТС желал change_id, для этих целей элементарно используется registration_id. Ни один атрибут, сформированный транзакцией, проводящей dml, использован быть не может. Тут подойдут либо ora_rowscn централизованной таблицы-лога (nfevents), либо генерация последовательности при выборке сообщений из очереди. Сейчас уже не помню, как именно гребутся сообщения из неприоритезированной очереди. Если иначе чем из mlog$ - то возможны инверсии. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 15:24 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1881319]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
121ms |
get tp. blocked users: |
2ms |
others: | 288ms |
total: | 499ms |
0 / 0 |