Миграция с Oracle на MySQL - PullRequest
       28

Миграция с Oracle на MySQL

23 голосов
/ 19 марта 2010

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

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

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

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

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

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

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

Итак, мой вопрос:

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

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

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

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

Ответы [ 7 ]

6 голосов
/ 25 марта 2010

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

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

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

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

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

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

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

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

5 голосов
/ 06 июня 2013

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

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

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

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

3 голосов
/ 19 марта 2010

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

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

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

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

1 голос
/ 03 августа 2016

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

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

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

$ pip install etlalchemy

На Эль-Капитане : pip install --ignore-installed etlalchemy

Для запуска:

from etlalchemy import ETLAlchemySource, ETLAlchemyTarget

orcl_db_source = ETLAlchemySource("oracle+cx_oracle://username:password@hostname/ORACLE_SID")

mysql_db_target = ETLAlchemyTarget("mysql://username:password@hostname/db_name", drop_database=True)
mysql_db_target.addSource(orcl_db_source)
mysql_db_target.migrate()

Что касается производительности , этот инструмент использует инструменты импорта BULK для различных RDBMS, таких как mysqlimport и COPY FROM ( postgresql ) для переноски Миграции эффективно. Мне удалось перенести базу данных SQL Server объемом 5 ГБ с 33 105 951 строк в MySQL за 40 минут и базу данных Oracle с объемом 3 ГБ 7 000 000 строк в MySQL за 13 минут.

Чтобы получить больше информации о происхождении проекта, прочитайте этот пост. Если вы обнаружите какие-либо ошибки при запуске инструмента, откройте вопрос о github repo и я Я исправлю это менее чем за неделю!

(Чтобы установить драйвер Python "cx_Oracle", следуйте этим инструкциям )

1 голос
/ 19 марта 2010

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

Копирование данных таблицы из одной БД в другую

Iне знаю, подойдет ли это для вашей загрузки данных, но стоит попробовать.

0 голосов
/ 29 августа 2018

У нас была такая же проблема. Необходим для получения таблиц и данных из Oracle dbms в mysql DBMS.

Мы использовали этот инструмент, который нашли в Интернете ... Он работал хорошо.

http://www.sqlines.com/download

Этот инструмент в основном поможет вам:

  1. Подключение к исходной СУБД (ORACLE)
  2. Подключение к целевой СУБД (MySQL)
  3. Укажите схему и таблицы в СУБД ORACLE, которую вы хотите перенести
  4. Нажмите кнопку «Перенос», чтобы запустить процесс миграции (запуск встроенных запросов на миграцию)
  5. Получите журнал передачи, в котором будет указано, сколько записей было ПРОЧИТАНО из SOURCE и WRITTEN в целевой базе данных, какие запросы не выполнены.

Надеюсь, это поможет другим, кто приземлится на этот вопрос.

0 голосов
/ 01 июля 2016

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

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

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

Можно повысить производительность, выполнив параллельную загрузку с помощью таблиц / разделов / подразделов.

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

...