0

タスク:データベース(スキーマなし)内のすべてのデータを別のデータベース(おそらく別のタイプ)にコピーします。ソースデータベースを変更できないため、読み取り専用のバックアップです

コンテキスト:Oracleを多数のDBと統合します。現在、OracleとPostgresを統合しています。

リソース:接続文字列のみ。使用可能な最高の特権でデータベースに接続する機能があります。(ssh経由でアクセスできません。通常のバックアップを作成してssh経由でファイルをダウンロードしたり、web / ftpサーバーをコンパイルして起動したりする方法はありません。)

質問:このデータを取得するための実証済みの高速な方法はありますか?たぶん誰かがクリーンなコードを使ったオープンソースソリューションを持っていますか?

(rownumまたはrow_number()を使用して)順番にN行を選択し、ターゲットデータベースまたは中間ファイルに転送するのが遅すぎるため、ここでは「高速」という言葉が使用されています。

4

2 に答える 2

1

spring-batch のような軽量の ETL ツールは、このタスクに最適なツールかもしれません。

データチャンクのマイクロ管理は、それが書かれているものです。

jdbc カーソルの例を見てください。SELECT ステートメントと INSERT ステートメント、およびマッピングを構成するだけで、Spring-Batch がページネーションを処理します。

github で見つけることができます: https://github.com/SpringSource/spring-batch/blob/master/spring-batch-samples/src/main/resources/jobs/iosample/jdbcCursor.xml

リファレンスは http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#databaseにあります。

Spring バッチは、すでに処理されたレコード数の状態を保持し、以前にクラッシュしたプロセスを続行できるようにします。これは、たとえば、3 番目のデータベースにある「jobRepository」にカウンターを保存することによって行われます。

もちろん、これは純粋な Java ソリューションです。ネイティブ ソリューションの方が高速かもしれませんが、JDBC 接続文字列しか取得できない場合は、これを試してみてください。これは、転送するすべてのテーブルのテーブル構造を知っていることも前提としています。そうでない場合は、SquirrelSQL などの単純な JDBC ツールが役立ちます。

ごきげんよう、ゲールト。

于 2012-10-24T11:25:14.560 に答える
1

Liquibaseをご覧になることをお勧めします。私はそれをうまく使用して、スキーマとデータの両方をいくつかの環境で調整しました(SQLServerのみですが、異種のRDBMSでも機能すると確信しています)。

パフォーマンスに関しては、「テラバイトのデータ」とおっしゃっているように、少し心配です...それでも、試してみる価値はあるかもしれません。

乾杯、

于 2012-10-24T11:10:39.033 に答える