sql >> Databáze >  >> RDS >> Oracle

SQLcl pro přenos dat z Oracle do PostgreSQL nebo YugabyteDB 🅾🐘🚀

Staří správci databází mají příběhy o tom, že Oracle poskytuje „SQL*Loader“ bez jakéhokoli „SQL*Unloader“, protože Larry Ellison nechtěl, aby se jeho zákazníci odstěhovali. To se změnilo:existuje snadný způsob exportu do CSV pomocí jednoduchého set sqlformat csv v SQLcl. Sledujte blog Jeffa Smithe a dozvíte se o něm více.

Zde je příklad. Chtěl jsem přesunout některá ukázková data z Oracle do YugabyteDB, abych porovnal velikost. Mám vždy volnou Automonous Database, která obsahuje vzorové schéma SSB. Existuje tabulka LINEORDER, která má několik stovek GB. Získám DDL s dbms_metadata . Jedinou změnou, kterou jsem musel udělat, bylo sub(" NUMBER,"," NUMERIC,") a deaktivoval jsem omezení a klauzule řazení.

Samozřejmostí jsou profesionální nástroje pro převod schématu Oracle na PostgreSQL. Starý dobrý ora2pg nebo AWS SCT, který je také skvělý pro posouzení úrovně změn požadovaných migrací. Ale na něco rychlého mi vyhovuje awk 😉

Pak je export snadný pomocí set sqlformat csv a několik nastavení pro výstup pouze dat, jako je feedback off pagesize 0 long 999999999 verify off . To vše nasměruji do awk který vytvoří \copy příkaz, který vezme tyto CSV řádky tak, jak jsou. Rád dělám malé kroky a poté sestavuji 10000 řádků COPY příkazů s (NR-data)%10000 , data nastavena na začátku příkazu COPY. Posílat je paralelně by bylo snadné, ale možná to nebudu potřebovat, protože YugabyteDB je vícevláknový.

Zde je skript, který používám - mám svou peněženku Autonomous Database v TNS_ADMIN, SQLcl nainstalovaný v mém domě (bezplatná vrstva Oracle ARM, na které také provozuji svou laboratoř YugabyteDB).

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

Výstup může být přímo přesměrován do psql 😎

Zde je moje obrazovka při spuštění načítání:

Je to laboratoř, měření uplynulého času nedává smysl, ale podíval jsem se na rows_inserted statistiky pro ověření, že je vše distribuováno do 3 uzlů mé distribuované databáze SQL. I při jedné relaci klienta je zátěž rozložena na celý cluster.

To funguje stejně pro PostgreSQL, protože se jedná o stejné API:YugabyteDB používá PostgreSQL nad distribuovaným úložištěm.

Všechny komponenty v tomto testu jsou zdarma a snadno se používají:

  • Virtuální počítač je na bezplatné úrovni Oracle Cloud (ARM), databáze Oracle je bezplatná autonomní databáze 👉 https://www.oracle.com/cloud/free/
  • PostgreSQL je open source a zdarma 👉 https://www.postgresql.org
  • YugabyteDB je open source a zdarma 👉 https://www.yugabyte.com

  1. Umění agregace dat v SQL od jednoduchých po posuvné agregace

  2. 5 bezproblémových tipů pro použití příkazu SQL UPDATE s JOIN

  3. Rozdílné CURRENT_TIMESTAMP a SYSDATE v oracle

  4. Převeďte řetězec oddělený čárkami na pole v PL/SQL