powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация таблиц
25 сообщений из 118, страница 1 из 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
25 сообщений из 118, страница 1 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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