sql >> データベース >  >> RDS >> Oracle

OracleからPostgreSQLまたはYugabyteDBにデータを転送するSQLcl🅾🐘🚀

    古いDBAには、Oracleが「SQL*Unloader」なしで「SQL*Loader」を提供しているという話があります。これは、LarryEllisonが顧客の退去を望まなかったためです。これが変更されました。簡単なset sqlformat csvを使用してCSVにエクスポートする簡単な方法があります。 SQLclで。詳細については、JeffSmithのブログをフォローしてください。

    これが例です。サイズを比較するために、いくつかのサンプルデータをOracleからYugabyteDBに移動したいと思いました。私は常に無料のAutomonousDatabaseを持っています。これには、SSBサンプルスキーマが含まれています。数百GBのLINEORDERテーブルがあります。 dbms_metadataでDDLを取得します 。私がしなければならなかった唯一の変更は、sub(" NUMBER,"," NUMERIC,")でした。 制約と照合句を無効にしました。

    もちろん、OracleスキーマをPostgreSQLに変換するための専門的なツールがあります。古き良きora2pg、またはAWS SCTは、移行に必要な変更のレベルを評価するのにも最適です。しかし、簡単に言うと、私はawkが得意です。 😉

    次に、set sqlformat csvを使用して簡単にエクスポートできます。 feedback off pagesize 0 long 999999999 verify offのようなデータのみを出力するためのいくつかの設定 。私はそれをすべてawkにパイプします \copyをビルドします これらのCSV行をそのまま使用するコマンド。ちょっとした手順を実行してから、(NR-data)%10000を使用して10000行のCOPYコマンドを作成するのが好きです。 、data COPYコマンドの先頭に設定されます。それらを並行して送信するのは簡単ですが、YugabyteDBはマルチスレッドであるため、必要ない場合があります。

    これが私が使用するスクリプトです-TNS_ADMINにAutonomousDatabaseウォレットがあり、SQLclが自宅にインストールされています(YugabyteDBラボも実行しているOracleフリーティアARM)。

    {
    TNS_ADMIN=/home/opc/wallet_oci_fra ~/sqlcl/bin/sql -s demo/",,P455w0rd,,"@o21c_tp @ /dev/stdin SSB LINEORDER <<SQL
    set feedback off pagesize 0 long 999999999 verify off
    whenever sqlerror exit failure
    begin
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SEGMENT_ATTRIBUTES', false);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'STORAGE', false);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'CONSTRAINTS', false);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'REF_CONSTRAINTS', false);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'COLLATION_CLAUSE', 'NEVER');
    end;
    /
    set sqlformat default
    select dbms_metadata.get_ddl('TABLE','&2','&1') from dual ;
    set sqlformat csv
    select * from "&1"."&2" ;
    SQL
    } | awk '
    /^ *CREATE TABLE /{
     table=$0 ; sub(/^ *CREATE TABLE/,"",table)
     print "drop table if exists "table";"
     schema=table ; sub(/\"[.]\".*/,"\"",schema)
     print "create schema if not exists "schema";"
    }
    /^"/{
     data=NR-1
     print "\\copy "table" from stdin with csv header"
    }
    data<1{
     sub(" NUMBER,"," numeric,")
    }
    {print}
    data>0 && (NR-data)%1000000==0{
     print "\\."
     print "\\copy "table" from stdin with csv"
    }
    END{
     print "\\."
    }
    '
    

    出力はpsqlに直接パイプできます 😎

    ロードを開始したときの画面は次のとおりです。

    これはラボであり、経過時間を測定することは意味がありませんが、rows_insertedを調べました。 すべてが分散SQLデータベースの3つのノードに分散されていることを確認するための統計。単一のクライアントセッションでも、負荷はすべてのクラスターに分散されます。

    これは同じAPIであるため、PostgreSQLでも同じように機能します。YugabyteDBは分散ストレージ上でPostgreSQLを使用します。

    このテストのすべてのコンポーネントは無料で使いやすいです:

    • VMはOracleCloudFree tier(ARM)上にあり、OracleDatabaseは無料の自律型データベースです👉https://www.oracle.com/cloud/free/
    • PostgreSQLはオープンソースで無料です👉https://www.postgresql.org
    • YugabyteDBはオープンソースで無料です👉https://www.yugabyte.com

    1. mysqlデータベースからJSON配列を構築する方法

    2. MySQLUpdate内部結合テーブルクエリ

    3. PostgreSQLデータベースを保護する方法-10のヒント

    4. 文字列SQLサーバーから番号を削除します