Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Репликация таблиц  [new]
IGOLNI
Member

Откуда: г.Ливны Орловской обл.
Сообщений: 71
Здравствуйте. Не подскажите, как правильно реализовать задачу. Есть два различных сервера Oracle 9. В табличном пространстве каждого есть несколько таблиц полностью идентичных по структуре и содержанию. Необходимо их синхронизировать, чтобы обновления в одной - отражались в этой же таблице на другом сервере (допустимо в одностороннем направлении).
5 дек 05, 16:23    [2142152]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
Terrorist
Member

Откуда: Киев
Сообщений: 45
Вариантов несколько:
1. Триггером. Недостатки - необходимо как-то обрабатывать изменения в мастер таблице(та на которой триггер висит) во время недоступности подчиненной таблицы.
2. Сделать джоб на удаленной базе который будет делать примерно следующее
       DELETE FROM lalala;
       INSERT INTO lalala (SELECT * FROM lalala@mastersite);
       COMMIT;
   

3. Смотреть доку доку на предмет SNAPSHOTS так же они называются Materialized Views
5 дек 05, 16:52    [2142308]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
news
Member

Откуда: Тверь
Сообщений: 129
Организовать репликацию между БД, если одна для отчетов, а другая боевая то еще настроить триггеры на insert, delete
5 дек 05, 16:53    [2142314]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Репликация таблиц  [new]
topov
Member

Откуда: Одесса
Сообщений: 12
Если через JOB то можно так:

create or replace TYPE "ARRAYOFSTRINGS" AS TABLE OF VARCHAR2(4000);

create or replace PROCEDURE P_RECONS_ZOMBI (ARG_TABLE VARCHAR2, ARG_ZOMBI VARCHAR2, ARG_UNIC_COLUMN_NAME VARCHAR2 DEFAULT NULL)
AS
  v_sql varchar2(4000);
  v_columns_list varchar2(4000);
  v_columns_concat varchar2(4000);
  v_table varchar2(30);
  v_zombi varchar2(30);
  v_unic_column_name varchar2(30);
  v_unic_column_type varchar2(100);
  TYPE t_array_rowid IS TABLE OF ROWID INDEX BY PLS_INTEGER; 
  v_array_rowid t_array_rowid;
  v_arrayofstrings ARRAYOFSTRINGS;
BEGIN

  v_table := upper(trim(arg_table));
  v_zombi := upper(trim(arg_zombi));
  v_unic_column_name := upper(trim(arg_unic_column_name));

  select 
    LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (order by COLUMN_ID) as columns_list,
    LISTAGG(COLUMN_NAME, ' || ') WITHIN GROUP (order by COLUMN_ID) as columns_concal
  into v_columns_list, v_columns_concat
  from user_tab_columns
  where table_name = v_zombi;
  
-- delete rows from zombi table
  if v_unic_column_name is not null
  then
    select 
      decode(DATA_TYPE,'NUMBER','to_number(t.column_value)','t.column_value')
    into v_unic_column_type
    from user_tab_columns
    where table_name = v_zombi
      and COLUMN_NAME = v_unic_column_name;
    EXECUTE IMMEDIATE '
    select to_char(' || v_unic_column_name || ') from (
    select ' || v_columns_list || ' from ' || v_zombi || '
    minus
    select ' || v_columns_list || ' from ' || v_table || '
    )' BULK COLLECT INTO v_arrayofstrings;
    v_sql := 'declare 
      v_arrayofstrings ARRAYOFSTRINGS; 
      begin 
        select /*+ cardinality(t 1) */
          rowidtochar(z.rowid)
        bulk collect into v_arrayofstrings 
        from ' || v_zombi || ' z,
        table(cast(:1 as arrayofstrings)) t
        where ' || v_unic_column_type || ' = z.' || v_unic_column_name || ';
        :1 := v_arrayofstrings;
      end;';
    EXECUTE IMMEDIATE v_sql USING IN OUT v_arrayofstrings;
    FORALL i IN v_arrayofstrings.FIRST..v_arrayofstrings.LAST
    EXECUTE IMMEDIATE 'DELETE FROM ' || v_zombi || ' WHERE rowid = chartorowid(:1)' USING v_arrayofstrings(i);
  else
    EXECUTE IMMEDIATE 'select z.row_id from 
    (select rowid as row_id, sys.dbms_obfuscation_toolkit.MD5(input_string => ' || v_columns_concat || ') as zombi_hash from ' || v_zombi || ') z
    left join (select sys.dbms_obfuscation_toolkit.MD5(input_string => ' || v_columns_concat || ') as zombi_hash from ' || v_table || ') t
    on z.zombi_hash = t.zombi_hash
    where t.zombi_hash is null'
    BULK COLLECT INTO v_array_rowid;
    FORALL i IN v_array_rowid.FIRST..v_array_rowid.LAST
    EXECUTE IMMEDIATE 'DELETE FROM ' || v_zombi || ' WHERE rowid = :1' USING v_array_rowid(i);
  end if;

-- insert rows to zombi table
    EXECUTE IMMEDIATE '
    insert into ' || v_zombi || ' (' || v_columns_list || ')
    select ' || v_columns_list || ' from (
    select ' || v_columns_list || ' from ' || v_table || '
    minus
    select ' || v_columns_list || ' from ' || v_zombi || '
    )';
  
  commit;
  
END P_RECONS_ZOMBI;


запуск:
-- example 1
exec P_RECONS_ZOMBI('from_table','to_table','column_with_pk');

-- example 2
exec P_RECONS_ZOMBI('from_table','to_table');


Первый пример работает быстрее т.к. использует уникальное поле. Второй основывается на hash (md5 - 128)
13 сен 18, 19:23    [21674134]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1123
topov,

13 лет спустя, несомненно, автор топика будет рад получить от Вас ценный совет...
13 сен 18, 19:41    [21674145]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
mibin
Member

Откуда:
Сообщений: 32
Щукина Анна,
13 сен 18, 21:51    [21674217]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
mibin
Member

Откуда:
Сообщений: 32
Щукина Анна
topov,

13 лет спустя, несомненно, автор топика будет рад получить от Вас ценный совет...


Зато другим может помочь.
13 сен 18, 21:51    [21674219]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1123
mibin
Зато другим может помочь.
"Я Вас умоляю"(с)

Вы первый день на форуме?
Поверьте, никто тут из новичков не пользует поиск, не читает F.A.Q. и темы в ТОПах, не говоря уже о просмотре хотя бы первых 2-3-х страниц тем на форуме.
Каждый сразу задает вопрос, находясь в полнейшей уверенности, что он уникален и только у него возникла такая проблема...
Им невдомек, что эти вопросы уже по 100500 раз перетерты на просторах форума...

Это я вам говорю, как "читатель" форума с 2004 года (а с 2006 - зарегистрированный участник и, иногда, "писатель").
14 сен 18, 04:55    [21674308]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28403
topov
можно так
Гробокопатель, твоё "решение" не удовлетворяет начальным условиям:
IGOLNI
Oracle 9
14 сен 18, 07:31    [21674320]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17894
Оно никаким не удовлетворяет при использовании LOB и/или пользовательских типов
14 сен 18, 07:40    [21674322]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц  [new]
-2-
Member

Откуда:
Сообщений: 13977
topov,

Одноколоночный ключ или коллизии и ограничение по ширине строки с потерей точности. Не все типы. Поломается при изменении таблицы в другой транзакции. Ограничение по количеству строк. Ограничение по идентификаторам. dbms_obfuscation_toolkit депрекейтед.
14 сен 18, 10:33    [21674438]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить