|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov MazoHistпри грамотной реализации - нет две реализации: грамотная и надёжно работающая. Не порите чушь, ей больно. Грамотная и надежно работающая реализация не требует размножения записей в логе. Она требует, в случае множественных реплик, простого publish-subscribe механизма. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 20:17 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous ilyuha111 - самодельная реализация триггерной репликации на технологической основе mview log - отвергнута ТС, потому что "старая" и вообще разбираться лень я так понимаю вы имеете ввиду следующий механизм заполонять триммерами точную копию таблицы Я имею ввиду механизм, работающий в оракеле 25+ лет, детально описанный в статье 17-летней давности и который Вы отказались даже изучить. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139.
1 судя по всему CH_DT это дата ЗАВЕРШЕНИЕ транзакции я правильно понял ? подскажите как можно ёё получить в XE если эмулировать через триггеры 2 "и контрольный в голову: в логе без перемен. Когда отработают все нуждающиеся - можно будет почистить по ch_dt" и когда наступит этот момент никто не знает так же как ни кто не знает когда завершиться транзакция 3 скорей всего в этой процедуре SYNC_DROPME_T.syncronize('repsite1') вы используете что то вроде CH_DT >=RUN_DATE и связку лога с табличкой по ключу +- и результат этот запросы отстреливаете через бдлинк в базу клиента спасибо за разъяснение, гораздо проще чем в статье, не хватает еще команды создания лога. но я ограничен средствами ХЕ на данный момент внедряем на клиенте механизм dbms_flashback.get_system_change_number + V$TRANSACTION результат будет через неделю выложу тут пока бета-тетеры противоречий не нашли ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 20:54 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 1 судя по всему CH_DT это дата ЗАВЕРШЕНИЕ транзакции я правильно понял ? подскажите как можно ёё получить в XE если эмулировать через триггеры Нет. Это ключевой атрибут, позволяющий решить поставленную задачу и по сути не имеющий никакого отношения к каким-либо датам транзакций. Его вообще можно реализовать через sequence и назвать как-нибудь типа "bundle_id", но только когда поймете лежащую в основе гениально простую идею. Хинт: обратите внимание на начальное и конечное значение этого атрибута. Что касается XE: обратите внимание на тот факт, что в демо нет выборки из MLOG$_DROPME_T или вызовов dbms_mview. Вся демка реализована "с нуля" в предельно урезанном варианте, только показать, что "оно работает", минут за полчасика. Я к тому, что ни одной enterprise-фичи в демке не использовано. ilyuha111 2 "и контрольный в голову: в логе без перемен. Когда отработают все нуждающиеся - можно будет почистить по ch_dt" и когда наступит этот момент никто не знает так же как ни кто не знает когда завершиться транзакция Неверно. Этот момент легко отслеживается. Вернее, в любой момент времени можно однозначно сказать, какие именно записи лога можно удалить. Делается это по-разному. В том варианте, который я показал - выборкой "минимального из максимальных" repsite%_sync_log. В более общем варианте - из каталога "подписчиков", где каждый из них и отмечает что он уже забрал, а что - еще нет. ilyuha111 3 скорей всего в этой процедуре SYNC_DROPME_T.syncronize('repsite1') вы используете что то вроде CH_DT >=RUN_DATE и связку лога с табличкой по ключу +- и результат этот запросы отстреливаете через бдлинк в базу клиента Алгоритм в статье. И нет, dblink - совершенно не обязателен. Нет никаких проблем использовать этот механизм, к примеру, для выгрузки пакета изменений в файл и пересылки его электропочтой/флешкой на удаленный сайт с плохой связью. Я когда-то использовал данный подход для асинхронного уведомления тарификатор(ов) об изменениях в абонентских данных (баланс, услуги и т.п.), позже допилили до самодельного AQ (во времена 9i/10g AQ был недоступен/платной опцией). Т.е. никаких препятствий для реализации на XE нет. Что касается v$transaction. Первое, что следует знать - эти представления не гарантируют consistency, потому как не являются честными view. В принципе, мне этого более чем достаточно, чтобы не завязывать на них транзакционную логику. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 21:30 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymousОна требует, в случае множественных реплик, простого publish-subscribe механизма. Остаётся только решить простенькую задачу отличения уже отреплицированных записей от ещё нереплицированных для каждого подписчика отдельно. Что, внезапно, решается их размножением. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andrey_anonymousОна требует, в случае множественных реплик, простого publish-subscribe механизма. Остаётся только решить 22120152 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:36 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 на данный момент внедряем на клиенте механизм dbms_flashback.get_system_change_number + V$TRANSACTION andrey_anonymous, про ora_rowscn можно и упростить доступ и сделать эдакий самодельный mview log без пересоздания исходных таблиц с rowdependencies: достаточно создать отдельную таблицу лог с включенным rowdependencies и пулять туда rowid исходной таблицы. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
"TABLE_NAME""RID""ORA_ROWSCN""TEST1""AAAxFRAAMAAAAZ2AAA""111473320""TEST2""AAAxFSAAMAAAAcOAAA""111473324""TEST3""AAAxFTAAMAAAAcWAAA""111473328""TEST1""AAAxFRAAMAAAAZ2AAB""111473331""TEST1""AAAxFRAAMAAAAZ2AAC""111473331""TEST1""AAAxFRAAMAAAAZ2AAD""111473331""TEST1""AAAxFRAAMAAAAZ2AAE""111473331""TEST1""AAAxFRAAMAAAAZ2AAF""111473331""TEST1""AAAxFRAAMAAAAZ2AAG""111473331""TEST1""AAAxFRAAMAAAAZ2AAH""111473331""TEST1""AAAxFRAAMAAAAZ2AAI""111473331""TEST1""AAAxFRAAMAAAAZ2AAJ""111473331""TEST1""AAAxFRAAMAAAAZ2AAK""111473331""TEST1""AAAxFRAAMAAAAZ2AAG""111473335""TEST1""AAAxFRAAMAAAAZ2AAH""111473335""TEST1""AAAxFRAAMAAAAZ2AAI""111473335""TEST1""AAAxFRAAMAAAAZ2AAJ""111473335""TEST1""AAAxFRAAMAAAAZ2AAK""111473335" Можно добавить туда еще поле insert_time, для отсечки/чистки по дате с запасом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:54 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous, до коммита RID CH_DT ------------------ ----------- AAAk3AAAMAAAACEAAA 01.01.4000 после коммита RID CH_DT ------------------ -------------------- AAAk3AAAMAAAACEAAA 21.04.2020 18:45:50 у меня нет решения как это реализовано в статье это скорей всего MLOG $ _.SNAPTIME $$ но оно там просто есть а как его заполнили не написано ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 22:56 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 у меня нет решения как это реализовано в статье это скорей всего MLOG $ _.SNAPTIME $$ но оно там просто есть а как его заполнили не написано Really?! авторBasically the refresh operation consists of 3 phases: 1. Setup. During this phase the PL/SQL RPC dbms_snapshot.set_up is called from the snapshot site. Setup has to verify if the snapshot being refreshed is a ROWID or primary key snapshot. Then it is necessary to verify if a fast-refresh can be performed. Afterwards the snaptime$$ column is updated in the snapshot log mlog$_t1 of the altered rows to its own refresh date and time for the first snapshot that refreshes . This value does not change until the rows are eventually purged from the log. 2. Refresh Operation. 2.1 Call dbms_snapshot.verify_log and determine if a fast-refresh can take place. After dbms_snapshot.set_up is called a second check is made by calling the PL/SQL RPC dbms_snapshot.verify_log which is also called from the snapshot site to ensure that each refreshing snapshot can use the snapshot log. In order for the snapshot log to be used the timestamp of oldest/oldest_pk column in mlog$ must be older than the time of last refresh. 2.2 Delete the rows that are no longer in the master table. 2.3 Applying modifications from the master. 3. Wrap-up. The PL/SQL RPC dbms_snapshot.wrap_up called from the snapshot site checks if the least recently updated snapshot has refreshed and therefore the snapshot log entries can be purged. If the log gets purged and an error occurs after this routine the next time this snapshot refreshes, it will need to be entirely reinstantiated. Then it is checked if registration of the snapshot is required on the master. This is only the case if the snapshot id was increased/changed at some point. Кроме общего устройства и назначения отдельных компонент механизма, много букв посвящено разбору вопросов эксплуатации - какие они, эти вопросы, бывают и как с ними работать. Надо просто читать не по диагонали - текст информационно насыщенный, не маркетинговый буллшит. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 23:25 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous, Наверно не так выразился, я не понял как эмулировать это изменения средствами хе тригера вставляют Дату начала транзакции ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 23:40 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
ilyuha111 andrey_anonymous, Наверно не так выразился, я не понял как эмулировать это изменения средствами хе тригера вставляют Дату начала транзакции Блин, ну битами по байтам же написано - триггер бьет default-значение, а Refresh в фазе setup должен провести update этого атрибута с default на текущее значение (sysdate или новым значением sequence), зафиксировав, таким образом, свой "улов". Вот так просто. Тупо, как валенок и надежно, как автомат Калашникова. Поскольку атрибут монотонно возрастает, то прочие операции refresh смело используют его в своем фильтре between. ...обратите, кстати, внимание на предложение xtender по ведению аналогичного лога на базе ora_rowscn - Саян, как обычно, изящен. ora_rowscn тоже монотонно возрастает, отвечая всем требованиям к snaptime$$, и при этом update в фазе setup проводить не потребуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:02 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous парсинг redolog/archivelog - ТС проигнорирована Он ипользуется мехнизм задач, чтоб отправлять изменения асинхронно, но если все джобы отключить, сделать изменения, а потом снова включить, то все изменения будут отправлены. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Вроде джобы на XE есть и notifications тоже хотя насчет последнего я не уверен. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:04 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег Database Change Notification примерно этим и занимается Я десять раз подумал бы, прежде чем поставить подобное решение на непатченную БД и заметные объемы. Хотя это, возможно, просто моя паранойя - поделитесь практическим опытом применения, if any. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:19 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Вот так просто. Вот теперь до меня дошло. Контрольный вопрос: вызовы syncronize() сериализованы или она может вызываться параллельно для разных реплик? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:39 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andrey_anonymous Вот так просто. Вот теперь до меня дошло. Контрольный вопрос: вызовы syncronize() сериализованы или она может вызываться параллельно для разных реплик? Между репликами имеет смысл сериализовывать update_snaptime$$, прочие операции можно выполнять параллельно. Если применить вместо snaptime$$ ora_rowscn - то сериализация refresh между репликами не потребуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 00:58 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Кобанчег Database Change Notification примерно этим и занимается Я десять раз подумал бы, прежде чем поставить подобное решение на непатченную БД и заметные объемы. Хотя это, возможно, просто моя паранойя - поделитесь практическим опытом применения, if any. В механизме уведомлений под капотом создается следующая задача Код: plsql 1. 2. 3. 4. 5.
DBMS_AQADM_SYS.REGISTER_DRIVER Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Если более детально - задача создается при возникновении уведомления, после его обработки смотрит были ли другие изменения и начинает их обрабатывать если надо. Если ничего не было - то по таймауту задание исчезает. Потом при изменениях появится новое. Самое приятное здесь как уже было сказано, что если задания отлючить, а потом снова включить, то все изменения подхватятся. И даже если база в noarchivelog. (впрочем noarchivelog я не тестировал с гигабайтами изменений ибо это уже совсем какой-то абсурд) Более того, в итоге под капотом вызываются сишные функции и этот механизм встроен в сам движок Оракла и никаких триггеров. Если высокая интенсивность DML, то как раз это будет создавать меньше overhead чем разнообразные поделки с триггерами. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 01:11 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег под капотом вызываются сишные функции Под капотом там банальный AQ. Системные триггеры пулят в очередь, Archivelog не при делах. Положите job_queue_process'ы - будет пухнуть Queue Table, принудительное похудание которой имеет свою специфику - на 11g не помню, но на 10g можно было влететь в нежданный блудняк. Поднимаете job_queue_process - он начинает обрабатывать очередь (подписчик). Как следствие, overhead по хранению там приличный, механизмы publish/subscribe похожи, хотя интерфейсы малость избыточны, да еще и не совсем понятный механизм собственно отлова событий - через регистрацию запросов - эффективность которого мне не очевидна. Из плюсов - можно сразу подписать на события очереди с реплик. Из минусов - специфическая эксплуатация, было несколько AQшных багов (к вопросу о непатченной XE) + возможные баги собственно нотификаций. Если уж идти на AQ, то делать свой отлов изменений и пакетировать их по много штук в одно сообщение - снизится нагрузка на очереди как таковые. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 01:28 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Кобанчег под капотом вызываются сишные функции Под капотом там банальный AQ. Системные триггеры пулят в очередь andrey_anonymous Если уж идти на AQ, то делать свой отлов изменений и пакетировать их по много штук в одно сообщение - снизится нагрузка на очереди как таковые. Как верно было замечено "Системные триггеры пулят" и пакетируют покомитно. В одном коммите может быть уйма изменений. Под "механизм собственно отлова событий" и подразумевалось "под капотом вызываются сишные функции". AQ and jobs это лишь обслуживающие механизмы, чтоб обеспечить асинхронность уведомлений и убрать всякую нагрузку на основной процесс. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:12 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег механизм Database Change Notification Кобанчег Если высокая интенсивность DML, то как раз это будет создавать меньше overhead чем разнообразные поделки с триггерами. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:13 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег AQ and jobs это лишь обслуживающие механизмы ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:15 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Есть еще такая хрень: Bug 14765437 : DATABASE CHANGE NOTIFICATION RETURNS INCORRECT ROWID DETAILED PROBLEM DESCRIPTION : database change notification returns incorrect rowid for rows which are chained/migrated WORKAROUND INFORMATION : reorg table so that there are not changed rows. Status 84 - Closed, not feasible to fix ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:24 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег AQ and jobs это лишь обслуживающие механизмы, чтоб обеспечить асинхронность уведомлений и убрать всякую нагрузку на основной процесс. Смешно, да. Нагрузка на основной процесс в виде записи в queue table никуда не делась в сравнении с уже обсуждавшимися вариантами - только тут дополнительно требуется создать объект, затем его сериализовать, отписать сопроводиловку и лишь после этого сложить в табличку очереди. Про обертки над обработчиком Саян, в принципе, уже написал - в рамках обсуждаемой темы это скорее зло и никакие "сишные функции" не отменят этого факта. В конце концов, можно применить native compilation и получить те же "сишные функции" из pl/sql, которые тоже будут вызываться ядром :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:27 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
xtender Асинхронность - это здорово, но, как следствие, страдает консистентность и вообще упорядоченность. Непонятно какая консистентность страдает. Упорядоченность точно не нарушается поскольку сообщения выгребаются поочередно. xtender Он все-таки задуман для того, чтобы самому пулять что-то куда-то. xtender по опыту механизм рабочий, но не самый надежный Или use case потери изменения (только не от кривости callback процедуры :)). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:27 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
andrey_anonymous Смешно, да. CDC тоже норм механизм если его уметь готовить, я ж не отрицаю. andrey_anonymous В конце концов, можно применить native compilation и получить те же "сишные функции" из pl/sql, которые тоже будут вызываться ядром :) Native compilation так же далеко по производительности от C как остров святой Елены от цивилизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:38 |
|
Синхронизация таблиц
|
|||
---|---|---|---|
#18+
Кобанчег, Чтобы без лишних слов и споров, давай ты сделаешь полный рабочий пример на нескольких таблицах, а я просто над ним побалуюсь. Например, буду в одной транзакции сразу несколько таблиц буду менять? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 02:38 |
|
|
start [/forum/topic.php?fid=52&msg=39949821&tid=1881319]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 286ms |
total: | 436ms |
0 / 0 |