2010-03-19 3 views
21

Мы столкнулись с серьезными проблемами производительности с нашей базой данных Oracle, и мы хотели бы попытаться перенести их в базу данных на базе MySQL (либо непосредственно MySQL, либо, более предпочтительно, Infobright).Перенос из Oracle в MySQL

Дело в том, что мы должны позволить старой и новой системе пересекаться, по крайней мере, несколько недель, если не месяцев, прежде чем мы действительно узнаем, если все функции новой базы данных соответствуют нашим потребностям.

Итак, вот наша ситуация:

баз данных Oracle состоит из нескольких таблиц с каждыми миллионами строк. В течение дня есть буквально тысячи заявлений, которые мы не можем остановить для миграции.

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

Но, здесь проблема заключается в том, что для этого нам нужно иметь экспорт из базы данных Oracle с согласованным состоянием с одного дня. (Мы не можем экспортировать некоторые таблицы в понедельник и некоторые другие во вторник и т. Д.). Это означает, что по крайней мере экспорт должен быть завершен менее чем за один день.

Наша первая мысль заключалась в том, чтобы сбросить схему, но мне не удалось найти инструмент для импорта файла дампа Oracle в MySQL. Экспорт таблиц в файлы CSV может работать, но я боюсь, что это может занять слишком много времени.

Так что мой вопрос сейчас:

Что я должен делать? Есть ли какой-нибудь инструмент для импорта файлов дампа Oracle в MySQL? Есть ли у кого-нибудь опыт такой крупномасштабной миграции?

PS: Пожалуйста, не предлагают методы оптимизации производительности для Oracle, мы уже пробовали много :-)

Edit: Мы уже пробовали некоторые ETL инструменты прежде, только чтобы узнать, что они были не достаточно быстро: экспорт только одной таблицы уже занял более 4 часов ...

2nd Edit: Приходите к людям ... никто никогда не пытался как можно быстрее экспортировать всю базу данных и преобразовывать данные что его можно импортировать в другую систему баз данных?

+4

Так Oracle не может справиться с рабочей нагрузкой, так что вы переключаетесь на MySQL? Это шутка? Если его нет, я думаю, что Ларри должен знать об этом сразу, чтобы он мог остановить его. Ответ Ларри: вам нужно бросить больше денег, добавив балансировку нагрузки и т. Д. Но если серьезно, я думаю, что ваш первый приоритет будет заключаться в том, чтобы MySQL мог справиться с рабочей нагрузкой. –

+6

Я никогда не говорил, что Oracle не может справиться с этим, Oracle просто имеет свои ограничения. И, как я уже сказал, мы хотим попробовать альтернативы. Для наших задач Oracle может быть не самой подходящей системой баз данных, оптимизированная система хранилища данных может работать лучше. Мы попробовали Sand несколько лет назад и были ошеломлены приростом производительности, но это было просто слишком дорого. Infobright идет аналогичным образом (организация, ориентированная на столбцы) и намного дешевле. Мы пытаемся здесь просто сравнить эти два подхода при тех же предварительных условиях. –

+3

Если это происходит, и вы действительно мигрируете. У меня есть улучшения производительности, вы должны написать длинную запись в блоге с большим количеством подробностей. Мне хотелось бы воспроизвести это. – jva

ответ

6

Оракул не предоставляет утилиту для выгрузки из коробки.

Имейте в виду, что без исчерпывающей информации о вашей среде (оракул версии? Серверная платформа? Сколько данных? Какие типы данных?) Все здесь YMMV, и вы хотели бы дать ему возможность работать в вашей системе с точки зрения производительности и времени.

Мои пункты 1-3 представляют собой общие идеи движения данных. Пункт 4 - это метод, который уменьшит время простоя или прерывания до минут или секунд.

1) Доступны сторонние утилиты. Я использовал несколько из них, но лучше для вас, чтобы проверить их по назначению. Несколько продуктов сторонних производителей перечислены здесь: OraFaq. К сожалению, многие из них работают в Windows, что замедлит процесс выгрузки данных, если ваш сервер БД не был в Windows, и вы можете запустить утилиту загрузки непосредственно на сервере.

2) Если у вас нет сложных типов данных, таких как LOB, вы можете свернуть свой SQLPLUS. Если вы делали таблицу за раз, вы можете легко ее распараллелить. Тема была посещена на этом сайте, вероятно, более одного раза, вот пример: Linky

3) Если вы 10g +, то внешние таблицы могут быть эффективным способом выполнения этой задачи. Если вы создадите несколько пустых внешних таблиц с той же структурой, что и ваши текущие таблицы, и скопируйте данные на них, данные будут преобразованы во внешний формат таблицы (текстовый файл). Еще раз, OraFAQ - rescue.

4) Если вы должны поддерживать системы параллельно в течение дней/недель/месяцев, используйте инструмент захвата/применения данных изменения для почти нулевого времени простоя. Будьте готовы заплатить $$$. Я использовал инструмент Golden Gate Software, который может обрабатывать журналы Oracle redo и предоставлять инструкции вставки/обновления в базу данных MySQL. Вы можете перенести основную часть данных без простоя за неделю до начала концерта. Затем во время вашего «живого» периода закрывайте исходную базу данных, чтобы «Золотые ворота» догоняли последние оставшиеся транзакции, а затем открывали доступ к вашей новой целевой базе данных. Я использовал это для апгрейдов, и период догоняния составлял всего несколько минут. У нас уже были лицензии на сайты для Golden Gate, поэтому для нас это не было ничего.

И я буду играть роль Cranky DBA здесь и сказать, если вы не можете заставить Oracle работать хорошо, мне бы хотелось увидеть, как MySQL исправил ваши конкретные проблемы. Если у вас есть приложение, в котором вы не можете коснуться SQL, существует множество возможных способов настройки Oracle./soapbox

3

Да, Oracle довольно медленно. :)

Вы можете использовать любое количество инструментов ETL для перемещения данных из Oracle в MySQL. Мое избранное - службы интеграции SQL Server.

Если у вас есть Oracle9i или выше, вы можете реализовать Change Data Capture. Подробнее здесь http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10736/cdc.htm

Затем вы можете принять дельта изменений от Oracle до вашего MySQL или Infobright с использованием любых технологий ETL.

+0

Инструменты ETL, которые мы уже пробовали, были слишком медленными. Как я писал, нам нужно экспортировать полную базу данных менее чем за один день. Изменил мой вопрос, но все же спасибо за предложение! –

+0

@ Касси ответ отредактировал –

+0

Интересный подход, спасибо за ссылку. Это все еще оставляет открытым вопрос о том, как экспортировать и импортировать исходные данные ... –

1

Я использовал интеграцию данных Pentaho для миграции с Oracle на MySql (я также перенес те же данные в Postresql, что было примерно на 50% быстрее, что, я думаю, в основном было связано с использованием разных драйверов JDBC).Я следовал инструкциям Roland Боуман здесь, почти на письмо, и был очень приятно удивлен тем, насколько легко это было:

Copy Table data from one DB to another

Я не знаю, будет ли это уместно для загрузки данных, но это стоит выстрел.

5

Я создал приложение C#, которое может читать файл дампа Oracle (.dmp) и перекачивать его таблицы данных в базу данных SQL Server.

Это приложение используется в ночное время на производственной основе для переноса базы данных PeopleSoft на SQL Server. База данных PeopleSoft имеет 1100+ таблиц базы данных, а файл дампа Oracle больше 4,5 ГБ.

Это приложение создает базу данных SQL Server и таблицы, а затем загружает все данные объемом 4,5 ГБ менее чем за 55 минут на двухъядерном сервере Intel.

Я не верю, что было бы слишком сложно изменить это приложение для работы с другими базами данных, если у них есть поставщик ADO.NET.

+0

Звучит многообещающе. К сожалению, я не пытаюсь это сделать, поскольку я перешел в другую компанию, где у меня больше нет проблемы. Однако, возможно, вы могли бы опубликовать свои результаты в виде сообщения в блоге? Мне бы хотелось увидеть некоторые статистические данные. –

+0

Хорошо, что вы прокомментируете ответ на древний пост, Дэн. Очень ценю голосование. Я надеюсь, что когда-нибудь в ближайшем будущем кто-то еще сможет это увидеть и сможет его использовать. – STLDeveloper

+0

@STLDeveloper Из интереса, как вы оцениваете производительность SQL Server, сравнивается с Oracle. Я использовал оба, но никогда в базе данных, достаточно подобную, чтобы сравнивать, например, как. – ChrisProsser

2

Я использую для передачи больших данных между различными базами данных, где-то между 10-250 миллионами записей. Например, когда я использую Pentaho, Talend, Java и Ruby для передачи 30 миллионов записей, мои переводы всегда занимали более 5 часов. Когда я попробовал Perl, время передачи было значительно сокращено до 20 минут.

Причина исключительной производительности Perl для передачи данных может заключаться в том, что Perl не является объектно-ориентированным языком программирования и рассматривает все переменные как строки. Perl не требует никакого преобразования типов, проверки любого типа или создания объектов для каждого набора записей партии. Perl - это просто запрос, скажем, 1000 записей в виде строки и перемещение данных в виде строки вдоль провода, а затем преобразование в соответствующий тип данных выполняется сервером базы данных назначения в операторе SQL, в котором есть 1000 операторов вставки SQL.

Pentaho, Talend, Ruby, Java, выполняющий слишком много проверки типов данных, преобразование типов, создание слишком большого количества объектов, требующих создания памяти для ОС, и создание сборщика мусора сойти с ума, и именно здесь начинается медленность, когда я сталкиваюсь с миллионами записей.

Обычно я запускаю 8 процессов Perl на 8-процессорном сервере, который разделяет позицию последней полученной записи и там вы идете. Я получил уродливый Perl ETL MONSTER, который никто не может победить в производительности. В этом случае производительность зависит только от исходных и целевых баз данных. Сколько записей вы можете запрашивать и вставлять в секунду,

Поскольку Perl занимает очень мало циклов инструкций процессора, чтобы обрабатывать каждый запрос и вставки, а так же быстро всасывать данные из Oracle, Oracle часто думает, что находится под атакой отказа в обслуживании и он будет отключен, принимая дальнейшие запросы. Затем я должен увеличить ограничения процессов и сессий в базе данных Oracle, чтобы продолжить.

Я разработчик Java, но иногда даже уродство Perl можно использовать в тех местах, где ни один другой современный язык программирования не может конкурировать. Если вам нравится видеть некоторые из моих собственных работ о том, о чем я говорил, вы можете посетить мою вторую поисковую систему, в которой хранится почти 500 миллионов записей в базе данных MySQL, и вы можете искать свое имя.

http://find1friend.com/ 
http://myhealthcare.com/ 
0

Вы можете использовать Python, SQL * Plus и mysql.exe (клиент MySQL) Скрипт для копирования всей таблицы только результаты запроса. Он будет переносимым, потому что все эти инструменты существуют в Windows и Linux.

Когда я должен был сделать это я реализовал следующие шаги, используя Python: данные

  1. Извлечение в CSV-файл с помощью SQL * Plus.
  2. Загрузить файл дампа в MySQL с помощью mysql.exe.

Вы можете повысить производительность за счет параллельной загрузки с использованием таблиц/разделов/подразделений.

Раскрытие информации: Oracle-to-MySQL-Data-Migrator - это сценарий, который я написал для интеграции данных между Oracle and MySQL на ОС Windows.

0

Я недавно выпустил etlalchemy для выполнения этой задачи. Это решение с открытым исходным кодом, которое позволяет осуществлять миграцию между любыми двумя базами данных SQL с 4 строками Python и первоначально предназначалась для миграции из Oracle в MySQL. Добавлена ​​поддержка для MySQL, PostgreSQL, Oracle, SQLite и SQL Server.

Это позаботится о миграции схемы (возможно, самой сложной), данных, индексов и ограничений со многими другими доступными параметрами.

Для установки:

$ pip install etlalchemy 

На El Capitan: pip install --ignore-installed etlalchemy

Для запуска:

from etlalchemy import ETLAlchemySource, ETLAlchemyTarget 

orcl_db_source = ETLAlchemySource("oracle+cx_oracle://username:[email protected]/ORACLE_SID") 

mysql_db_target = ETLAlchemyTarget("mysql://username:[email protected]/db_name", drop_database=True) 
mysql_db_target.addSource(orcl_db_source) 
mysql_db_target.migrate() 

Относительно производительности, этот инструмент использует BULK инструменты импорта через различные СУБД таких как mysqlimport и КОПИРОВАТЬ ОТ (postgresql) для эффективной миграции. Я смог перенести базу данных SQL Server объемом 5 ГБ с 33,105,951 строк в MySQL за 40 минут и базу данных Oracle объемом до 3 ГБ объемом 7 000 000 для MySQL за 13 минут.

Чтобы получить дополнительные сведения о происхождении проекта, check out this post. Если у вас возникли какие-либо ошибки при запуске инструмента, откройте проблему на github repo, и я исправлю его менее чем за неделю!

(Чтобы установить драйвер «cx_Oracle» Python, follow these instructions)

+0

Привет, я пробовал с вашим скриптом, но получаю следующую ошибку. Я новичок в Python Scripting, я установил Python и создал скрипт с именем «abc.py», когда я запускаю скрипт, его показывает ошибку как «ModuleNotFoundError: Нет модуля с именем« ETLAlchemySource » – Swaraj

+0

Убедитесь, что вы используете python2.7 –

+0

Я использую Python 3.6.3. – Swaraj