Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

SQLcl untuk mentransfer data dari Oracle ke PostgreSQL atau YugabyteDB

DBA lama memiliki cerita tentang Oracle yang menyediakan "SQL*Loader" tanpa "SQL*Unloader" karena Larry Ellison tidak ingin pelanggannya pindah. Ini telah berubah:ada cara mudah untuk mengekspor ke CSV dengan set sqlformat csv sederhana di SQLcl. Ikuti blog Jeff Smith untuk mengetahui lebih banyak tentangnya.

Berikut adalah contoh. Saya ingin memindahkan beberapa data sampel dari Oracle ke YugabyteDB untuk membandingkan ukurannya. Saya memiliki Database Otomon yang selalu gratis, yang mencakup skema sampel SSB. Ada tabel LINEORDER yang berukuran beberapa ratus GB. Saya akan mendapatkan DDL dengan dbms_metadata . Satu-satunya perubahan yang harus saya lakukan adalah sub(" NUMBER,"," NUMERIC,") dan saya menonaktifkan batasan, dan klausa pemeriksaan.

Tentu saja, ada alat profesional untuk mengonversi skema Oracle ke PostgreSQL. Ora2pg lama yang bagus, atau AWS SCT yang juga bagus untuk menilai tingkat perubahan yang diperlukan oleh migrasi. Tapi untuk sesuatu yang cepat, saya mahir dengan awk

Kemudian ekspor mudah dengan set sqlformat csv dan beberapa pengaturan untuk hanya menampilkan data seperti feedback off pagesize 0 long 999999999 verify off . Saya menyalurkan semua itu ke awk yang membangun \copy perintah yang mengambil baris CSV ini apa adanya. Saya suka melakukan langkah-langkah kecil dan kemudian membuat 10.000 baris perintah SALIN dengan (NR-data)%10000 , data diatur di awal perintah COPY. Mengirimnya secara paralel akan mudah, tetapi saya mungkin tidak membutuhkannya karena YugabyteDB multithread.

Berikut adalah skrip yang saya gunakan - Saya memiliki dompet Database Otonom saya di TNS_ADMIN, SQLcl diinstal di rumah saya (ARM tingkat gratis Oracle tempat saya juga menjalankan lab YugabyteDB saya).

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

Output dapat langsung disalurkan ke psql

Ini layar saya saat memulai pemuatan:

Ini adalah lab, mengukur waktu yang telah berlalu tidak masuk akal, tetapi saya melihat rows_inserted statistik untuk memverifikasi bahwa semua didistribusikan ke 3 node database SQL terdistribusi saya. Bahkan dengan satu sesi klien, beban didistribusikan di semua cluster.

Ini berfungsi sama untuk PostgreSQL karena merupakan API yang sama:YugabyteDB menggunakan PostgreSQL di atas penyimpanan terdistribusi.

Semua komponen dalam pengujian ini gratis dan mudah digunakan:

  • VM menggunakan Oracle Cloud Free tier (ARM), Oracle Database adalah Autonomous Database gratis https://www.oracle.com/cloud/free/
  • PostgreSQL adalah open source dan gratis https://www.postgresql.org
  • YugabyteDB adalah open source dan gratis https://www.yugabyte.com

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perintah Spool:Jangan menampilkan pernyataan SQL ke file

  2. Bagaimana cara menggunakan Oracle ORDER BY dan ROWNUM dengan benar?

  3. cara mengganti beberapa string bersama di Oracle

  4. TNS-12505:TNS:pendengar saat ini tidak mengetahui SID yang diberikan di deskriptor koneksi

  5. Kesalahan pemicu Oracle ORA-04091