Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQLcl zum Übertragen von Daten von Oracle nach PostgreSQL oder YugabyteDB 🅾🐘🚀

Alte DBAs haben Geschichten über Oracle, das einen „SQL*Loader“ ohne „SQL*Unloader“ anbietet, weil Larry Ellison nicht wollte, dass seine Kunden ausziehen. Dies hat sich geändert:Es gibt eine einfache Möglichkeit, mit einem einfachen set sqlformat csv in CSV zu exportieren in SQLcl. Folgen Sie dem Jeff Smith-Blog, um mehr darüber zu erfahren.

Hier ist ein Beispiel. Ich wollte einige Beispieldaten von Oracle nach YugabyteDB verschieben, um die Größe zu vergleichen. Ich habe eine immer kostenlose Automonous Database, die das SSB-Beispielschema enthält. Es gibt eine LINEORDER-Tabelle, die einige hundert GB groß ist. Ich bekomme die DDL mit dbms_metadata . Die einzige Änderung, die ich vornehmen musste, war sub(" NUMBER,"," NUMERIC,") und ich habe Einschränkungen und Vergleichsklauseln deaktiviert.

Natürlich gibt es professionelle Tools, um ein Oracle-Schema nach PostgreSQL zu konvertieren. Das gute alte ora2pg oder AWS SCT, das auch großartig ist, um das Ausmaß der Änderungen zu bewerten, die für eine Migration erforderlich sind. Aber für etwas Schnelles bin ich gut mit awk 😉

Dann ist der Export einfach mit set sqlformat csv und die wenigen Einstellungen, um nur Daten auszugeben, wie feedback off pagesize 0 long 999999999 verify off . Ich leite das alles an awk weiter die den \copy erstellt Befehl, der diese CSV-Zeilen unverändert übernimmt. Ich mache gerne kleine Schritte und baue dann 10000 Zeilen COPY-Befehle mit (NR-data)%10000 , data am Anfang des COPY-Befehls gesetzt wird. Das parallele Senden wäre einfach, aber ich brauche es möglicherweise nicht, da YugabyteDB multithreaded ist.

Hier ist das Skript, das ich verwende – ich habe meine autonome Datenbank-Wallet in TNS_ADMIN, SQLcl bei mir zu Hause installiert (ein ARM der kostenlosen Stufe von Oracle, auf dem ich auch mein YugabyteDB-Labor ausführe).

{
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 "\\."
}
'

Die Ausgabe kann direkt an psql geleitet werden 😎

Hier ist mein Bildschirm beim Starten des Ladevorgangs:

Es ist ein Labor, das Messen der verstrichenen Zeit macht keinen Sinn, aber ich habe mir rows_inserted angesehen Statistiken, um zu überprüfen, ob alles auf die 3 Knoten meiner verteilten SQL-Datenbank verteilt ist. Auch bei einer einzelnen Client-Session wird die Last auf den gesamten Cluster verteilt.

Dies funktioniert für PostgreSQL genauso, da es sich um dieselbe API handelt:YugabyteDB verwendet PostgreSQL zusätzlich zum verteilten Speicher.

Alle Komponenten in diesem Test sind kostenlos und einfach zu verwenden:

  • Die VM befindet sich auf dem Oracle Cloud Free Tier (ARM), die Oracle Database ist eine kostenlose autonome Datenbank 👉 https://www.oracle.com/cloud/free/
  • PostgreSQL ist Open Source und kostenlos 👉 https://www.postgresql.org
  • YugabyteDB ist Open Source und kostenlos 👉 https://www.yugabyte.com