古い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