पुराने डीबीए में ओरेकल के बारे में कहानियां हैं जो बिना किसी "एसक्यूएल * अनलोडर" के "एसक्यूएल * लोडर" प्रदान करते हैं क्योंकि लैरी एलिसन नहीं चाहते थे कि उनके ग्राहक बाहर निकल जाएं। यह बदल गया है:एक सरल set sqlformat csv
के साथ CSV को निर्यात करने का एक आसान तरीका है एसक्यूएलसीएल में। इसके बारे में अधिक जानने के लिए जेफ स्मिथ ब्लॉग का अनुसरण करें।
यहाँ एक उदाहरण है। मैं आकार की तुलना करने के लिए Oracle से YugabyteDB में कुछ नमूना डेटा ले जाना चाहता था। मेरे पास हमेशा एक निःशुल्क स्वायत्त डेटाबेस है, जिसमें एसएसबी नमूना स्कीमा शामिल है। एक LINEORDER तालिका है जो कुछ सौ GB है। मुझे डीडीएल मिलेगा dbms_metadata
. के साथ . मुझे केवल एक ही बदलाव करना था sub(" NUMBER,"," NUMERIC,")
और मैंने बाधाओं, और संयोजन खंडों को अक्षम कर दिया।
बेशक, Oracle स्कीमा को PostgreSQL में बदलने के लिए पेशेवर उपकरण हैं। अच्छा पुराना ora2pg, या AWS SCT जो एक प्रवासन के लिए आवश्यक परिवर्तनों के स्तर का आकलन करने के लिए भी बहुत अच्छा है। लेकिन कुछ जल्दी के लिए, मैं awk
. के साथ अच्छा हूँ
तब निर्यात आसान है set sqlformat csv
. के साथ और केवल डेटा आउटपुट करने के लिए कुछ सेटिंग्स जैसे feedback off pagesize 0 long 999999999 verify off
. मैं वह सब awk
. पर पाइप करता हूं जो \copy
. बनाता है कमांड जो इन सीएसवी लाइनों को इस रूप में लेती है। मुझे छोटे-छोटे कदम उठाना पसंद है और फिर (NR-data)%10000
के साथ 10000 लाइन COPY कमांड बनाना पसंद है , data
COPY कमांड की शुरुआत में सेट किया जा रहा है। उन्हें समानांतर में भेजना आसान होगा, लेकिन मुझे इसकी आवश्यकता नहीं हो सकती है क्योंकि युगाबाइटडीबी बहुप्रचारित है।
यहां वह स्क्रिप्ट है जिसका मैं उपयोग करता हूं - मेरे पास TNS_ADMIN में मेरा ऑटोनॉमस डेटाबेस वॉलेट है, SQLcl मेरे घर में स्थापित है (एक 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 नोड्स में वितरित किए गए हैं। एकल क्लाइंट सत्र के साथ भी, लोड सभी क्लस्टर पर वितरित किया जाता है।
यह PostgreSQL के लिए समान कार्य करता है क्योंकि यह एक ही API है:YugabyteDB वितरित संग्रहण के शीर्ष पर PostgreSQL का उपयोग करता है।
इस परीक्षण के सभी घटक मुफ़्त और उपयोग में आसान हैं:
- VM Oracle क्लाउड फ्री टियर (ARM) पर है, Oracle डेटाबेस एक मुफ़्त ऑटोनॉमस डेटाबेस है https://www.oracle.com/cloud/free/
- PostgreSQL खुला स्रोत और मुफ़्त है https://www.postgresql.org
- YugabyteDB खुला स्रोत और मुफ़्त है https://www.yugabyte.com