Các DBA cũ có câu chuyện về việc Oracle cung cấp "SQL * Loader" mà không có "SQL * Unloader" nào vì Larry Ellison không muốn khách hàng của mình chuyển đi. Điều này đã thay đổi:có một cách dễ dàng để xuất sang CSV với set sqlformat csv
đơn giản trong SQLcl. Theo dõi blog của Jeff Smith để biết thêm về nó.
Đây là một ví dụ. Tôi muốn di chuyển một số dữ liệu mẫu từ Oracle sang YugabyteDB để so sánh kích thước. Tôi có một Cơ sở dữ liệu tự động luôn miễn phí, bao gồm lược đồ mẫu SSB. Có một bảng LINEORDER có dung lượng vài trăm GB. Tôi sẽ lấy DDL bằng dbms_metadata
. Thay đổi duy nhất tôi phải làm là sub(" NUMBER,"," NUMERIC,")
và tôi đã tắt các ràng buộc và mệnh đề đối chiếu.
Tất nhiên, có những công cụ chuyên nghiệp để chuyển đổi một lược đồ Oracle sang PostgreSQL. Ora2pg cũ tốt hoặc AWS SCT cũng rất tốt để đánh giá mức độ thay đổi cần thiết khi di chuyển. Nhưng đối với một cái gì đó nhanh chóng, tôi tốt với awk
😉
Sau đó, việc xuất trở nên dễ dàng với set sqlformat csv
và một số cài đặt để chỉ xuất dữ liệu như feedback off pagesize 0 long 999999999 verify off
. Tôi chuyển tất cả những điều đó đến awk
xây dựng \copy
lệnh nhận các dòng CSV này như nguyên trạng. Tôi muốn thực hiện các bước nhỏ và sau đó tạo 10000 dòng lệnh SAO CHÉP với (NR-data)%10000
, data
được đặt ở đầu lệnh COPY. Gửi chúng song song sẽ dễ dàng, nhưng tôi có thể không cần vì YugabyteDB là đa luồng.
Đây là tập lệnh mà tôi sử dụng - Tôi có ví Cơ sở dữ liệu tự động của mình trong TNS_ADMIN, SQLcl được cài đặt trong nhà của tôi (một ARM cấp miễn phí của Oracle mà tôi cũng chạy phòng thí nghiệm YugabyteDB của mình).
{
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 "\\."
}
'
Đầu ra có thể được chuyển trực tiếp đến psql
😎
Đây là màn hình của tôi khi bắt đầu tải:
Đó là một phòng thí nghiệm, đo thời gian đã trôi qua không có ý nghĩa gì, nhưng tôi đã xem xét rows_inserted
thống kê để xác minh rằng tất cả được phân phối đến 3 nút của cơ sở dữ liệu SQL phân tán của tôi. Ngay cả với một phiên khách hàng duy nhất, tải được phân phối trên tất cả các cụm.
Điều này hoạt động tương tự đối với PostgreSQL vì nó là cùng một API:YugabyteDB sử dụng PostgreSQL trên bộ nhớ phân tán.
Tất cả các thành phần trong thử nghiệm này đều miễn phí và dễ sử dụng:
- Máy ảo nằm trên tầng Oracle Cloud Free (ARM), Cơ sở dữ liệu Oracle là Cơ sở dữ liệu tự động miễn phí 👉 https://www.oracle.com/cloud/free/
- PostgreSQL là mã nguồn mở và miễn phí 👉 https://www.postgresql.org
- YugabyteDB là mã nguồn mở và miễn phí 👉 https://www.yugabyte.com