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


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