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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Да, 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.

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

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

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

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

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

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

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

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

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

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

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

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

У нас была та же проблема. Нужно получать таблицы и данные из dacms oracle в mysql dbms.

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

http://www.sqlines.com/download

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

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

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

  • ORA-01882: область часового пояса не найдена
  • Как установить Sun / Oracle Java SDK на Ubuntu?
  • Поставщик несовместим с версией клиента Oracle
  • Преобразование эпохи на сегодняшний день в sqlplus / Oracle
  • Процедура UTL_FILE.FOPEN () не принимает путь к каталогу?
  • Perl DBD :: Установка модуля Oracle
  • Обработка ExecuteScalar (), когда результаты не возвращаются
  • Как я могу развернуть приложение .NET, использующее ODAC, без установки всего компонента пользователю?
  • BEGIN - END блокирует атомные транзакции в PL / SQL
  • способы избежать глобальных временных таблиц в oracle
  • Как экспортировать результат запроса в csv в Oracle SQL Developer?
  • Давайте будем гением компьютера.