|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Добрый день дано 2 базы база1 база2 в каждой базе есть таблица t_product поля id,name,change_id change_id это счётчик изменений если запись в таблице изменяют или добавляет change_id увенчивается на 1 1, товар 1,2 2, товар 2,3 если изменять наименование товара 1 на товара 5 то будет 1, товар 5,4 на второй базе все именные или доданные записи передаются на базу2 по схеме база 2 хранит последний номер change_id и забирает из базы 1 все записи где этот номер больше для change_id есть просто последовательно create sequence SQ_CHANGE_ID minvalue 1 maxvalue 999999999999999999 start with 994288686 increment by 1 cache 20 order; все работает достаточно стабильно но возникают ситуации когда в базе 2 не обновляются данные это происходить сели одновременно идет обмен и изменения в таблице т.е 1 доставляются пачка новых записей в таблицу 2 change_id передвигается 3 происходит запрос текущего change_id 4 запрос всех записей > последнего change_id (а их еще нет, так как не произошел коммит) 5 запрос пустой 6 записывается последний change_id в результате 1 запись теряется таких таблиц достаточно много > 100 у всех обмен настроен схожим образом есть какой вариант узнать сколько change_id находиться в открытых транзакциях или какой другой способ синхронизации ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 12:26 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, Используй commit scn, самописный журнал изменений или матвью. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 12:31 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
-2- или матвью. или mat. view log. или ogg/аналоги ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 16:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 4 запрос всех записей > последнего change_id (а их еще нет, так как не произошел коммит) Классическая иллюстрация того, почему не следует делать интеграцию данных подобным образом. Если нет возможности воспользоватся спец. инструментами типа OGG и нет желания возиться с mview log/прочей рукописью с commit_scn/ретроспективными запросами, то можно смягчить проблему, просто сделав Код: plaintext
Ессно, на "той стороне" при этом выполняется merge. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 16:25 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
У нас была похожая схема и похожие проблемы. Нужно использовать не неравенство а списки. Любой change_id сохраняется в таблицу unprocessed_ids. Когда приходит время синхронизации, то все из unprocessed_ids селектится в аналогичную по структуре таблицу processing_ids, и по этому списку забираются изменения. А потом выполняется delete from unprocessed_ids where id in (select * from processing_ids). При такой схеме не будет потеряно ни одного изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 00:26 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
MazoHist А потом выполняется delete from unprocessed_ids where id in (select * from processing_ids). При такой схеме не будет потеряно ни одного изменения. "наши руки не для скуки" (с) Откройте для тебя mat. view log. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 03:57 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
вариант который рассматриваем как основной 1 делаем табличку t_change_id с одним полем и одной записью 2 делаем функцию create or replace function f_ret_change_id return number is Result number; begin select sq_change_id.nextval into Result from dual; update t_change_id set CHANGE_ID = GREATEST(CHANGE_ID+1, Result); returning CHANGE_ID into Result; return(Result); end f_ret_change_id; 3 на все таблицы участвующие в обмене делаем триггер CREATE OR REPLACE TRIGGER TR_product_CBIU BEFORE INSERT or UPDATE ON t_product FOR EACH ROW BEGIN :NEW.CHANGE_ID :=f_ret_change_id; END; 4 теперь последний законченный CHANGE_ID в таблице возможно тут есть недостатки если одновременно происходит несколько транзакций с разным временем завершения ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 10:46 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
mat. view log не совсем понятно как это использовать на практике mat. view log используем для ускорения рефреша больших аналитических таблиц там хранятся изменения между после последнего рефреша и затираются если рефреш прошел если есть несколько таблиц обмена (некоторые большие) и есть несколько клиентов куда нужно изменения транслировать и все это нужно делать средствам которые доступны в XE11.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 10:51 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, т.е. на каждый чих будет взводиться change_id всей таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
oragraf, нет в этой таблице 1 запись с последним закомиченым CHANGE_ID ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:24 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 возможно тут есть недостатки если одновременно происходит несколько транзакций с разным временем завершения не совсем понятно как это использовать на практике все выстроятся в очередь (+ возможные деадлоки) превратите систему почти в "однопользовательскую" ps BEFORE INSERT or UPDATE удаление игнорируєте ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:48 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, еще раз: забудьте о диапазонах и максимальной границе, используйте списки и все получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 11:55 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
удаление из таблиц не делается есть поле логического удаления unprocessed_ids тут не совсем понятно как это делать на 100 клиентах у каждого клиента обмены приходят не регулярно интервал между обмена от 1-2 часа до 1-2 недели у разных клиентов по разному в некоторых табличках может накопиться до 1М записей одна строчка между обменами может изменяться несколько раз ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 13:08 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
MazoHist ilyuha111, еще раз: забудьте о диапазонах и максимальной границе, используйте списки и все получится. если на принимающей много ФК то не все так просто (может выстрелить в не неподходящий момент) в идеале писать лог и его применять (можно попыталься использовать логминер, но нужен опыт да и нюансов наверное много) зы для общего моего развития в новейших версиях GG остался платным? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 13:50 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 mat. view log ... mat. view log используем для ускорения рефреша больших аналитических таблиц ... все это нужно делать средствам которые доступны в XE11.2 Вот тут не понял - Вы "ИСПОЛЬЗУЕТЕ mview log" или "Средствами XE 11.2"? Оно относится к Advanced Replication и XE не положено. В любом случае - почитайте хотя бы http://blog.itpub.net/193161/viewspace-50262/ для общего понимания штатных механизмов и порядка их работы. На XE можно, в конце концов, просто воспроизвести требуемое поведение... без мазохизма :) ...по крайней мере, я когда-то успешно воспроизводил. Давно, не на XE и совершенно для других задач, но проверено лично. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 15:37 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Stax в новейших версиях GG остался платным? Ну как можно отказаться от монетизации Streams в наши сложные времена? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 15:38 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Stax в новейших версиях GG остался платным? Ну как можно отказаться от монетизации Streams в наши сложные времена? :) я так понял, пока за денежку spatial стал бесплатным предложили занятся GraphRDF Knowledge Graph я не совсем чесно спросил, подумал мож и GG амнистировали ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 16:14 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, тогда нужно делать полноценный журнал (копия таблицы со всеми изменениями) и механизм т.н. подписчиков, когда каждый забирает только то что ему положено. Данная схема применялась в одной крупной компании и за все время работы ни разу не дала сбоя. авторесли на принимающей много ФК то не все так просто (может выстрелить в не неподходящий момент) deferrable constraints ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2020, 17:24 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
не много по другому поставлю вопрос поле change_id заполняется с помощью последовательности sq_change_id.nextval клиент при подключении запрашивает последний номер последовательности (last_change_id) клиент хранит у себя последний номер прошлого обмена old_change_id затем выгибает строки запросом select * from t_product whete change_id between old_change_id and last_change_id после удачного обмена записывает себе last_change_id если я как нибудь смогу узнать sq_change_id.nextval в незакрытых транзакциях на момент начала обмена (no_comm_change_id) то я могу передать клиенту этот no_comm_change_id и при следующем обмене делать select * from t_product whete change_id between no_comm_change_id and last_change_id ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2020, 13:52 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 если я как нибудь смогу узнать sq_change_id.nextval в незакрытых транзакциях Видимо, чукча не читатель. Ну успехов тогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2020, 14:01 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous ilyuha111 mat. view log ... mat. view log используем для ускорения рефреша больших аналитических таблиц ... все это нужно делать средствам которые доступны в XE11.2 Вот тут не понял - Вы "ИСПОЛЬЗУЕТЕ mview log" или "Средствами XE 11.2"? Оно относится к Advanced Replication и XE не положено. В любом случае - почитайте хотя бы http://blog.itpub.net/193161/viewspace-50262/ для общего понимания штатных механизмов и порядка их работы. На XE можно, в конце концов, просто воспроизвести требуемое поведение... без мазохизма :) ...по крайней мере, я когда-то успешно воспроизводил. Давно, не на XE и совершенно для других задач, но проверено лично. далеко не все живут в мире enterprise edition . эта статья не имеет никакого отношения к теме , ни слова про синхронизацию. не понятно для чего вы прислали статью 2003 года 17 лет прошло !!! если у вас есть статья, как на практике применять синхронизацию с использованием mview log присылайте если опустить ограничение XE я не вижу оптимального решения организации синхронизации через mat. view log если клиентов для обмена более 100. или пишите по теме или не пишите вообще ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2020, 20:39 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 или не пишите вообще Так тому и быть, боритесь самостоятельно - понимание или придет позже, или не придет совсем. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2020, 01:14 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111, Во-первых, не грубите, а во-вторых, спокойно перечитайте то, что вам уже дали(чего в целом уже достаточно), если же опять не поймете, то спрашивайте вежливо и конкретно, что именно не поняли. ilyuha111 4 теперь последний законченный CHANGE_ID в таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2020, 01:50 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender, да согласен идея не удачная но других пока не нашли ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2020, 09:11 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
тестируем этот вариант создаем функцию Код: plsql 1. 2. 3. 4. 5. 6. 7.
которая заполняет CHANGE_ID через триггер Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
тут узнаем если открытые транзакции с таблицами которые участвуют в обмене Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
на стороне клиента Код: plsql 1.
храним эти транзакции чтобы перекачать позже получаем текущий change_id с мастер базы Код: plsql 1.
далее делаем запросу примерно такого вида Код: plsql 1. 2.
собственно получаем либо новые записи либо измененные завершение обмена записываем новый new_change_id в базу клиента, с ним будем начинать следующий обмен old_change_id := new_change_id второй блок обмена повторяет те же действия но только с таблицами из t_open_tran Код: plsql 1. 2.
вопрос есть ли у этого метода недостатки которые мы не заметили ? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2020, 21:34 |
|
|
start [/forum/topic.php?fid=52&msg=39947990&tid=1881319]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
231ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 307ms |
total: | 637ms |
0 / 0 |