Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация баз данных Oracle 
V
    Опции темы
Dimich
Дата 4.7.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



rout.pdc - таблица, принимающая имена таблиц, над которыми произошли изменения
routd.pdc - таблица, принимающая детализацию изменений
routsrv.pdc - таблица серверов, для которых предназначена данная репликация.
routins.trg - триггер, делающий запись в routsrv, при добавлении в rout на основании servers.outflag=1
servers.pdc - список серверов, участвующих в репликации

rin.pdc - "входящие" репликации от ведущего сервера
rind.pdc - детализация входящих репликаций
rt.pdc - статус входящий репликации. Нужен для того, чтобы подтвердить выполнение репликации на ведущем сервере,
  после чего она больше не будет выгружаться на ведомый. Иначе, она должна выгружаться снова и снова, пока
  не придет это подтверждение.

repl.prc - процедура, разворачивающая входящие репликации из таблиц rin и rind в DML и записывающая статус в rt
usl.pdc - скрипт для создания рабочей таблицы (справочник услуг), которая подлежит репликации
usl_rout.trg - триггер над таблицей usl, который фиксирует все измения таблицы в служебные таблицы ROUT, ROUTD

Кроме того, выполнять процедуру REPL разрешено только одному юзеру, 'repl'
и всем пользователям, кроме 'repl' запрещено менять справочники на ведомых серверах
и рабочие таблицы с реплицируемыми данными на ведущих. Это в моем случае определяется по ID строк,
которые уникальны для каждого сервера.

Вроде, все указал. Если есть вопросы - пишите, а они точно будут. Исходников клиентской шняги, которая принимает таблицы rout/routd и загружает в rin/rind, запускает хранимую REPL, а потом выгружает rt для подтверждения выполнения репликации я героически потерял. Но, думаю воспроизвести ее труда не составит.

Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  2007_07_04_Repl.rar 5,57 Kb
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Petro123
Дата 4.7.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Здорово, только я ненашел routins.trg, и самое главное repl.prc,...

Добавлено через 6 минут и 45 секунд
а и еще, что это за servers.outflag=1
PM MAIL   Вверх
Dimich
Дата 4.7.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Код

>rar l 2007_07_04_Repl.rar

Архив 2007_07_04_Repl.rar

 Имя            Размер В архиве Сжатие  Дата  Время  Атрибуты    CRC    Мет Вер
-------------------------------------------------------------------------------
 usl.pdc           303      198  65% 04-07-07 08:27  .....A.   6F79D444 m3b 2.9
 rout.pdc          569      286  50% 04-07-07 08:26  .....A.   3A229FB7 m3b 2.9
 routd.pdc         372      227  61% 04-07-07 08:26  .....A.   51EF9A07 m3b 2.9
 routsrv.pdc       483      300  62% 04-07-07 08:25  .....A.   4D67EBEC m3b 2.9
 rin.pdc           649      300  46% 04-07-07 08:25  .....A.   8AA61C20 m3b 2.9
 rt.pdc            134      113  84% 04-07-07 08:24  .....A.   C358B48B m3b 2.9
 rind.pdc          366      226  61% 04-07-07 08:24  .....A.   7C2402E3 m3b 2.9
 USL_ROUT.trg     2815      883  31% 04-07-07 08:18  .....A.   6D00703B m3b 2.9
 Repl.prc         8186     1921  23% 04-07-07 08:15  .....A.   1990DB9E m3b 2.9
 repl.txt         1377      769  55% 04-07-07 09:18  .....A.   D43A1179 m3b 2.9
-------------------------------------------------------------------------------
   10            15254     5223  34%


А routins.trg я действительно забыл. Вот он:

Код
create or replace trigger RoutIns
  after insert on Rout
  for each row
BEGIN
  insert into routsrv (
    select servid, :new.r_id, 0 
    from servers
    where outflag = 1);
END RoutIns;

--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Sqlninja
Дата 4.7.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Цитата(LSD @  3.7.2007,  12:04 Найти цитируемый пост)
Я настраивал репликацию именно им и все работало. 

 значит версия была лучше


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Dimich
Дата 4.7.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Цитата(Petro123 @  4.7.2007,  09:21 Найти цитируемый пост)
а и еще, что это за servers.outflag=1

Имелось ввиду значение поля outflag = 1 в таблице servers. Т.е. смысл в том, что для сервера, помеченного этим флагом генерируются репликации. Просто у меня много серверов и соответственно кому-то нужно синхронизировать одну часть данных, кому-то она вообще не нужна, даже таблиц таких нет. И для постепенного включения репликаций хорошо. Или если сбой где-то произошел, то выключить и разруливать потихоньку.
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Petro123
Дата 4.7.2007, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Понятно, вкл/выкл.

Как происходит обработка входящих репликаций,  по идее она должна обрабатываться в виде очереди, Т.е. пока успешно не обработали одну репликацию не переходим к следующей. Так ли это?

Добавлено через 5 минут и 31 секунду
Вроде как получается что за раз обрабатывается весь журнал, и если есть хотя бы одна ошибка делаем откат на начало журнала, или нет?
PM MAIL   Вверх
Dimich
Дата 4.7.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Цитата(Petro123 @  4.7.2007,  09:53 Найти цитируемый пост)
Как происходит обработка входящих репликаций,  по идее она должна обрабатываться в виде очереди, Т.е. пока успешно не обработали одну репликацию не переходим к следующей. Так ли это?

Да, верно.
Данные из таблиц ROUT и ROUTD загружаются в таблицы RIN и RIND соответственно. После чего за выполнение репликаций отвечает хранимая REPL. Она то и выполняет все операции в порядке очереди. Очередь устанавливается последовательностью R_ID. Т.е. когда фиксируются репликации в таблицы (см. пример триггера над таблицей USL), R_ID будет определено последовательностью SEQR_ID. В этой же последовательности их и обработает потом хранимая REPL.
Кстати, вот она сама:
Код
create sequence SEQR_ID
minvalue  10000000000000000
maxvalue 19999999999999999
start with 10000000000097698
increment by 1
cache 20
cycle;

На других серверах, как я уже говорил, значения первичных ключей не пересекаются, т.к. там тоже будут существовать такие последовательности, но уже с другим интервалом. Например:
Код
create sequence SEQR_ID
minvalue  30000000000000000
maxvalue 39999999999999999
start with 30000196788501240
increment by 1
cache 20
cycle;

При возникновении ошибки в процедуру REPL, обработка прекращается до вмешательства человека. На начальном этапе это неизбежно будет (стадия отладки и тестирования). Теперь у меня это уже больше года работает нормально. Я и забыл, когда туда лазил. Вот сейчас пришлось вспоминать, как это работает.
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Petro123
Дата 4.7.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Цитата

Данные из таблиц ROUT и ROUTD загружаются в таблицы RIN и RIND соответственно

Как загружаются данные в таблицы Rin, Ring?
Просто очищаем RIN, затем все строки заливаем из ROUT?

Добавлено через 7 минут и 22 секунды
При такой схеме возникает некая избыточность данных. В обеих базах данные дублируются. Если реплицировать нужно справочники - проблем нет. А если таблицы в которые ежедневно добавляются сотни тысяч записей, как все это будет работать, корректно ли, быстро ли? 
PM MAIL   Вверх
Dimich
Дата 4.7.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Можно не очищать, просто дописывать.
Из RIN данные можно удалять только тогда, когда выполнятся все условия:
1. Репликация выполнена, т.е. Rin.rf = 0 (или существует запись в Rt)
2. Удаленный сервер знает, что репликация уже выполнена, иначе он должен снова ее выгрузить. Если память не изменяет, то это у мну routsrv.flag

Избыточность конечно существует, но она необходима для того, чтобы репликация обязательно достигла адресата и выполнилась, а не потерялась по дороге. Таблицы получаются достаточно большие. И хотя они у меня регулярно чистятся (удаляются уже отработанные записи), тем не менее наличие нескольких миллионов записей в RIND - нормальное явление.

Скорость, да несколько хромает. Обычно такие задачи у меня работают ночью. Синхронизируется 14 серверов с 1-м сервером. Средний поток изменений от одного сервера к другому - примерно 200,000..1,500,000 репликаций. За ночь успевает. Но бывает и больше, тогда может и к обеду следующего дня завершиться.

Насчет корректности: все работает корректно. Пока рассогласований небыло.

Имхо, мне самому не очень сейчас это нравится в плане быстродействия. Иногда хочется быстрее. Если время найду, я давно порывался это переделать, правда мысли пока еще не оформились окончательно. Может твоя критика и поможет мне.

Это сообщение отредактировал(а) Dimich - 4.7.2007, 14:36
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Petro123
Дата 4.7.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Цитата

Можно не очищать, просто дописывать.

Опять репликация?
Как ты дописываешь?

PM MAIL   Вверх
Petro123
Дата 4.7.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Цитата

rt.pdc - статус входящий репликации.

Может быть лучше в таблицу Rout, добавить поле Статус репликации, 0 - не завершена, 1 - завершена?
Как думаешь?

Или у тебя в таблицу RT добавляются только те записи, репликация по которым прошла успешно, а затем при очистке журнала репликации, удаляются только те которые есть в RT?


PM MAIL   Вверх
Dimich
Дата 5.7.2007, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Цитата(Petro123 @  4.7.2007,  15:16 Найти цитируемый пост)
Опять репликация?
Как ты дописываешь?

Не понял вопроса. Какие записи получил от удаленного сервера, те и дописываю. В таблицах есть primary key по R_ID (ID репликации), поэтому уже существующие, если такие оказались, будут отвергнуты в любом случае.
Более подробный алгоритм такой: читаю файл, делаю insert строки.
Можно к примеру SQL Loader прикрутить, если надо.

Цитата(Petro123 @  4.7.2007,  15:49 Найти цитируемый пост)
Может быть лучше в таблицу Rout, добавить поле Статус репликации, 0 - не завершена, 1 - завершена?
Как думаешь?

Или у тебя в таблицу RT добавляются только те записи, репликация по которым прошла успешно, а затем при очистке журнала репликации, удаляются только те которые есть в RT?


Можно наверное и так сделать. Почему бы и нет. Будет экономия. Я уже и вспомнить не могу, чем я руководствовался, когда делал так.

Да, кстати, вспомнил еще: когда будешь обрабатывать дробные числа и даты, имей в виду, что скорее всего дробное число будет иметь не десятичную точку, а запятую. Это я сперва по глупости решил как Replace (',', '.', value). Но гораздо лучше использовать nls_numeric_characters

Также нужно обратить внимание на формат дат. При неверной настройке они имеют свойство записываться некрасиво. Это я решил, используя в тригерах форматирование при выводе дат: to_char(date, 'dd/mm/yyyy hh:mi:ss')

Это сообщение отредактировал(а) Dimich - 5.7.2007, 06:55
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Sqlninja
Дата 5.7.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



имхо, вы все гоните. если б мои кодеры начали переписывать стандартную функциональность оракла, уволил бы всех нах.


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Dimich
Дата 5.7.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Цитата(Sqlninja @  5.7.2007,  11:41 Найти цитируемый пост)
имхо, вы все гоните. если б мои кодеры начали переписывать стандартную функциональность оракла, уволил бы всех нах. 

Гоним, не спорю.

Конечно, ввиду отсутствия русской документации по репликациям и наличия больших запасов природной лени и невежества родилось сие поделие. Но что тут поделаешь. Надо ж было с чего-то начинать и на чем то учиться? Кто же знал, что оно такое живучее окажется?


Sqlninja, а вообще реально сделать dblink с базой, с которой нет связи? Ну, чтобы, можно было данные, например на дискете туда-сюда носить? Или как тогда можно запустить репликации (сети нет т.е., интернет есть, но не стабильный, т.е. может прерываться или каждые 5 минут или же стабильно отсутствовать в течение нескольких суток. В этот период хотелось бы использовать запасной канал, например соседнюю фирму, если у них в этот момент все работает, или пригородный автобус). Какие модули и компоненты оракла за это отвечают? Может быть надо что-то доустановить или у сторонних разработчиков есть такой функционал? Мне все разжевывать не надо, просто вкратце идеи нужны, в какую сторону копать?

Заранее спасибо.
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Sqlninja
Дата 5.7.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Цитата(Dimich @  5.7.2007,  14:48 Найти цитируемый пост)
Sqlninja, а вообще реально сделать dblink с базой, с которой нет связи? Ну, чтобы, можно было данные, например на дискете туда-сюда носить?


можно делать экспорт шаблона внедрения (deployment template) на внешний носитель, и если нет связи, передавать его. мне про нет связи рассказывать не надо, у меня сеть была по всей Украине, и есть пару офисов стоящих реально в поле.



--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1391 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.