Использование Oracle Streams для репликации (часть 3)
02.04.2009 от aryndin99Продолжение. Начало смотрите в предыдущих поста: часть 1, часть 2.
В предыдущих двух частях мы кратко рассмотрели основные термины и концепции, связанные с использованием Oracle Streams, а также выполнили настройки, необходимые для начала работы (создание необходимых пользователей, database links и т.д.).
Ну и теперь будем настраиваться непосредственно репликацию таблиц.
Для настройки репликации мы можем использовать следующие методы интерфейсы. Какой метод выбрать зависит от уровня гибкости, который необходим:
- PL/SQL API
- Упрощенное PL/SQL API (макрокоманды, начинающиеся на MAINTAIN)
- Enterprise Manager интерфейс (GUI)
| PL/SQL API | Самый гибкий способ настройки Предполагает использование пакетов: DBMS_STREAMS_ADM DBMS_APPLY_ADM DBMS_CAPTURE_ADM DBMS_RULE_ADM |
| Упрощенное PL/SQL API | Используется пакет DBMS_STREAMS_ADM Генерирует скрипт, использующий обычный PL/SQL API Сгенерированный скрипт может быть сохранен, либо сразу же исполнен Позволяет настроить репликацию одной командой Используются следующие процедуры: MAINTAIN_GLOBAL MAINTAIN_TTS MAINTAIN_SIMPLE_TTS MAINTAIN_SCHEMAS MAINTAIN_TABLES |
| EM интерфейс (GUI) | Два помощника: Oracle Streams Tablespace Replication Wizard Oracle Streams Global, Schema, Table, and Subset Replication Wizard Невозможно сконфигурировать двунаправленную репликацию Можно запускать из dbconsole или Grid Control. |
В этой части мы рассмотрим второй метод. К первому и третьему методу мы вернемся в следующих частях.
Репликация табличных пространств.
0. Давайте создадим табличное пространство (которое дальше будем реплицировать) и загрузим туда первоначальные данные.
Под пользователем SYSTEM выполним следующие команды:
[sourcecode language="sql"]
CREATE TABLESPACE repl_ts DATAFILE '/u01/app/oracle/oradata/src/repl_ts01.dbf' SIZE 20M;
CREATE USER repl_user IDENTIFIED BY oracle DEFAULT TABLESPACE repl_ts QUOTA UNLIMITED ON repl_ts;
CREATE TABLE repl_user.employees TABLESPACE repl_ts AS SELECT * FROM hr.employees WHERE employee_id<111;
ALTER TABLE repl_user.employees ADD CONSTRAINT employee_id_pk PRIMARY KEY (employee_id); [/sourcecode]
На целевой базе нужно создать пользователя repl_user:
CREATE USER repl_user IDENTIFIED BY oracle
1. На исходной базе данных – у меня это SRC войдем в EM под пользователем STRMADMIN. Перейдем на закладку Data Movement и выбираем Setup в секции Streams.
2. Для репликации целого табличного пространства выбираем помощник "Streams Tablespace Replication Wizard".
Screenshot...
3. Вводим имя администратора репликации, созданного нами во второй части и жмем Next.
Screenshot...
4. Вводим необходимую для подключения к удаленной базе данных информацию и жмем Next.
Screenshot...
5. Выбираем реплицируемое табличное пространство – REPL_TS. Создаем (или используем существующие) DIRECTORY. Главное, чтобы эти DIRECTORY указывали на разные папки. Я у себя создал в исходной базе объект DIRECTORY с именем SRC_DIR (путь я прописал /home/oracle/src), а в целевой базе - DEST_DIR (путь я прописал /home/oracle/dest). Эти каталоги должны уже существовать. Жмем NEXT
Screenshot...
6. На последней странице просматриваем изменений, которые будут сделаны и жмем FINISH. Затем жмем Submit, чтобы запланировать выполнение на текущий момент времени.
Screenshot...
7. Если возникнет ошибка
java.sql.SQLException:
ORA-20446: The owner of the job is not registered
ORA-06512: at "SYSMAN.MGMT_JOBS", line 168
ORA-06512: at "SYSMAN.MGMT_JOBS", line 86
ORA-06512: at line 1
то необходимо в sqlplus войти как SYSMAN и выполнить следующую команду
execute MGMT_USER.MAKE_EM_USER('STRMADMIN');
8. Если все прошло нормально, то можно зайти в раздел Streams в пункт Manage на странице Data Movement в dbcontrol и посмотреть, что процессы Capture и Propagate работают на исходной базе, а процесс Apply работает на стороне целевой базы.
9. Давайте протестируем работу репликации. Для этого:
- на целевой и исходной базе выполним запрос – количество строк должно быть одинаковоеselect count(*) from repl_user.employees;
COUNT(*)----------
11 - теперь на исходной базе вставим несколько новых строкINSERT INTO repl_user.employees SELECT * FROM hr.employees WHERE employee_id between 111 and 113;
commit; - через некоторое время таблицы должны синхронизироваться и выводить на двух базах опять одинаковое количество строк:
select count(*) from repl_user.employees;
COUNT(*)----------
14
Репликация отдельных таблиц.
0. Давайте создадим нового пользователя и таблицы в этом пользователе .
Под пользователем SYSTEM выполним следующие команды:
[sourcecode language="sql"]
CREATE USER repl_tab_user IDENTIFIED BY oracle DEFAULT TABLESPACE repl_ts QUOTA UNLIMITED ON repl_ts;
CREATE TABLE repl_tab_user.employees TABLESPACE repl_ts AS SELECT * FROM hr.employees WHERE employee_id<111;
ALTER TABLE repl_tab_user.employees ADD CONSTRAINT employee_id_pk PRIMARY KEY (employee_id); [/sourcecode]
На целевой базе нужно создать пользователя repl_tab_user и выдать этом пользователю привилегии на табличное пространство:
CREATE USER repl_tab_user IDENTIFIED BY oracle DEFAULT TABLESPACE repl_ts QUOTA UNLIMITED ON repl_ts;
1. На исходной базе данных – у меня это SRC войдем в EM под пользователем STRMADMIN. Перейдем на закладку Data Movement и выбираем Setup в секции Streams.
2. Для репликации отдельных таблиц выберем "Streams Global, Schema, Table and Subset Replication Wizard".
3. Вводим имя администратора репликации, созданного нами во второй части и жмем Next.
4. Вводим необходимую для подключения к удаленной базе данных информацию и жмем Next.
5. Выбираем, что хотим реплицировать таблицы (Table Rule), указываем также какие процессы будут осуществлять сбор, передачу и применение изменений в таблицах (можно оставить по-умолчанию или ввести новые – они будут созданы). Создаем (или используем существующие) DIRECTORY. Главное, чтобы эти DIRECTORY указывали на разные папки. Я у себя создал в исходной базе объект DIRECTORY с именем SRC_DIR (путь я прописал /home/oracle/src), а в целевой базе - DEST_DIR (путь я прописал /home/oracle/dest). Эти каталоги должны уже существовать. Также нужно указать будут ли реплицироваться DDL операции. Жмем NEXT
6. Выбираем таблицы, которые будем реплицировать
Screenshot...
7. На последней странице просматриваем изменений, которые будут сделаны и жмем FINISH. Затем жмем Submit, чтобы запланировать выполнение на текущий момент времени.
8. Если возникнет ошибка
java.sql.SQLException:
ORA-20446: The owner of the job is not registered
ORA-06512: at "SYSMAN.MGMT_JOBS", line 168
ORA-06512: at "SYSMAN.MGMT_JOBS", line 86
ORA-06512: at line 1
то необходимо в sqlplus войти как SYSMAN и выполнить следующую команду
execute MGMT_USER.MAKE_EM_USER('STRMADMIN');
9. Если все прошло нормально, то можно зайти в раздел Streams в пункт Manage на странице Data Movement в dbcontrol и посмотреть, что процессы Capture и Propagate работают на исходной базе, а процесс Apply работает на стороне целевой базы.
10. Давайте протестируем работу репликации. Для этого:
- на целевой и исходной базе выполним запрос – количество строк должно быть одинаковоеselect count(*) from repl_tab_user.employees;
COUNT(*)----------
11 - теперь на исходной базе вставим несколько новых строкINSERT INTO repl_tab_user.employees SELECT * FROM hr.employees WHERE employee_id between 111 and 113;
commit; - через некоторое время таблицы должны синхронизироваться и выводить на двух базах опять одинаковое количество строк:
select count(*) from repl_tab_user.employees;
COUNT(*)----------
14 - давайте теперь добавим новый столбец на исходной базе:alter table repl_tab_user.employees add MOBILE_NUMBER VARCHAR2(20);
- на целевой базе увидим появившийся столбец:desc repl_tab_user.employees Name Null? Type----------------------------------------- -------- ----------------------------EMPLOYEE_ID NOT NULL NUMBER(6)FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
MOBILE_NUMBER VARCHAR2(20)
Заключение
Итак, с помощью database control мы осуществили настройку репликацию между базами данных.
Относительно средств database control можно сказать, что они не достаточно гибки для всеобъемлющей настройки и для более тонкой настройки требуется использовать командную строку. Благо Oracle DBA этим достаточно сложно напугать.
Есть еще ряд моментов, связанных с вопросами производительности. На части из них я остановлюсь в последующих частях моего рассказа про Oracle Streams.
Нельзя также забывать о Metalink. По этой ссылке список патчей и проблем, которые они решают.
Продолжение следует…
- Вам также могут быть интересны следующие статьи:
- Использование Oracle Streams для репликации (часть 4)
- Oracle Streams для репликации: расширенная настройка (часть 7)
- Oracle Streams для репликации: расширенная настройка (часть 8)
- Использование Oracle Streams для репликации (часть 2)
- Использование Oracle Streams для репликации (часть 5)
Рубрики: Data Warehouse, Data Warehousing, Database, Streams | Комментарии (4) »

07.04.2009 в 18:24
[...] (часть 5)Использование Oracle Streams для репликации (часть 4)Использование Oracle Streams для репликации (часть 3)Использование Oracle Streams для репликации (часть 2)HTTP Internal [...]
08.04.2009 в 02:36
[...] (часть 5)Использование Oracle Streams для репликации (часть 4)Использование Oracle Streams для репликации (часть 3)Использование Oracle Streams для репликации (часть 2)HTTP Internal [...]
14.04.2009 в 23:34
[...] (часть 5)Использование Oracle Streams для репликации (часть 4)Использование Oracle Streams для репликации (часть 3)Использование Oracle Streams для репликации (часть 2)HTTP Internal [...]
19.10.2009 в 15:07
[...] Продолжение. Начало смотрите в предыдущих поста: часть 1, часть 2, часть 3. [...]