powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация таблиц
118 сообщений из 118, показаны все 5 страниц
Синхронизация таблиц
    #39947990
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день
дано 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 находиться в открытых транзакциях
или какой другой способ синхронизации
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39947994
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111,

Используй commit scn, самописный журнал изменений или матвью.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948091
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
или матвью.

или mat. view log.
или ogg/аналоги
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948095
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
4 запрос всех записей > последнего change_id (а их еще нет, так как не произошел коммит)

Классическая иллюстрация того, почему не следует делать интеграцию данных подобным образом.
Если нет возможности воспользоватся спец. инструментами типа OGG и нет желания возиться с mview log/прочей рукописью с commit_scn/ретроспективными запросами, то можно смягчить проблему, просто сделав
Код: plaintext
"запрос всех записей > последнего change_id-DELTA"
, где дельта подбирается по критерию "покрыть не менее X% проблемных транзакций".
Ессно, на "той стороне" при этом выполняется merge.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948236
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас была похожая схема и похожие проблемы. Нужно использовать не неравенство а списки.
Любой change_id сохраняется в таблицу unprocessed_ids. Когда приходит время синхронизации, то все из unprocessed_ids селектится в аналогичную
по структуре таблицу processing_ids, и по этому списку забираются изменения. А потом выполняется delete from unprocessed_ids where id in (select * from processing_ids). При такой схеме не будет потеряно ни одного изменения.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948243
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHist
А потом выполняется delete from unprocessed_ids where id in (select * from processing_ids). При такой схеме не будет потеряно ни одного изменения.

"наши руки не для скуки" (с)
Откройте для тебя mat. view log.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948298
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вариант который рассматриваем как основной
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 в таблице

возможно тут есть недостатки
если одновременно происходит несколько транзакций с разным временем завершения
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948300
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mat. view log
не совсем понятно как это использовать на практике
mat. view log используем для ускорения рефреша больших аналитических таблиц
там хранятся изменения между после последнего рефреша
и затираются если рефреш прошел

если есть несколько таблиц обмена (некоторые большие) и есть несколько клиентов куда нужно изменения транслировать
и все это нужно делать средствам которые доступны в XE11.2
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948307
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111,

т.е. на каждый чих будет взводиться change_id всей таблицы?
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948310
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oragraf,
нет в этой таблице 1 запись с последним закомиченым CHANGE_ID
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948323
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111

возможно тут есть недостатки
если одновременно происходит несколько транзакций с разным временем завершения


не совсем понятно как это использовать на практике
все выстроятся в очередь (+ возможные деадлоки)
превратите систему почти в "однопользовательскую"

ps
BEFORE INSERT or UPDATE
удаление игнорируєте

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948326
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111,
еще раз: забудьте о диапазонах и максимальной границе, используйте списки и все получится.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948346
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
удаление из таблиц не делается есть поле логического удаления

unprocessed_ids
тут не совсем понятно как это делать на 100 клиентах
у каждого клиента обмены приходят не регулярно интервал между обмена от 1-2 часа до 1-2 недели у разных клиентов по разному
в некоторых табличках может накопиться до 1М записей
одна строчка между обменами может изменяться несколько раз
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948353
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHist
ilyuha111,
еще раз: забудьте о диапазонах и максимальной границе, используйте списки и все получится.


если на принимающей много ФК то не все так просто (может выстрелить в не неподходящий момент)

в идеале писать лог и его применять
(можно попыталься использовать логминер, но нужен опыт да и нюансов наверное много)

зы
для общего моего развития
в новейших версиях GG остался платным?

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948384
Фотография 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 и совершенно для других задач, но проверено лично.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948386
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
в новейших версиях GG остался платным?

Ну как можно отказаться от монетизации Streams в наши сложные времена? :)
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948405
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Stax
в новейших версиях GG остался платным?

Ну как можно отказаться от монетизации Streams в наши сложные времена? :)

я так понял, пока за денежку

spatial стал бесплатным
предложили занятся GraphRDF Knowledge Graph

я не совсем чесно спросил, подумал мож и GG амнистировали

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948438
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111,
тогда нужно делать полноценный журнал (копия таблицы со всеми изменениями) и механизм т.н. подписчиков, когда каждый забирает только то что ему положено. Данная схема применялась в одной крупной компании и за все время работы ни разу не дала сбоя.

авторесли на принимающей много ФК то не все так просто (может выстрелить в не неподходящий момент)
deferrable constraints
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948576
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не много по другому поставлю вопрос

поле 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
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948578
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
если я как нибудь смогу узнать sq_change_id.nextval в незакрытых транзакциях

Видимо, чукча не читатель.
Ну успехов тогда.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948667
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.

или пишите по теме или не пишите вообще
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948708
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
или не пишите вообще

Так тому и быть, боритесь самостоятельно - понимание или придет позже, или не придет совсем.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948713
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111,

Во-первых, не грубите, а во-вторых, спокойно перечитайте то, что вам уже дали(чего в целом уже достаточно), если же опять не поймете, то спрашивайте вежливо и конкретно, что именно не поняли.
ilyuha111
4 теперь последний законченный CHANGE_ID в таблице
какая-то крайне неудачная эмуляция ora_rowscn через превращение системы в однопользовательскую из-за блокировки строки таблицы t_change_id
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39948726
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,
да согласен идея не удачная
но других пока не нашли
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949111
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тестируем этот вариант
создаем функцию

Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace function f_ret_change_id return number is
  Result number;
  i number;
begin
  Result := dbms_flashback.get_system_change_number;
  return(Result);
end f_ret_change_id;



которая заполняет CHANGE_ID через триггер

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE TRIGGER TR_VENDOR_BI BEFORE INSERT or UPDATE
  ON T_VENDOR FOR EACH ROW

BEGIN

  :NEW.VENDOR_ID := COALESCE(:NEW.VENDOR_ID,ORGANIZ.SQ_VENDOR.NEXTVAL);
  :NEW.CHANGE_ID := f_ret_change_id;  
END;




тут узнаем если открытые транзакции с таблицами которые участвуют в обмене
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 
create or replace view v_open_tran as
Select t.START_SCN, ftq.table_name
from V$TRANSACTION t,
 Flashback_Transaction_Query ftq,
T_EXCHANGE_TABLES  et
 where t.XID = ftq.xid 
  and et.table_name = ftq.table_name
  and et.ia_enable = 1
 and  ftq.table_name is not null
 group by t.START_SCN, ftq.table_name;



на стороне клиента
Код: plsql
1.
 insert into  t_open_tran select * from v_open_tran@base


храним эти транзакции чтобы перекачать позже

получаем текущий change_id с мастер базы
Код: plsql
1.
new_change_id := f_ret_change_id@base



далее делаем запросу примерно такого вида
Код: plsql
1.
2.
 
select * from t_vender@base where change_id between old_change_id and new_change_id


собственно получаем либо новые записи либо измененные
завершение обмена записываем новый new_change_id в базу клиента, с ним будем начинать следующий обмен
old_change_id := new_change_id

второй блок обмена
повторяет те же действия но только с таблицами из t_open_tran
Код: plsql
1.
2.
 
select * from t_vender@base where change_id between START_SCN and new_change_id




вопрос есть ли у этого метода недостатки которые мы не заметили ?
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949119
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
собственно получаем либо новые записи либо измененные
Либо пропускаете часть изменений. Про репликацию читай у классикаМаршакПриехали в город Житомир.
Носильщик пятнадцатый номер
Везёт на тележке багаж:
Диван,
Чемодан,
Саквояж,
Картину,
Корзину,
Картонку,
А сзади ведут собачонку.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949164
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111
CHANGE_ID
Во-первых, это абсолютно нерабочая попытка переизобрести ora_rowscn - зачем вы это пытаетесь сделать? Момент вызова вашей функции абсолютно никак не согласован с моментом реального коммита. К тому же, ORA_ROWSCN и так уже есть в таблице, только включите rowdependencies.
Во-вторых, вы так упорно хотите наступить на грабли, что не хотите прочитать и осознать то, что вам уже посоветовали, что кажется помогать вам бесполезно.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949193
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

да пропускаются записи которые не закончены
для этого и просматривается открытые транзакции на момент обмена
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949207
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

пересмотрел все что советовали
большая часть не работает в XE
вторая часть платная
либо все эти снапшоты забьют паять настолько что XE не потянет такой объем
и советы типа
"напиши так как я раньше писал и оно как то работало вот ссылка которая тебе не подойдет"

еще немного вводных
таблиц для обмена больше 100
клиентов примерно столь-же
примерно раз в месяц меняется набор таблиц для обмена или добавляются удаляются новые колонки

качаем эти грабли, потому что они уже как то работают
записи продают при обмене, но это не так критично, чтобы глобально что то переписывать или что то покупать

согласованность особо не нужна, необходимо чтобы при завершении открытой транзакции на момент обмена change_id > START_SCN
если некоторые данные передадутся дважды это не так критично
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949213
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111,

предлагаю упрощенный вариант
1) в каждой табличе в базе1 и базе2 есть поле change_id, которое только в базе1 заполняется триггером из последовательности
2) для синхронизации используем мерже

Код: plsql
1.
2.
3.
4.
merge
  into t1@b2
  using(select * from t1@b1 b1 where b1.change_id>(select max(change_id) from t1@b2))
...


select max(change_id) from t1@b2) можно и как переменную вычислять до мерже

@ чтоб поняно было из каких баз


3) синхронизировать СНАЧАЛА таблицы с ФК потом мастер

схема не будет работать со сложной системой фк-пк (напр ссылка по кругу а-б-с-а)
но мож у Вас нет такого

критикуйте

зы
правильно лог и его накат, но ето сложнее

pss
насчет change_id
в древних версиях была слабо документированная "ф-ция" userenv('COMMITSCN');
почитайте
.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949216
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxпредлагаю упрощенный вариант
2 сессии.
Вначале идет коммит с большим change_id,
а потом с меньшим
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949228
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
последний new_change_id это и есть select max(change_id) from t1@b2

"если Вначале идет коммит с большим change_id,а потом с меньшим"
то это не так важно так как обе транзакции попадут в неравенство
единственная проблема это открытые транзакции в момент обмена
change_id у же передвинулся а данные еще не закончены и его нельзя использовать как old_change_id
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949229
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

зы
правильно лог и его накат, но ето сложнее

если матвью лог то его нет в XE :(
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949240
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111
единственная проблема это открытые транзакции в момент обмена
еще раз - используйте ora_rowscn хотя бы, а не свои change_id
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949241
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,

не подумал что транзакции могут по разному закончится

......
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949244
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111

если матвью лог то его нет в XE :(

самому вручную триггером самодельный лог писать

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949251
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
ilyuha111

если матвью лог то его нет в XE :(

самому вручную триггером самодельный лог писать

.....
stax


структура таблиц меняется следовательно надо менять структуру логов и за этим следить
далее если клиентов 100 то 1 запись в справочнике = 100 записей в логе так ?
если надо обновит 100К записей ?

правильно я все понял ?
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949254
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

не не совсем понятно зачем
к тому же он больше change_id получился
и еще на ora_rowscn я ни как не могу повлиять
например я могу отключить триггер поставить change_id = 0 что бы эти строки времено не передавались
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949264
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111

не не совсем понятно зачем


ORA_ROWSCN тем и хорош что не будет 22119678

зы
я надеялся на userenv('COMMITSCN') тож от коммита зависит


.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949269
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

поясните по ручным логам через триггер
я правильно понял механизм или нет ?
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949286
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
Stax,

поясните по ручным логам через триггер
я правильно понял механизм или нет ?

Нет.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949287
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111
к тому же он больше change_id получился
потому что вы не понимаете что такое dbms_flashback.get_ system _change_number
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949291
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111

и еще на ora_rowscn я ни как не могу повлиять
например я могу отключить триггер поставить change_id = 0 что бы эти строки времено не передавались
проще и правильнее добавить поле-признак синхронизировать или нет.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949294
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
Stax,

поясните по ручным логам через триггер
я правильно понял механизм или нет ?


надеюсь что правильно
писать ВСЕ (вернее что необходимо) в лог, Вам возможно не подойдет из-за обьемов

чем не подходит совет xtender (ORA_ROWSCN)?

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949295
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если вам вообще похрен на точность и консистентность6и прочее, то добавьте просто поле last_update_time и перезаливайте по этому временному полю .
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949307
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111
структура таблиц меняется следовательно надо менять структуру логов и за этим следить
далее если клиентов 100 то 1 запись в справочнике = 100 записей в логе так ?
если надо обновит 100К записей ?

правильно я все понял ?
вы так и не поняли из чего состоит структура mview log (mlog$_xxx)?
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949328
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот пример
был обмен
old_change_id = 61582217550
далее мне нужно забрать все записи change_id > 61582217550
их все две и это так и есть, используя change_id я их вижу
ora_rowscn я вижу кучу записей
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949334
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111,

change_id как(чем) заполняете?

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949337
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111
ora_rowscn я вижу кучу записей

xtender
К тому же, ORA_ROWSCN и так уже есть в таблице, только включите rowdependencies .
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949338
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут если есть незакрытая транзакция в момент обмена (1)
то записей я еще не вижу (2)
но вижу start_snc в (3)
так что кода нибудь (через час например) когда транзакция закроется я смогу забрать change_id >=61663434929
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949346
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111
тут если есть незакрытая транзакция
это вы сами себе проблем насоздавали из-за dbms_flashback.get_system_change_number, вместо ora_rowscn
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949347
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
22119463
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949353
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
тут если есть незакрытая транзакция в момент обмена (1)
то записей я еще не вижу (2)

не закоммиченные записи ВЫ в оракле не увидите
поетому xtender и предлогает ORA_ROWSCN (в древних COMMITSCN с нюансами)

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949359
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
Stax,
22119463

у меня нет практики с Flashback
поетому ничего не могу посоветовать
Вам тестировать, напр запись меняется сутку (с утра update вечером commit)
как синхронизация отработает, устраивает ли ето бизнес

мож достаточно просто ночью все обновить и заморачиваться

....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949365
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
тут если есть незакрытая транзакция в момент обмена (1)

Жаль, что Вас не устраивают технологии, разработанные более 20 лет назад, работающие до сих пор в вендорском enterprise-коде, не нарушающие acid, а главное - легко воспроизводимые.
Давно бы закрыли тему.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949378
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
поетому xtender и предлогает ORA_ROWSCN (в древних COMMITSCN с нюансами)

Если бы Саян еще предложил эффективный метод доступа к данным по ora_rowscn - цены бы методу не было :)
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949381
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 мне применять очень затратно
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949388
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
Хранение SCN для каждой строки требует дополнительно 6 байт на строку.

Не, ну если все настолько плохо и ради экономии Вы готовы на любые затраты - то сразу рисуйте парсер [redo|archive]log-ов.
Будет третий (?) - я лично знаю два - конкурент goldengate-у.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949392
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous
Stax
поетому xtender и предлогает ORA_ROWSCN (в древних COMMITSCN с нюансами)

Если бы Саян еще предложил эффективный метод доступа к данным по ora_rowscn - цены бы методу не было :)
ну я могу что-нибудь еще навыдумывать, но ты определись какие два из трех выберешь: быстро, дешево, надежно
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949393
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ilyuha111
3 Хранение SCN для каждой строки требует дополнительно 6 байт на строку
ваш CHANGE_ID тот же SCN
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949396
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем то второй пункт не выполним пересоздать и перезалить все таблицы трудновыполнима
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 - это тоже не понятно как решать
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949402
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
TABLE ACCESS FULL - это тоже не понятно как решать
При cardinality=5 решать нужно радикально. Что ora_rowscn, что лог-таблицы - только помеха.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949406
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,
t_Country это тестовая табличка другие побольше будут
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949413
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

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

офлан через ftp было работало,стабильно но мелено
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949424
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111

для большого количества таблиц и клиентов


клиенты ето базы или пользователи?

большое количество ето 100, 1000, или миллионы?

зы
если синхронизация некретична, накатываем что вышло

ночью (при минимальной активности), досихронизуруем (возможно по другому алгоритму)

зыы
прелесть логов в том что их можно офлайново передать и накатить
но и обьемы соответствующие

зыыы
у нас пользуют капризный GG, но он платный
....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949438
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

клиентов максимально до 500-600

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


из наблюдений решение которое работает для 20 клиентов не работает для 500 и наоборот :)
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949441
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111,

может проще решить на прикладном уровне

синхронизуем не таблицы, а прикладные обьекты (накладные), с выставлением флажков (кто/когда/зачем/...)

темболее, часто переданные (синхронизированые) уже нельзя изменить без санкции вышестоящих босов

.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949458
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
может проще решить

Это уже пошло кормление тролля, кмк.
Круг доступных вариантов без привлечения стороннего ПО и в ограничениях XE 11.2, вообще говоря, обозначен.
С учетом ограничений XE как источника изменений (в случае приемника вариантов больше):

- дата изменения + перезаклад на максимально возможную/допустимую длительность транзакции.
- самодельная реализация триггерной репликации на технологической основе mview log - отвергнута ТС, потому что "старая" и вообще разбираться лень
- ora_rowscn - отвергнута ТС, потому что "6 байт на строку" и вообще "full table access"
- парсинг redolog/archivelog - ТС проигнорирована
Не упомянули разве что развитие вариантов триггерной репликации с выходом на:
- AQ
- utl_file
- syslog
- SOAP/REST/...
- EXPPROC

но оно тоже, наверное, не подходит :)

Также не обсуждали замену триггера на OdciIndex при некоторых административных ограничениях, но это уже точно факультативно.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949507
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111предлагайте варианты без помех
без дополнительно софта
средствами хе
на узких каналах связи
для большого количества таблиц и клиентов

Это надо ждать розового единорога с Экскалибуром во лбу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949529
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
- дата изменения + перезаклад на максимально возможную/допустимую длительность транзакции.
зачем закладка если при обмене точно знаю какие транзакции висят не завершенные
- самодельная реализация триггерной репликации на технологической основе mview log - отвергнута ТС, потому что "старая" и вообще разбираться лень
я так понимаю вы имеете ввиду следующий механизм заполонять триммерами точную копию таблицы а через какой то интервал времени проталкивать таблицу по всем клиентам затем очищать таблицу
не подходит так как у кого то выходной ,нет инета, ком вырубили, и прочие проблемы. инициатива обмена идет от клиента тогда когда ему удобно

- ora_rowscn - отвергнута ТС, потому что "6 байт на строку" и вообще "full table access"
нет по причине того что надо пересоздать все таблицы которые участвуют в обмене rowdependencies.
- парсинг redolog/archivelog - ТС проигнорирована
базы noarchivelog


Не упомянули разве что развитие вариантов триггерной репликации с выходом на:
- AQ это не знаю что
- utl_file это было
- syslog это не знаю что
- SOAP/REST/... это не знаю что
- EXPPROC это не знаю что

но оно тоже, наверное, не подходит :)

Также не обсуждали замену триггера на OdciIndex при некоторых административных ограничениях, но это уже точно факультативно.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949564
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111

базы noarchivelog

не понимаю я ето

ps
клиенты кто базы или пользователи (юсеры)?
.....
stax
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949567
Фотография 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
insert into dropme_t(id, cmnt) values (1,'Row1: delayed'); -- Не коммитим запись до времени
 
1 row inserted

select * from cdc_dropme_t -- данное изменение пока видно только текущей транзакции
 
RID                CH_DT
------------------ -----------
AAAk3AAAMAAAACEAAA 01.01.4000 

select * from repsite1_dropme_t; -- На приеме пока пусто
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------

select * from repsite1_sync_log;
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
 
SQL> 

--Транзакция 2:

insert into dropme_t(id, cmnt) values (2,'Row2: immediate');
 
1 row inserted

commit; -- пропустим запись вперед.
 
Commit complete

SQL> 
 
--Транзакция 3:
exec SYNC_DROPME_T.syncronize('repsite1');
 
PL/SQL procedure successfully completed

select * from dropme_t; 
 
   ID CMNT                                                                             MOD_DATE
----- -------------------------------------------------------------------------------- --------------------
    2 Row2: immediate                                                                  21.04.2020 18:42:48

select * from repsite1_dropme_t;-- Итог репликации: запись №2, созданная в 18:42:48
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
    2 Row2: immediate                                                                  21.04.2020 18:42:48  21.04.2020 18:43:51

select * from repsite1_sync_log;
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
21.04.2020 18:43:51  success    21.04.2020 18:43:52
 
SQL> 

--Транзакция 1:
SQL> commit;
 
Commit complete

 
SQL> 

--Транзакция 3: повторим вызов

exec SYNC_DROPME_T.syncronize('repsite1');
 
PL/SQL procedure successfully completed

select * from dropme_t;
 
   ID CMNT                                                                             MOD_DATE
----- -------------------------------------------------------------------------------- --------------------
    1 Row1: delayed                                                                    21.04.2020 18:41:32
    2 Row2: immediate                                                                  21.04.2020 18:42:48

select * from repsite1_dropme_t; -- А вот и "задержавшаяся" запись доехала до реплики
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
    2 Row2: immediate                                                                  21.04.2020 18:42:48  21.04.2020 18:43:51
    1 Row1: delayed                                                                    21.04.2020 18:41:32  21.04.2020 18:45:50

select * from repsite1_sync_log;
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
21.04.2020 18:43:51  success    21.04.2020 18:43:52
21.04.2020 18:45:50  success    21.04.2020 18:45:50

SQL> select * from cdc_dropme_t; -- И что у нас в mview-логе?
 
RID                CH_DT
------------------ --------------------
AAAk3AAAMAAAACEAAA 21.04.2020 18:45:50
AAAk3AAAMAAAACFAAA 21.04.2020 18:43:51
 


--Транзакция 4 -- А вот и второй сайт приехал реплицироваться.

SQL> select * from repsite2_dropme_t;
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
 
SQL> exec SYNC_DROPME_T.syncronize('repsite2');
 
PL/SQL procedure successfully completed
 
SQL> select * from repsite2_dropme_t;
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
    1 Row1: delayed                                                                    21.04.2020 18:41:32  21.04.2020 18:48:49
    2 Row2: immediate                                                                  21.04.2020 18:42:48  21.04.2020 18:48:49
 
SQL> select * from repsite2_sync_log; -- синхронизация прошла за одну операцию
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
21.04.2020 18:48:49  success    21.04.2020 18:48:49
 
SQL> 

 и контрольный в голову: в логе без перемен. Когда отработают все нуждающиеся - можно будет почистить по ch_dt
SQL> select * from cdc_dropme_t;
 
RID                CH_DT
------------------ --------------------
AAAk3AAAMAAAACEAAA 21.04.2020 18:45:50
AAAk3AAAMAAAACFAAA 21.04.2020 18:43:51
 
SQL> 
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949581
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
зачем закладка если при обмене точно знаю какие транзакции висят не завершенные
"Проблема не в том, что человек смертен, а в том, что он - внезапно смертен."(с) МиМ
Перефразируя классика, проблема в том, что ты не знаешь, когда они завершатся.
ilyuha111
базы noarchivelog
Тут сам бог велел поэкспериментировать.
ТС, послушай анонимуса и не парь мозг.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949585
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111

далее если клиентов 100 то 1 запись в справочнике = 100 записей в логе так ?
если надо обновит 100К записей ?

правильно я все понял ?

при грамотной реализации - нет
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949593
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistпри грамотной реализации - нет

Значит существуют всего две реализации: грамотная и надёжно работающая.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949614
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

MazoHistпри грамотной реализации - нет

две реализации: грамотная и надёжно работающая.
Не порите чушь, ей больно.
Грамотная и надежно работающая реализация не требует размножения записей в логе. Она требует, в случае множественных реплик, простого publish-subscribe механизма.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949642
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
insert into dropme_t(id, cmnt) values (1,'Row1: delayed'); -- Не коммитим запись до времени
 
1 row inserted

select * from cdc_dropme_t -- данное изменение пока видно только текущей транзакции
 
RID                CH_DT
------------------ -----------
AAAk3AAAMAAAACEAAA 01.01.4000 

select * from repsite1_dropme_t; -- На приеме пока пусто
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------

select * from repsite1_sync_log;
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
 
SQL> 

--Транзакция 2:

insert into dropme_t(id, cmnt) values (2,'Row2: immediate');
 
1 row inserted

commit; -- пропустим запись вперед.
 
Commit complete

SQL> 
 
--Транзакция 3:
exec SYNC_DROPME_T.syncronize('repsite1');
 
PL/SQL procedure successfully completed

select * from dropme_t; 
 
   ID CMNT                                                                             MOD_DATE
----- -------------------------------------------------------------------------------- --------------------
    2 Row2: immediate                                                                  21.04.2020 18:42:48

select * from repsite1_dropme_t;-- Итог репликации: запись №2, созданная в 18:42:48
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
    2 Row2: immediate                                                                  21.04.2020 18:42:48  21.04.2020 18:43:51

select * from repsite1_sync_log;
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
21.04.2020 18:43:51  success    21.04.2020 18:43:52
 
SQL> 

--Транзакция 1:
SQL> commit;
 
Commit complete

 
SQL> 

--Транзакция 3: повторим вызов

exec SYNC_DROPME_T.syncronize('repsite1');
 
PL/SQL procedure successfully completed

select * from dropme_t;
 
   ID CMNT                                                                             MOD_DATE
----- -------------------------------------------------------------------------------- --------------------
    1 Row1: delayed                                                                    21.04.2020 18:41:32
    2 Row2: immediate                                                                  21.04.2020 18:42:48

select * from repsite1_dropme_t; -- А вот и "задержавшаяся" запись доехала до реплики
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
    2 Row2: immediate                                                                  21.04.2020 18:42:48  21.04.2020 18:43:51
    1 Row1: delayed                                                                    21.04.2020 18:41:32  21.04.2020 18:45:50

select * from repsite1_sync_log;
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
21.04.2020 18:43:51  success    21.04.2020 18:43:52
21.04.2020 18:45:50  success    21.04.2020 18:45:50

SQL> select * from cdc_dropme_t; -- И что у нас в mview-логе?
 
RID                CH_DT
------------------ --------------------
AAAk3AAAMAAAACEAAA 21.04.2020 18:45:50
AAAk3AAAMAAAACFAAA 21.04.2020 18:43:51
 


--Транзакция 4 -- А вот и второй сайт приехал реплицироваться.

SQL> select * from repsite2_dropme_t;
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
 
SQL> exec SYNC_DROPME_T.syncronize('repsite2');
 
PL/SQL procedure successfully completed
 
SQL> select * from repsite2_dropme_t;
 
   ID CMNT                                                                             MOD_DATE             REPL_DATE
----- -------------------------------------------------------------------------------- -------------------- --------------------
    1 Row1: delayed                                                                    21.04.2020 18:41:32  21.04.2020 18:48:49
    2 Row2: immediate                                                                  21.04.2020 18:42:48  21.04.2020 18:48:49
 
SQL> select * from repsite2_sync_log; -- синхронизация прошла за одну операцию
 
MOD_DATE             STATUS     RUN_DATE
-------------------- ---------- --------------------
21.04.2020 18:48:49  success    21.04.2020 18:48:49
 
SQL> 

 и контрольный в голову: в логе без перемен. Когда отработают все нуждающиеся - можно будет почистить по ch_dt
SQL> select * from cdc_dropme_t;
 
RID                CH_DT
------------------ --------------------
AAAk3AAAMAAAACEAAA 21.04.2020 18:45:50
AAAk3AAAMAAAACFAAA 21.04.2020 18:43:51
 
SQL> 




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
результат будет через неделю выложу тут пока бета-тетеры противоречий не нашли
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949683
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
В принципе, мне этого более чем достаточно, чтобы не завязывать на них транзакционную логику.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949727
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousОна требует, в случае множественных реплик, простого publish-subscribe механизма.

Остаётся только решить простенькую задачу отличения уже отреплицированных записей от ещё
нереплицированных для каждого подписчика отдельно. Что, внезапно, решается их размножением.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949736
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andrey_anonymousОна требует, в случае множественных реплик, простого publish-subscribe механизма.

Остаётся только решить
22120152
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949745
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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.
create table my_dml_log(
   table_name varchar2(30),
   rid        rowid
) rowdependencies;

create or replace procedure p_dml_log(table_name in varchar2, rid rowid) as
begin
   insert into my_dml_log(table_name, rid)
   values(table_name, rid);
   -- etc...
end;
/
create table test1 (a int);
create table test2 (b int);
create table test3 (c int);
create or replace trigger tr_dml_test1
  after insert or update on test1
  for each row
begin
   p_dml_log('TEST1', :new.rowid);
end;
/
create or replace trigger tr_dml_test2
  after insert or update on test2
  for each row
begin
   p_dml_log('TEST2', :new.rowid);
end;
/
create or replace trigger tr_dml_test3
  after insert or update on test3
  for each row
begin
   p_dml_log('TEST3', :new.rowid);
end;
/
begin
   insert into test1 values(1);
   commit;
   insert into test2 values(2);
   commit;
   insert into test3 values(3);
   commit;
   insert into test1 select level from dual connect by level<=10;
   commit;
   update test1 set a=-a where a>5;
   commit;
end;
/
select l.*, l.ora_rowscn from my_dml_log l;


"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, для отсечки/чистки по дате с запасом.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949746
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
до коммита
RID CH_DT
------------------ -----------
AAAk3AAAMAAAACEAAA 01.01.4000

после коммита
RID CH_DT
------------------ --------------------
AAAk3AAAMAAAACEAAA 21.04.2020 18:45:50


у меня нет решения как это реализовано
в статье это скорей всего MLOG $ _.SNAPTIME $$ но оно там просто есть а как его заполнили не написано
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949760
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.

Кроме общего устройства и назначения отдельных компонент механизма, много букв посвящено разбору вопросов эксплуатации - какие они, эти вопросы, бывают и как с ними работать.
Надо просто читать не по диагонали - текст информационно насыщенный, не маркетинговый буллшит.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949767
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Наверно не так выразился, я не понял как эмулировать это изменения средствами хе тригера вставляют
Дату начала транзакции
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949780
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111
andrey_anonymous,
Наверно не так выразился, я не понял как эмулировать это изменения средствами хе тригера вставляют
Дату начала транзакции

Блин, ну битами по байтам же написано - триггер бьет default-значение, а Refresh в фазе setup должен провести update этого атрибута с default на текущее значение (sysdate или новым значением sequence), зафиксировав, таким образом, свой "улов".
Вот так просто.
Тупо, как валенок и надежно, как автомат Калашникова.
Поскольку атрибут монотонно возрастает, то прочие операции refresh смело используют его в своем фильтре between.

...обратите, кстати, внимание на предложение xtender по ведению аналогичного лога на базе ora_rowscn - Саян, как обычно, изящен.
ora_rowscn тоже монотонно возрастает, отвечая всем требованиям к snaptime$$, и при этом update в фазе setup проводить не потребуется.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949782
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
парсинг redolog/archivelog - ТС проигнорирована
А зачем изобретать велосипеды с парсингом, если механизм Database Change Notification примерно этим и занимается (DBMS_CQ_NOTIFICATION или в прошлом DBMS_CHANGE_NOTIFICATION).
Он ипользуется мехнизм задач, чтоб отправлять изменения асинхронно, но если все джобы отключить, сделать изменения, а потом снова включить, то все изменения будут отправлены.
Код: 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.
drop table t;
drop table t_log;

create table t(id int);
create table t_log(time varchar2(5));

create or replace procedure t_callback(ntfnds in cq_notification$_descriptor) is
begin
  insert into t_log values (to_char(sysdate, 'mi:ss'));
  commit;
end;
/

declare
  reginfo  cq_notification$_reg_info;
  v_cursor sys_refcursor;
  regid    number;
begin
  reginfo := cq_notification$_reg_info('t_callback',
                                       dbms_cq_notification.qos_query, -- notification type qrcn
                                       0, -- registration persists until unregistered
                                       0, -- notify on all operations
                                       0 -- notify immediately
                                       );

  regid := dbms_cq_notification.new_reg_start(reginfo);

  open v_cursor for
    select dbms_cq_notification.cq_notification_queryid, t.* from t;
  close v_cursor;

  dbms_cq_notification.reg_end;
end;
/

alter system set job_queue_processes = 0;

-- making changes and committing

alter system set job_queue_processes = 1;

-- all changes (notifications) are logged

Вроде джобы на XE есть и notifications тоже хотя насчет последнего я не уверен. :)
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949786
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
Database Change Notification примерно этим и занимается

Я десять раз подумал бы, прежде чем поставить подобное решение на непатченную БД и заметные объемы.
Хотя это, возможно, просто моя паранойя - поделитесь практическим опытом применения, if any.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949793
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Вот так просто.

Вот теперь до меня дошло. Контрольный вопрос: вызовы syncronize() сериализованы или она может вызываться параллельно для разных реплик?
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949800
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
andrey_anonymous
Вот так просто.

Вот теперь до меня дошло. Контрольный вопрос: вызовы syncronize() сериализованы или она может вызываться параллельно для разных реплик?

Между репликами имеет смысл сериализовывать update_snaptime$$, прочие операции можно выполнять параллельно.
Если применить вместо snaptime$$ ora_rowscn - то сериализация refresh между репликами не потребуется.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949804
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Кобанчег
Database Change Notification примерно этим и занимается

Я десять раз подумал бы, прежде чем поставить подобное решение на непатченную БД и заметные объемы.
Хотя это, возможно, просто моя паранойя - поделитесь практическим опытом применения, if any.
Я может что-то упустил, но заметные объемы и Oracle XE - это взаимо противоречащие понятия.

В механизме уведомлений под капотом создается следующая задача
Код: plsql
1.
2.
3.
4.
5.
SQL> select job_action from dba_scheduler_jobs where job_name like 'AQ$_PLSQL_NTFN%';

JOB_ACTION
--------------------------------------------------------------------------------
DBMS_AQADM_SYS.REGISTER_DRIVER


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.
  PROCEDURE REGISTER_DRIVER IS
    LOOPVAR       BOOLEAN;
    DEQ_TIMEOUT   NUMBER;
  BEGIN
     LOOPVAR := TRUE;
     GET_PARAMETER_VALUE('_srvntfn_job_deq_timeout', DEQ_TIMEOUT);

     WHILE (LOOPVAR = TRUE)
     LOOP 
        DEQ_EXEJOB(LOOPVAR, DEQ_TIMEOUT);

        IF (LOOPVAR = TRUE) THEN
           CHECK_FOR_EXIT(LOOPVAR);
        ELSE
           DECR_SRVNTFN_PROC(LOOPVAR);
        END IF;

     END LOOP;

  END REGISTER_DRIVER;



Если более детально - задача создается при возникновении уведомления, после его обработки смотрит были ли другие изменения и начинает их обрабатывать если надо.
Если ничего не было - то по таймауту задание исчезает. Потом при изменениях появится новое.

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

Более того, в итоге под капотом вызываются сишные функции и этот механизм встроен в сам движок Оракла и никаких триггеров.
Если высокая интенсивность DML, то как раз это будет создавать меньше overhead чем разнообразные поделки с триггерами.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949809
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
под капотом вызываются сишные функции

Под капотом там банальный AQ.
Системные триггеры пулят в очередь, Archivelog не при делах.
Положите job_queue_process'ы - будет пухнуть Queue Table, принудительное похудание которой имеет свою специфику - на 11g не помню, но на 10g можно было влететь в нежданный блудняк.
Поднимаете job_queue_process - он начинает обрабатывать очередь (подписчик).
Как следствие, overhead по хранению там приличный, механизмы publish/subscribe похожи, хотя интерфейсы малость избыточны, да еще и не совсем понятный механизм собственно отлова событий - через регистрацию запросов - эффективность которого мне не очевидна.
Из плюсов - можно сразу подписать на события очереди с реплик.
Из минусов - специфическая эксплуатация, было несколько AQшных багов (к вопросу о непатченной XE) + возможные баги собственно нотификаций.

Если уж идти на AQ, то делать свой отлов изменений и пакетировать их по много штук в одно сообщение - снизится нагрузка на очереди как таковые.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949816
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Кобанчег
под капотом вызываются сишные функции

Под капотом там банальный AQ.
Системные триггеры пулят в очередь
С этим спору нет, изменения выгребаются из AQ_SRVNTFN_TABLE% queue_table.
andrey_anonymous
Если уж идти на AQ, то делать свой отлов изменений и пакетировать их по много штук в одно сообщение - снизится нагрузка на очереди как таковые.
Так весь цимес в том, что не надо делать свои велосипеды.
Как верно было замечено "Системные триггеры пулят" и пакетируют покомитно. В одном коммите может быть уйма изменений.
Под "механизм собственно отлова событий" и подразумевалось "под капотом вызываются сишные функции".

AQ and jobs это лишь обслуживающие механизмы, чтоб обеспечить асинхронность уведомлений и убрать всякую нагрузку на основной процесс.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949817
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кобанчег
механизм Database Change Notification
в данном конкретном случае это дикий оверкилл. Асинхронность - это здорово, но, как следствие, страдает консистентность и вообще упорядоченность. Он все-таки задуман для того, чтобы самому пулять что-то куда-то. Мы, конечно, сами используем его, но для другого - уведомление приложений среднего слоя об изменении настроек, и в целом, по опыту механизм рабочий, но не самый надежный.

Кобанчег
Если высокая интенсивность DML, то как раз это будет создавать меньше overhead чем разнообразные поделки с триггерами.
зависит от... Да и трудно будет посчитать оверхэд разнесенных процессов. Но главное, что страдает надежность.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949818
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кобанчег
AQ and jobs это лишь обслуживающие механизмы
добавление кучи прокладок убивает KISS ;)
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949820
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Есть еще такая хрень:
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
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949821
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
AQ and jobs это лишь обслуживающие механизмы, чтоб обеспечить асинхронность уведомлений и убрать всякую нагрузку на основной процесс.

Смешно, да.
Нагрузка на основной процесс в виде записи в queue table никуда не делась в сравнении с уже обсуждавшимися вариантами - только тут дополнительно требуется создать объект, затем его сериализовать, отписать сопроводиловку и лишь после этого сложить в табличку очереди.
Про обертки над обработчиком Саян, в принципе, уже написал - в рамках обсуждаемой темы это скорее зло и никакие "сишные функции" не отменят этого факта.
В конце концов, можно применить native compilation и получить те же "сишные функции" из pl/sql, которые тоже будут вызываться ядром :)
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949822
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Асинхронность - это здорово, но, как следствие, страдает консистентность и вообще упорядоченность.
Под асинхронностью в данном конкретном случае понимается что уведомления обрабатываются вне основного процесса.
Непонятно какая консистентность страдает.
Упорядоченность точно не нарушается поскольку сообщения выгребаются поочередно.
xtender
Он все-таки задуман для того, чтобы самому пулять что-то куда-то.
Не очень понял о чем речь. В callback процедуре можно как угодно обрабатывать изменения.
xtender
по опыту механизм рабочий, но не самый надежный
Интересен конкретный пример ненадежности.
Или use case потери изменения (только не от кривости callback процедуры :)).
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949824
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Смешно, да.
Лааадно, не надо так воспринимать в штыки.
CDC тоже норм механизм если его уметь готовить, я ж не отрицаю.
andrey_anonymous
В конце концов, можно применить native compilation и получить те же "сишные функции" из pl/sql, которые тоже будут вызываться ядром :)
Но-но, давайте не будем уходить в эти дебри.
Native compilation так же далеко по производительности от C как остров святой Елены от цивилизации.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949825
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кобанчег,

Чтобы без лишних слов и споров, давай ты сделаешь полный рабочий пример на нескольких таблицах, а я просто над ним побалуюсь. Например, буду в одной транзакции сразу несколько таблиц буду менять?
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949826
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Особенно интересно, что будет в твоей таблице-логе при этом.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949827
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да и вообще, траблшутинг этой штуки на порядки сложнее и муторнее всех остальных вариантов.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949828
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Особенно интересно, что будет в твоей таблице-логе при этом.
Речь про мою симпатичную табличку t_log в которую пишется mi:ss вызова callback или мы тут уже серьезными делами занимаемся и разбираем уведомление на запчасти?

Ну тогда берем пример из доки и делаем 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 OR REPLACE PROCEDURE t_callback (
  ntfnds IN CQ_NOTIFICATION$_DESCRIPTOR
)
IS
  regid           NUMBER;
  tbname          VARCHAR2(60);
  event_type      NUMBER;
  numtables       NUMBER;
  operation_type  NUMBER;
  numrows         NUMBER;
  row_id          VARCHAR2(2000);
  numqueries      NUMBER;
  qid             NUMBER;
  qop             NUMBER;

BEGIN
  regid := ntfnds.registration_id;
  event_type := ntfnds.event_type;

  INSERT INTO nfevents (regid, event_type)
  VALUES (t_callback.regid, t_callback.event_type);

  numqueries :=0;

  IF (event_type = DBMS_CQ_NOTIFICATION.EVENT_QUERYCHANGE) THEN
    numqueries := ntfnds.query_desc_array.count;

    FOR i IN 1..numqueries LOOP  -- loop over queries
      qid := ntfnds.query_desc_array(i).queryid;
      qop := ntfnds.query_desc_array(i).queryop;

      INSERT INTO nfqueries (qid, qop)
      VALUES(t_callback.qid, t_callback.qop);

      numtables := 0;
      numtables := ntfnds.query_desc_array(i).table_desc_array.count;

      FOR j IN 1..numtables LOOP  -- loop over tables
        tbname :=
          ntfnds.query_desc_array(i).table_desc_array(j).table_name;
        operation_type :=
          ntfnds.query_desc_array(i).table_desc_array(j).Opflags;

        INSERT INTO nftablechanges (qid, table_name, table_operation) 
        VALUES (
          t_callback.qid,
          tbname,
          operation_type
        );

        IF (bitand(operation_type, DBMS_CQ_NOTIFICATION.ALL_ROWS) = 0) THEN
          numrows := ntfnds.query_desc_array(i).table_desc_array(j).numrows;
        ELSE
          numrows :=0;  -- ROWID info not available
        END IF;

        -- Body of loop does not run when numrows is zero.
        FOR k IN 1..numrows LOOP  -- loop over rows
          Row_id :=
 ntfnds.query_desc_array(i).table_desc_array(j).row_desc_array(k).row_id;

          INSERT INTO nfrowchanges (qid, table_name, row_id)
          VALUES (t_callback.qid, tbname, t_callback.Row_id);

        END LOOP;  -- loop over rows
      END LOOP;  -- loop over tables
    END LOOP;  -- loop over queries
  END IF;
  COMMIT;
END;
/

+
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.
-- Create table to record notification events.
DROP TABLE nfevents;
CREATE TABLE nfevents (
  regid      NUMBER,
  event_type NUMBER
);

-- Create table to record notification queries:
DROP TABLE nfqueries;
CREATE TABLE nfqueries (
  qid NUMBER,
  qop NUMBER
);

-- Create table to record changes to registered tables:
DROP TABLE nftablechanges;
CREATE TABLE nftablechanges (
  qid             NUMBER,
  table_name      VARCHAR2(100),
  table_operation NUMBER
);

-- Create table to record ROWIDs of changed rows:
DROP TABLE nfrowchanges;
CREATE TABLE nfrowchanges (
  qid        NUMBER,
  table_name VARCHAR2(100),
  row_id     VARCHAR2(2000)
);


Потом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare
  reginfo  cq_notification$_reg_info;
  v_cursor sys_refcursor;
  regid    number;
begin
  reginfo := cq_notification$_reg_info('t_callback',
                                       dbms_cq_notification.qos_query     -- notification type qrcn
                                       + dbms_cq_notification.qos_rowids, -- include rowids of changed objects
                                       0, -- registration persists until unregistered
                                       0, -- notify on all operations
                                       0 -- notify immediately
                                       );

  regid := dbms_cq_notification.new_reg_start(reginfo);

  open v_cursor for
    select dbms_cq_notification.cq_notification_queryid, t.* from t;
  close v_cursor;

  dbms_cq_notification.reg_end;
end;
/


Хотя я не очень понял что требуется от меня, ты и сам прекрасно мог бы это скопипастить.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949829
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кобанчег,

где scn или метка изменения, по которой другие базы будут забирать изменения с...?

xtender
рабочий пример на нескольких таблицах , а я просто над ним побалуюсь. Например, буду в одной транзакции сразу несколько таблиц буду менять?
xtender
Особенно интересно, что будет в твоей таблице-логе при этом.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949832
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
что будет в твоей таблице-логе при этом.

Использовать все это счастье ради ведения таблицы-лога, серьезно?!
Я рассматривал лишь вариант доставки lcr непосредственно до целевой реплики - это хоть как-то оправдывает идею
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949833
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Так норм?
Код: plsql
1.
2.
3.
4.
5.
6.
drop table nfevents;
create table nfevents (
  regid      number,
  event_type number,
  xid        raw(8)
);


+ в callback
Код: plsql
1.
2.
  INSERT INTO nfevents (regid, event_type, xid)
  VALUES (t_callback.regid, t_callback.event_type, ntfnds.transaction_id);


За сим спешу откланяться.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949834
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
вариант доставки ... непосредственно до
Собственно в этом смысл уведомлений, но если кто любит содержательные логи тут тоже есть что предложить.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949835
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кобанчег
xtender,

Так норм?
Код: plsql
1.
ntfnds.transaction_id


.
ну приехали... Совсем не норм.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949836
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous,

Собственно, я про это и говорил, что механизм qcn не совсем для этого, но у тс как заявлено до 500 удалённых баз, которые ещё и недоступны периодически, что приводит к необходимости вытягивания измененных данных самими целевыми базами.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949905
ilyuha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Неверно.
Этот момент легко отслеживается. Вернее, в любой момент времени можно однозначно сказать, какие именно записи лога можно удалить. Делается это по-разному. В том варианте, который я показал - выборкой "минимального из максимальных" repsite%_sync_log. В более общем варианте - из каталога "подписчиков", где каждый из них и отмечает что он уже забрал, а что - еще нет.

тут есть некоторые практические проблемы
1 пока все не скачают лог чистить нельзя, но вот есть объекты на побережье которые на пол года закрываются и соответственно ничего не качают держать логи не чищеными по пол года будет грустно, поэтому была идея множить записи (1=100)

2 некоторые объекты закрываются и качать не будут и нужно вручную исключать их из подписчиков, это задача операторов, но пока их не пнешь ничего не измениться
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949919
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для случая XE, КМК, дешевле заливать каждый час/10 мин TTS со справочниками, чем парится с репликацией
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949953
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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:

  • Transportable tablespaces, including cross-platform
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949960
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilyuha111, я просил бы Вас все-таки разобраться с цитированием на форуме - очень сложно читать.

ilyuha111
тут есть некоторые практические проблемы
1 пока все не скачают лог чистить нельзя, но вот есть объекты на побережье которые на пол года закрываются и соответственно ничего не качают держать логи не чищеными по пол года будет грустно, поэтому была идея множить записи (1=100)
Странная идея.
  • Вместо того чтобы "не чистить" одну копию логов предлагается хранить N копий нечищенных логов.
  • Если объект уходит в оффлайн на полгода, то, полагаю, через такой промежуток времени дешевле его полностью пересинхронизировать (full refresh), чем догоняться инкрементами.
  • Для сайтов с нестабильной связью я предложил бы механизм агентов (представителей) этих сайтов на мастер-сайте. Агент от имени сайта-реплики согласно штатной процедуре ежедневно формирует инкремент в файле, файл высылает на email или доставляет флешку на оленях - это его, агента, зона ответственности. Главное - "долгий" лог не будет выжирать лимитированное место в БД.
ilyuha111

Это тоже можно обыграть, установив предельный срок хранения логов.
Подписчик, пытающийся синхронизироваться по истечении такого срока, получит exception на фазе setup и должен перейти к процедуре полной пересинхронизации.
Критерии подобного поведения есть в статье (самая старая запись лога должна быть старше самого свежего ключа синхронизации конкретного подписчика).
В статье также описаны процедуры принудительного отлучения подписчика от репликации и зачистки логов.
Просто надо изучить тему в подробностях - все эти вопросы уже 25+ лет как рассмотрены и так или иначе решены.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949978
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
ну приехали... Совсем не норм.
ТС желал change_id, для этих целей элементарно используется registration_id.
Все остальные свистопердлеки допиливаются будь на то необходимость.
Моей ошибкой было начать предоставлять детальный код. Если сам захочешь разобраться - разберешься.

В качестве доказательства ненадежности был предоставлен баг для версии 11.2.0.3 на солярке.
С таким же успехом я могу предоставить на несколько порядков больше багов про параллельное выполнение. И что? Ты перестанешь его использовать?
У дырявого Оракла баги есть чуть больше чем везде. Вон даже в самых базовых вещах типа внешних ключей бывает такое 10009012 .

Я думал говоря про "ненадежность" тут будет беседа экспертов про архитектурные уязвимости, а увидел только "мы этого не знаем - потому это плохо".
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39949993
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кобанчег
Если сам захочешь разобраться - разберешься.
Я еще раз говорю - я и так с ним работаю в проде, на ЕЕ... Поэтому знаю о чем говорю. Траблшутинг этой хрени крайне тяжелый.


Кобанчег
Моей ошибкой было начать предоставлять детальный код.
Давай прямо и честно, ты бы лично предпочел change notifications для данной конкретной задачи?

Кобанчег
В качестве доказательства ненадежности был предоставлен баг для версии 11.2.0.3 на солярке.
Этот "баг" до сих пор актуален, так же как и невозможность использования DBCN для таблиц с кол-вом полей >255, по той же самой причине (intra-block row chaining).

Кобанчег
Я думал говоря про "ненадежность" тут будет беседа экспертов про архитектурные уязвимости, а увидел только "мы этого не знаем - потому это плохо".
Я думал ты предоставишь код, а я предоставлю пару примеров, когда "консистентность и упорядоченность" нарушаются. Например, когда твой коллбэк для более ранней, но крупной транзакции, закончится позже более поздних, но коротких. Соответственно, более ранние изменения станут видны позже. И это только из архитектурных проблем. А попробуй порешать проблемы с ним, когда что-то где-то периодически не доходит и хрен найдешь в каком именно компоненте была проблема и почему.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39950020
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Кобанчег
Моей ошибкой было начать предоставлять детальный код.
Давай прямо и честно, ты бы лично предпочел change notifications для данной конкретной задачи?
Для 500 клиентов конечно нет.
Тут абсолютно неразумно реализовывать логику в callback proc и полагаться что у всех у них все пройдет гладко.
При таких вводных DIY с индексированным логом изменений типа показанного тобой смотрится достаточно предпочтительно.

Кстати может я пропустил, но не было сказано кто такие клиенты. По всей вероятности это не базы.
Если б их были десятки и драйвер JDBC (или .net), то можно было бы использовать другие уведомления . :)
При таком раскладе для конкретной DatabaseChangeRegistration регистрируются клиентские листенеры и получают уведомления.

xtender
Я думал ты предоставишь код, а я предоставлю пару примеров, когда "консистентность и упорядоченность" нарушаются. Например, когда твой коллбэк для более ранней, но крупной транзакции, закончится позже более поздних, но коротких. Соответственно, более ранние изменения станут видны позже.
Эта проблема не проблема. Изменения идут в очередь покомитно и выбираются поочередно.
DBMS_AQADM_SYS.REGISTER_DRIVER не приступит к обработке следуюшего изменения не закончив текущее.
На одно уведомление не может быть более чем одной запущенной задачи AQ$_PLSQL_NTFN.
Ну это все мои исследования, нигде в интернетах не попадался детыльный анализ внутренностей.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39950026
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кобанчег
ТС желал change_id, для этих целей элементарно используется registration_id.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare
   procedure p is
      pragma autonomous_transaction;
   begin
      insert into t values(-1);
      commit;
   end;
begin
   insert into t select level from dual connect by level<=1000;
   commit;
   p();
   insert into t values(2000);
   commit;
end;
/
select e.*, 
       ora_rowscn
from nfevents e
/


"REGID""EVENT_TYPE""XID""ORA_ROWSCN""301""7""08000A000F9C0000""111582628""301""7""0A0001007C340100""111582636""301""7""08000300159C0000""111582641"
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39950030
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

То я херню сказал, это же айдишник из метаданных.
Придется прибегать к тяжелой артиллерии в виде identity/sequence.
...
Рейтинг: 0 / 0
Синхронизация таблиц
    #39950032
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
ТС желал change_id, для этих целей элементарно используется registration_id.

Ни один атрибут, сформированный транзакцией, проводящей dml, использован быть не может.
Тут подойдут либо ora_rowscn централизованной таблицы-лога (nfevents), либо генерация последовательности при выборке сообщений из очереди.
Сейчас уже не помню, как именно гребутся сообщения из неприоритезированной очереди. Если иначе чем из mlog$ - то возможны инверсии.
...
Рейтинг: 0 / 0
118 сообщений из 118, показаны все 5 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]