web-dev-qa-db-ja.com

OracleからMySQLに移行する

Oracleデータベースで深刻なパフォーマンスの問題が発生したため、MySQLベースのデータベース(MySQL直接、またはより好ましくはInfobright)への移行を試みます。

問題は、新しいデータベースのすべての機能がニーズに一致するかどうかを実際に知る前に、古いシステムと新しいシステムを数か月ではなく少なくとも数週間はオーバーラップさせる必要があることです。

だから、ここに私たちの状況があります:

Oracleデータベースは、数百万行ごとに複数のテーブルで構成されています。日中、文字通り何千ものステートメントがあり、移行のために停止することはできません。

毎朝、新しいデータがOracleデータベースにインポートされ、数千行が置き換えられます。このプロセスのコピーは問題ではないので、理論的には、両方のデータベースに並行してインポートできます。

しかし、ここでの課題は、これを機能させるために、1日から一貫した状態でOracleデータベースからエクスポートする必要があることです。 (月曜日にいくつかのテーブルをエクスポートできず、火曜日に他のテーブルをエクスポートできないなど)。これは、少なくともエクスポートが1日未満で完了する必要があることを意味します。

私たちの最初の考えはスキーマをダンプすることでしたが、OracleダンプファイルをMySQLにインポートするツールを見つけることができませんでした。 CSVファイルでテーブルをエクスポートすることはできますが、時間がかかりすぎると思います。

だから私の質問は今です:

私は何をすべきか? OracleダンプファイルをMySQLにインポートするツールはありますか?このような大規模な移行の経験はありますか?

PS:オラクルのパフォーマンス最適化手法を提案しないでください。私たちはすでに多くのことを試しました:-)

編集:以前にいくつかのETLツールを試しましたが、速度が不十分であることがわかりました。1つのテーブルだけをエクスポートすると、すでに4時間以上かかりました...

2番目の編集:さあ、皆さん...データベース全体をできるだけ速くエクスポートして、別のデータベースシステムにインポートできるようにデータを変換しようとする人はいませんでしたか?

24
Dan Soap

Oracleは、標準のアンロードユーティリティを提供していません。

ご使用の環境(Oracleバージョン?サーバープラットフォーム?データ量?データタイプ?)に関する包括的な情報がない場合は、ここにあるすべてがYMMVであり、パフォーマンスとタイミングのためにシステムで試してみることをお勧めします。

私のポイント1〜3は、単なる一般的なデータ移動のアイデアです。ポイント4は、ダウンタイムまたは中断を数分または数秒に減らす方法です。

1)利用可能なサードパーティのユーティリティがあります。私はこれらのいくつかを使用しましたが、意図した目的のためにそれらを自分で確認するのに最適です。いくつかのサードパーティ製品がここにリストされています: OraFaq 。残念ながら、それらの多くはWindows上で実行されるため、DBサーバーがWindows上にあり、サーバー上で直接ロードユーティリティを実行できない限り、データのアンロードプロセスが遅くなります。

2)LOBのような複雑なデータ型がない場合は、SQLPLUSを使用して独自のデータ型をロールできます。一度にテーブルを作成した場合は、簡単に並列化できます。トピックはこのサイトでおそらく2回以上訪問されています。以下に例を示します。 Linky

3)10g以上の場合、外部テーブルはこのタスクを実行するための効率的な方法である可能性があります。現在のテーブルと同じ構造の空白の外部テーブルをいくつか作成し、それらにデータをコピーすると、データは外部テーブル形式(テキストファイル)に変換されます。もう一度、OraFAQを rescue に送信します。

4)日/週/月間システムを並行して維持する必要がある場合は、変更データキャプチャ/適用ツールを使用して、ダウンタイムをほぼゼロにします。 $$$を支払う準備をしてください。私は、OracleのREDOログをマイニングし、MySQLデータベースに挿入/更新ステートメントを提供できるGolden Gate Softwareのツールを使用しました。稼働前の週にダウンタイムを発生させることなく、データの大部分を移行できます。次に、稼働期間中にソースデータベースをシャットダウンし、ゴールデンゲートに残りの最後のトランザクションを追いかけさせてから、新しいターゲットデータベースへのアクセスを開きます。私はこれをアップグレードに使用し、追いつき期間はほんの数分でした。ゴールデンゲートのサイトライセンスは既に持っていたので、ポケットに入れているものは何もありませんでした。

そして、私はここでクランキーDBAの役割を果たし、Oracleのパフォーマンスが上手くいかない場合は、MySQLが特定の問題をどのように修正したかについての記事をぜひご覧ください。 SQLを操作できないアプリケーションがある場合でも、Oracleをチューニングする方法はたくさんあります。/soapbox

6
David Mann

Oracleダンプ(.dmp)ファイルを読み取り、そのデータのテーブルをSQL Serverデータベースに送り込むことができるC#アプリケーションを構築しました。

このアプリケーションは、PeopleSoftデータベースをSQL Serverに移行するために、生産ベースで毎晩使用されます。 PeopleSoftデータベースには1100以上のデータベーステーブルがあり、Oracleダンプファイルのサイズは4.5GBを超えます。

このアプリケーションは、SQL Serverデータベースとテーブルを作成し、デュアルコアIntelサーバーで実行されている55分未満ですべての4.5GBのデータをロードします。

ADO.NETプロバイダーがあれば、このアプリケーションを変更して他のデータベースと連携させるのはそれほど難しくないと思います。

5
STLDev

ええ、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

次に、ETLテクノロジーを使用して、OracleからMySQLまたはInfobrightへの変更のデルタを取ることができます。

3
Raj More

私は、異なるデータベース間で、1億から2億5000万件のレコードの間で、大きなデータを転送するのに慣れています。たとえば、Pentaho、Talend、JavaおよびRubyを使用して3000万件のレコードを転送する場合、転送に常に5時間以上かかりました。Perlを試したところ、転送時間は20分に劇的に短縮されました。

データ転送のPerlの例外的なパフォーマンスの背後にある理由は、Perlがオブジェクト指向のプログラミング言語ではなく、すべての変数を文字列として扱うためです。 Perlは、型変換、型チェック、またはバッチレコードセットごとのオブジェクトの作成を行う必要はありません。 Perlは単なるクエリです。たとえば、1,000レコードを文字列として、データを文字列としてネットワークに沿って移動し、1,000のSQL挿入ステートメントを含むSQLステートメントで宛先データベースサーバーによって適切なデータ型に変換されます。

Pentaho、Talend、Ruby、Java過剰なデータ型チェック、型変換、OSでメモリ要求を作成するオブジェクトを作成しすぎてガベージコレクターを狂わせる、それが遅いときに始まる場所何百万ものレコードを扱っています。

私は通常、最後に取得したレコードの位置を共有する8つのCPUサーバーで8つのPerlプロセスを生成します。私はモンスターの醜いPerl ETLを手に入れました。その時点で、パフォーマンスはソースデータベースと宛先データベースにのみ依存します。 1秒あたりにクエリおよび挿入できるレコード数、

Perlは各リクエストと挿入を処理するためにCPU命令サイクルをほとんど必要とせず、Oracleからデータを非常に高速に吸い上げるため、Oracleはサービス拒否攻撃を受けていると考え、それ以上のリクエストの受け入れをシャットダウンします。次に、Oracleデータベースのプロセスとセッションの制限を増やして続行します。

私はJava開発者ですが、Perlの醜さでさえ、他の現代のプログラミング言語が競合できない場所で使用できる場合があります。話をすると、分割されたMySQLデータベースに約5億のレコードを保持している私の2つの検索エンジンにアクセスして、自由に名前を検索できます。

http://find1friend.com/
http://myhealthcare.com/
2
Kevin Duraj

Pentahoデータ統合を使用してOracleからMySqlに移行しました(同じデータをPostresqlに移行しました。これは約50%高速でしたが、これは主に、使用されているさまざまなJDBCドライバーが原因でした)。私はここで、ほぼ手紙まで、Roland Boumanの指示に従いましたが、それがいかに簡単であるかに非常にうれしく思いました。

あるDBから別のDBにテーブルデータをコピーする

データのロードに適しているかどうかはわかりませんが、試してみる価値はあります。

1
davek

同じ問題がありました。 Oracle dbmsからmysql dbmsにテーブルとデータを取得する必要があります。

私たちはオンラインで見つけたこのツールを使用しました...それはうまくいきました。

http://www.sqlines.com/download

このツールは基本的に次のことに役立ちます。

  1. ソースDBMS(Oracle)に接続する
  2. 宛先DBMS(MySQL)に接続する
  3. 移行するOracle DBMSのスキーマとテーブルを指定する
  4. 「転送」ボタンを押して移行プロセスを実行します(組み込みの移行クエリを実行します)
  5. 転送ログを取得します。これは、宛先データベースでSOURCEおよびRITTENから読み取られたレコードの数、失敗したクエリを示します。

これがこの質問に到達する他の人を助けることを願っています。

1
Ruzo Owzy

私は最近このタスクを達成するために etlalchemy をリリースしました。これは4行のPythonを使用して2つのSQLデータベース間の移行を可能にするオープンソースのソリューションであり、当初はOracleからMySQLに移行するように設計されていました。 MySQL、PostgreSQL、Oracle、SQLite、SQL Serverのサポートが追加されました。

これにより、より多くのオプションが利用可能になり、スキーマ(おそらく最も難しい)、データ、インデックス、および制約の移行が処理されます。

インストールするには:

$ pip install etlalchemy

El Capitanpip 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()

パフォーマンスに関して、このツールはmysqlimportおよびCOPY FROMpostgresql)移行を効率的に実行します。 33,105,951行の5GB SQL Serverデータベースを40分でMySQLに、3GB 7,000,000行のOracleデータベースを13分でMySQLに移行できました。

プロジェクトの起源の背景をさらに知るには、 この投稿をチェックしてください。 ツールの実行中にエラーが発生した場合は、 github repo で問題を開いてください。 1週間もかからずにパッチを適用してください!

( "cx_Oracle"をインストールするにはPythonドライバ、 これらの指示に従ってください

1
The Aelfinn

Python、SQL * Plus、およびmysql.exe(MySQLクライアント)スクリプトを使用して、クエリ結果のみのテーブル全体をコピーできます。これらのツールはすべてWindowsおよびLinuxに存在するため、移植可能になります。

私がそれをしなければならなかったとき、私はPythonを使って以下のステップを実装しました:

  1. SQL * Plusを使用してデータをCSVファイルに抽出します。
  2. Mysql.exeを使用して、ダンプファイルをMySQLにロードします。

テーブル/パーティション/サブパーティションを使用して並列ロードを実行することにより、パフォーマンスを向上させることができます。

開示: Oracle-to-MySQL-Data-Migrator は、Windows OSのOracle and MySQL間のデータ統合用に私が書いたスクリプトです。

0
Alex B