Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация таблиц / 25 сообщений из 118, страница 1 из 5
16.04.2020, 12:26
    #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
16.04.2020, 12:31
    #39947994
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация таблиц
ilyuha111,

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

авторесли на принимающей много ФК то не все так просто (может выстрелить в не неподходящий момент)
deferrable constraints
...
Рейтинг: 0 / 0
18.04.2020, 13:52
    #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
18.04.2020, 14:01
    #39948578
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация таблиц
ilyuha111
если я как нибудь смогу узнать sq_change_id.nextval в незакрытых транзакциях

Видимо, чукча не читатель.
Ну успехов тогда.
...
Рейтинг: 0 / 0
18.04.2020, 20:39
    #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
19.04.2020, 01:14
    #39948708
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация таблиц
ilyuha111
или не пишите вообще

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

Во-первых, не грубите, а во-вторых, спокойно перечитайте то, что вам уже дали(чего в целом уже достаточно), если же опять не поймете, то спрашивайте вежливо и конкретно, что именно не поняли.
ilyuha111
4 теперь последний законченный CHANGE_ID в таблице
какая-то крайне неудачная эмуляция ora_rowscn через превращение системы в однопользовательскую из-за блокировки строки таблицы t_change_id
...
Рейтинг: 0 / 0
19.04.2020, 09:11
    #39948726
ilyuha111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация таблиц
xtender,
да согласен идея не удачная
но других пока не нашли
...
Рейтинг: 0 / 0
20.04.2020, 21:34
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация таблиц / 25 сообщений из 118, страница 1 из 5
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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