|
|
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
Есть один сервер DB1 (Oracle 10g). Есть второй сервер DB2 (MySQL 5.5). Нужно обеспечить синхронизацию части данных с DB1 на DB2. Задача более-менее стандартная, но есть несколько нюансов и стандартные решения не подходят. 1. Обычно оптимальным является линковка одного сервера к другому и прямая синхронизация данных между СУБД. Однако между DB1 и DB2 нет связи, они не видят друг друга. В принципе связь можно было бы организовать, однако я очень не хочу делать возможным доступ с DB2 на DB1. Доступ с DB1 на DB2 в принципе можно было бы разрешить на шлюзе, однако я не нашел, как можно к Oracle подключить внешний источник данных. К тому же на DB2 будут использоваться несовместимые типы данных. 2. Также частым советом является GoldenGate, но насколько я понял, он весьма платный (редакция Oracle стандартная, подписка не продлевалась). Кроме того, сервер СУБД достаточно старый (RHEL4), накатывать на него софт нежелательно. 3. Прямой связи между DB1 и DB2 нет. Однако есть сервер SRV в DMZ, с которого есть подключения к обоим серверам БД. Я предлагаю делать следующее. На сервере DB2 созданы таблицы (T1...Tn) с необходимой структурой, индексами и ссылками. В этих таблицах будет храниться копия нужной информации с DB1. Также на сервере DB2 будут созданы таблицы (M1...Mn) с таким же набором полей, но с типом MEMORY и без индексов (за исключением PK). Скрипт будет подключаться к DB1 и загружать нужную информацию локально. Затем он будет подключаться к DB2, очищать M-таблицы, массово (bulk) загружать в них ранее полученную из DB1 информацию. Затем будет выполнять SQL-запросы, синхронизирующие информацию между M-таблицами и T-таблицами. Подскажите, как максимально быстро загрузить массив данных в БД MySQL? Сформировать файл для mysqldump и использовать mysqldump? Или можно обойтись без использования временных файлов, например использовать многострочный insert? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 19:30:29 |
|
||
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
по-моему есть же стандартные средства со стороны Оракла "гугл-помощь" В состав Oracle входит компонент гетерогенный сервис. Он позволяет подключаться к любым базам данных, поддерживающим интерфейсы ODBC или OLE DB. со стороны МуSQL такого нет, только через "прослойку" самый быстрый способ загрузки в базу MySQL - load data infile с отключенными инексами и ключами По-моему проще сделать все на стороне Оракла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 19:44:48 |
|
||
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
Oracle это вещь требующая квалификации, я опасаюсь его сломать. К тому же если на сервере отсутствуют драйвера ODBC для MySQL (а на RHEL4 это более чем вероятно), их нужно будет ставить. А на такой старой системе это может быть нетривиально. Впрочем я в этом направлении почитаю, если все будет несложно и понятно, попробую так. Про infile почитаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 19:55:16 |
|
||
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
Еще такой вопрос. Допустим я буду использовать load data infile. Таблицы у меня InnoDB, в данными работает веб-сайт. Стоит ли делать синхронизацию в два этапа - загрузка "сырых" данных в memory-таблицы с последующим их переносом (insert ... on duplicate / delete) в рабочие InnoDB-таблицы? Или можно сразу делать load data infile в рабочие InnoDB-таблицы? Не будет ли во втором случае проблем с доступом к этим таблицам для веб-сайта? Раньше я сталкивался с тем, что MySQL довольно своеобразно работает с транзакциями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 20:08:03 |
|
||
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
ну сломать то его не сломаете.... сделайте дамп с Оракла (несложно) возьмите тестовую машину водрузите что-нить поновее, прокатит и ЦентОС (самое главное что Оракл с вашей версией встал) и пробуйте. Не так это сложно, только время и желание, Оракл документирован под завязку версия оракла какая у вас? если 9i то встанет на CentOS 6, это даже актуально еще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 20:08:29 |
|
||
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
Alibek B.Еще такой вопрос. Допустим я буду использовать load data infile. Таблицы у меня InnoDB, в данными работает веб-сайт. Стоит ли делать синхронизацию в два этапа - загрузка "сырых" данных в memory-таблицы с последующим их переносом (insert ... on duplicate / delete) в рабочие InnoDB-таблицы? Или можно сразу делать load data infile в рабочие InnoDB-таблицы? Не будет ли во втором случае проблем с доступом к этим таблицам для веб-сайта? Раньше я сталкивался с тем, что MySQL довольно своеобразно работает с транзакциями.там же по ссылке - For partitioned tables using storage engines that employ table locks, such as MyISAM, LOAD DATA cannot prune any partition locks. This does not apply to tables using storage engines which employ row-level locking, such as InnoDB. For more information, see Section 18.6.4, “Partitioning and Locking”. "InnoDB" использует построчную блокировку ... т.е. все будет должно быть нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 20:15:28 |
|
||
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
Alibek B.В принципе связь можно было бы организовать, однако я очень не хочу делать возможным доступ с DB2 на DB1.А и не сделаете. MySQL не умеет подключаться к другим СУБД, умеет только к MySQL. В свое время аналогичную задачу я решал так: На стороне Оракл: 1) Все нужные таблицы выгружаются в CSV-файлы (у меня были TSV). Если соответствие таблиц не точное (например, может понадобиться денормализация), то для этого пишется соответсвующий SQL-запрос. Непосредственно запись в файл можно выполнять прямо SQL*Plus-ом, но я для себя написал отдельную утилитку. Поскольку выполняются только SELECT-ы, то тут ничего не сломаете. 3) С удаленного сервера стирается флаговый файл. Если его там нет, то ошибку игнорируем. 2) Далее полученные файлы пакуются архиватором и выгружаются на удаленный сервер. 3) На удаленный сервер выгружается флаговый файл (размером 0 или 1 байт). На стороне MySQL: 1) Проверяется наличие флагового файла. Если его нет, то прекращаем работу. 2) Стираем флаговый файл. 3) Все файлы распаковываются. Если есть ошибка распаковки (архив поврежден или какого-то файла не хватает), то прекращаем работу (опционально куда-то сообщаем и/или записываем в лог). 4) Полученные CSV-файлы грузим в таблицы MySQL командой mysqlimport (это примерный аналог LOAD DATA INFILE) с перезатиранием данных в этих таблицах. На каждой из сторон все эти действия оформлены в cmd или shell-скрипт, который вызывается по крону с необходимой частотой. В частности у меня на передающей стороне выполнялось раз в сутки, на принимающей - раз в час. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 21:15:54 |
|
||
|
Односторонняя синхронизация Oracle->MySQL
|
|||
|---|---|---|---|
|
#18+
Поразмыслив я пришел в выводу, что данные с DB1 мне нужно загружать не только на DB2, но найдется еще пара информационных систем, где эти данные мне также нужно использовать. И чтобы не грузить лишний раз DB1 запросами, я подумал сделать так: 1. Нужные данные выгружаются из DB1, либо в CSV-файлы, либо скриптом загружаются в память сервера. 2. Полученные данные загружаются в БД MySQL на сервере SRV. Для ускорения используются таблицы MEMORY или MyISAM. 3. В БД MySQL на сервере SRV СУБД остальных информационных систем подключаются как прилинкованные базы данных (там как раз везде MySQL) и перенос данных осуществляется SQL-запросами. То есть с DB1 регулярные (раз в 5 минут) выгрузки я делаю только с одного сервера, а нагрузка на миграцию данных дальше ложится уже на остальные сервера. Есть ли смысл в такой схеме? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 12:01:42 |
|
||
|
|

start [/forum/topic.php?fid=47&gotonew=1&tid=1832529]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
10ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 388ms |

| 0 / 0 |
