Подтвердить что ты не робот

Перенос из Oracle в MySQL

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

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

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

В Oracle нет готовой утилиты для выгрузки.

Имейте в виду, что без исчерпывающей информации о вашей среде (оракул версии? серверная платформа, сколько данных? какие типы данных?) все здесь 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./Мыльница

Ответ 2

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

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

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

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

Ответ 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.

Ответ 4

Я использую для передачи больших данных между различными базами данных, где-то между 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/

Ответ 5

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

Скопировать данные таблицы из одной базы данных в другую

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

Ответ 6

Недавно я выпустил 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:[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 и COPY FROM (postgresql), чтобы эффективно выполнять миграции, Я смог перенести базу данных SQL Server объемом 5 ГБ с 33,105,951 строк в MySQL за 40 минут и базу данных Oracle объемом до 3 ГБ объемом 7 000 000 для MySQL за 13 минут.

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

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

http://www.sqlines.com/download

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

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

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