PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chuyển từ Oracle sang PostgreSQL - Điều bạn nên biết

Cho dù di chuyển cơ sở dữ liệu hoặc ứng dụng từ Oracle sang PostgreSQL chỉ với một loại kiến ​​thức cơ sở dữ liệu, có rất ít điều cần biết về sự khác biệt giữa hai hệ thống cơ sở dữ liệu.

PostgreSQL là cơ sở dữ liệu mã nguồn mở tiên tiến nhất thế giới. Cộng đồng PostgreSQL rất mạnh và họ đang liên tục cải tiến các tính năng PostgreSQL hiện có và cũng bổ sung thêm các tính năng mới. Theo db-engines.com, PostgreSQL là DBMS của năm 2017.

Có một số điểm không tương thích trong Oracle và PostgreSQL. Hoạt động của một số chức năng khác nhau giữa Oracle và PostgreSQL.

Tại sao nên chuyển từ Oracle sang PostgreSQL

  1. Chi phí:Như bạn có thể biết chi phí bản quyền của Oracle rất đắt và có thêm chi phí cho một số tính năng như phân vùng và tính khả dụng cao. Vì vậy, nhìn chung, nó rất đắt.
  2. Cấp phép nguồn mở linh hoạt và tính khả dụng dễ dàng từ các nhà cung cấp dịch vụ đám mây công cộng như AWS.
  3. Hưởng lợi từ các tiện ích bổ sung nguồn mở để cải thiện hiệu suất.

Kiểm tra sơ bộ

Như bạn có thể biết việc di chuyển từ Oracle sang PostgreSQL là một công việc tốn kém và mất thời gian. Điều quan trọng là phải hiểu phần nào là để di chuyển. Đừng lãng phí thời gian cho việc di chuyển các đối tượng không còn cần thiết. Ngoài ra, hãy kiểm tra xem có bất kỳ dữ liệu lịch sử nào được yêu cầu hay không. Đừng lãng phí thời gian sao chép dữ liệu mà bạn không cần, chẳng hạn như dữ liệu sao lưu và bảng tạm thời từ lần bảo trì trước.

Đánh giá di cư

Sau khi kiểm tra sơ bộ, bước đầu tiên của quá trình di chuyển là phân tích ứng dụng và đối tượng cơ sở dữ liệu, tìm ra điểm không tương thích giữa cả hai cơ sở dữ liệu và ước tính thời gian và chi phí cần thiết cho việc di chuyển.

Công cụ Ora2pg rất hữu ích cho việc đánh giá quá trình di chuyển. Nó kết nối với cơ sở dữ liệu Oracle, tự động quét và trích xuất dữ liệu, tạo báo cáo di chuyển cơ sở dữ liệu. Bạn có thể kiểm tra một báo cáo mẫu trong Ora2pg.

Những điều bạn nên biết

Hiểu sự khác biệt giữa Oracle và PostgreSQL và chuyển đổi nó bằng bất kỳ công cụ nào. Không có bất kỳ công cụ nào có thể chuyển đổi 100% cơ sở dữ liệu Oracle thành PostgreSQL, cần có một số thay đổi thủ công. Vui lòng kiểm tra bên dưới một số điểm khác biệt quan trọng mà bạn nên biết trước khi di chuyển.

Ánh xạ kiểu dữ liệu

PostgreSQL có nhiều kiểu dữ liệu phong phú. Một số chuyển đổi kiểu dữ liệu quan trọng giữa Oracle và PostgreSQL như sau.

Oracle PostgreSQL Nhận xét
VARCHAR2 (n) VARCHAR (n) Trong Oracle, ‘n’ là số byte trong khi trong PostgreSQL ‘n’ là số ký tự
CHAR (n) CHAR (n) Trong Oracle, ‘n’ là số byte trong khi trong PostgreSQL ‘n’ là số ký tự
NUMBER (n, m) SỐ (n, m) Loại NUMBER có thể được chuyển đổi thành NUMERIC nhưng nếu bạn sử dụng SMALLINT, INT và BIGINT thì hiệu suất sẽ tốt hơn.
SỐ (4) SMALLINT
SỐ (9) INT
SỐ (18) BIGINT
NUMBER (n) NUMERIC (n) NUMERIC (n), Nếu n> =19
NGÀY TIMESTAMP (0) Cả hai cơ sở dữ liệu đều có kiểu DATE nhưng kiểu DATE của Oracle trả về ngày và giờ trong khi kiểu DATE của PostgreSQL chỉ trả về ngày không có giờ.
BẢNG THỜI GIAN VỚI KHU VỰC GIỜ ĐỊA PHƯƠNG TIMESTAMPTZ Loại PostgreSQL Timestamptz (Dấu thời gian có múi giờ) khác với Dấu thời gian của Oracle với múi giờ. Nó tương đương với Dấu thời gian của Oracle với múi giờ địa phương, nhưng sự khác biệt nhỏ này có thể gây ra sự cố về hiệu suất hoặc lỗi ứng dụng.
CLOB VĂN BẢN Loại PostgreSQL TEXT có thể lưu trữ tối đa 1 GB văn bản.
BLOB
RAW (n)
BYTEA (giới hạn 1 GB)
Đối tượng lớn
Trong Oracle, kiểu dữ liệu BLOB lưu trữ dữ liệu nhị phân không có cấu trúc trong cơ sở dữ liệu. Loại BLOB có thể lưu trữ lên đến 128 terabyte dữ liệu nhị phân. PostgreSQL BYTEA lưu trữ dữ liệu nhị phân nhưng chỉ tối đa 1 GB. Nếu dữ liệu trên 1 GB thì hãy sử dụng Đối tượng lớn.

Giao dịch

Cơ sở dữ liệu Oracle luôn sử dụng các giao dịch nhưng trong PostgreSQL, bạn phải kích hoạt điều đó. Trong Oracle, giao dịch bắt đầu khi thực hiện bất kỳ câu lệnh nào và kết thúc khi câu lệnh COMMIT được thực thi. Trong PostgreSQL, giao dịch bắt đầu khi thực thi BEGIN và kết thúc khi thực thi câu lệnh COMMIT. Ngay cả các mức cô lập cũng không có vấn đề gì. Cơ sở dữ liệu PostgreSQL biết tất cả các mức cô lập mà cơ sở dữ liệu Oracle biết. Mức độ cô lập mặc định của PostgreSQL được cam kết Đọc.

Ví dụ:

Oracle:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

BEGIN;
DELETE FROM table_name WHERE id  = 120;
COMMIT;

Bảng kép

Trong Oracle, mệnh đề FROM là bắt buộc đối với mọi câu lệnh SELECT nên cơ sở dữ liệu Oracle sử dụng bảng DUAL cho câu lệnh SELECT trong đó tên bảng không được yêu cầu. Trong PostgreSQL, mệnh đề FROM là không bắt buộc nên bảng DUAL là không cần thiết. Bảng Kép có thể được tạo trong PostgreSQL như một dạng xem để loại bỏ vấn đề chuyển. Công cụ Orafce đã triển khai điều này nên bạn cũng có thể sử dụng Orafce.

Ví dụ:

postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
ERROR:  relation "dual" does not exist
LINE 1: SELECT CURRENT_TIMESTAMP FROM DUAL;
                                      ^
postgres=# SELECT CURRENT_TIMESTAMP;
       current_timestamp
-------------------------------
 2018-03-16 09:36:01.205925+00
(1 row)

Sau khi cài đặt mô-đun Orafce:

postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
       current_timestamp
-------------------------------
 2018-03-16 09:36:01.205925+00
(1 row)

SYSDATE

Hàm SYSDATE của Oracle trả về ngày và giờ. Hoạt động của hàm SYSDATE khác nhau ở những nơi khác nhau. PostgreSQL không có bất kỳ chức năng nào tương ứng với chức năng SYSDATE. Trong PostgreSQL, có nhiều phương pháp để lấy ngày và giờ và nó dựa trên mục đích ứng dụng.

Phương pháp truy xuất thời gian Chức năng được sử dụng
Thời gian bắt đầu SQL Statement_timestamp ()
Thời gian bắt đầu giao dịch now () hoặc

Transaction_timestamp ()

Thời gian khi chức năng được triển khai Clock_timestamp ()

Trong ví dụ dưới đây clock_timestamp () trả về thời gian khi hàm thực được thực thi và statement_timestamp () khác trả về thời gian khi câu lệnh SQL bắt đầu thực thi.

postgres=# SELECT now(), statement_timestamp(), current_timestamp, transaction_timestamp(), clock_timestamp();
              now              |      statement_timestamp      |       current_timestamp       |     transaction_timestamp     |        clock_timestamp
 
-------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------
 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163281+00
 (1 row)

TO_DATE (hai đối số)

Hàm TO_DATE của Oracle trả về giá trị kiểu DATE (năm, tháng, ngày, giờ, phút, giây) trong khi TO_DATE (two_argument) của PostgreSQL trả về giá trị kiểu DATE (năm, tháng, ngày).

Giải pháp cho sự không tương thích này là chuyển đổi TO_DATE () thành TO_TIMESTAMP (). Nếu bạn sử dụng công cụ Orafce thì không cần thay đổi bất cứ điều gì vì Orafce đã triển khai chức năng này nên chúng ta nhận được kết quả tương tự như Oracle.

Oracle:

SELECT TO_DATE ('20180314121212','yyyymmddhh24miss') FROM dual;

PostgreSQL:

SELECT TO_TIMESTAMP ('20180314121212','yyyymmddhh24miss')::TIMESTAMP(0);

ĐỒNG BỘ

CREATE SYNONYM không được hỗ trợ trong PostgreSQL. Trong Oracle CREATE SYNONYM được sử dụng để truy cập các đối tượng từ xa trong khi trong PostgreSQL, chúng ta có thể sử dụng SET search_path để đưa vào định nghĩa từ xa.

Oracle:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Hành vi của chuỗi rỗng và NULL

Trong Oracle, chuỗi rỗng và giá trị NULL trong ngữ cảnh chuỗi là giống nhau. Kết quả là sự nối NULL và chuỗi sẽ thu được chuỗi. Trong PostgreSQL, kết quả nối là rỗng trong trường hợp này. Trong Oracle IS NULL, toán tử được sử dụng để kiểm tra xem chuỗi có trống hay không nhưng trong PostgreSQL, kết quả là FALSE đối với chuỗi trống và TRUE đối với NULL.

Chuỗi

Có một chút khác biệt về cú pháp của chuỗi trong Oracle và PostgreSQL.

Oracle:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

Để thay đổi cú pháp này, bạn có thể tạo một tập lệnh hoặc bạn có thể thay đổi nó theo cách thủ công.

SUBSTR

Hoạt động của hàm SUBSTR trong Oracle và PostgreSQL là khác nhau. Hàm SUBSTR hoạt động trong PostgreSQL mà không có lỗi nhưng trả về một kết quả khác. Sự khác biệt này có thể gây ra lỗi ứng dụng.

Oracle:

SELECT SUBSTR(‘ABC’,-1) FROM DUAL;
Returns ‘C’

PostgreSQL:

postgres=# SELECT SUBSTR('ABC',-1);
 substr
--------
 ABC
(1 row)

Giải pháp cho điều này là sử dụng hàm SUBSTR của Orafce trả về kết quả tương tự như Oracle trong PostgreSQL.

Tuyên bố DELETE

Trong Oracle, câu lệnh DELETE có thể hoạt động mà không có mệnh đề FROM nhưng trong PostgreSQL thì nó không được hỗ trợ. Chúng ta cần thêm mệnh đề FROM trong câu lệnh PostgreSQL DELETE theo cách thủ công.

Oracle:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Khớp nối bên ngoài +

Oracle sử dụng toán tử + cho phép nối trái và phải nhưng PostgreSQL không sử dụng nó.

Oracle:

SELECT a1.name1, a2.name2
     FROM a1, a2
     WHERE a1.code = a2.code (+);

PostgreSQL:

SELECT a1.name1, a2.name2
    FROM a1
    LEFT OUTER JOIN a2 ON a1.code = a2.code;

BẮT ĐẦU VỚI..CONNECT BY

Oracle sử dụng START WITH..CONNECT BY cho các truy vấn phân cấp. PostgreSQL không hỗ trợ câu lệnh START WITH..CONNECT BY. PostgreSQL có WITH RECURSIVE cho các truy vấn phân cấp, vì vậy hãy dịch câu lệnh CONNECT BY thành câu lệnh WITH RECURSIVE.

Oracle:

SELECT 
    restaurant_name, 
    city_name 
FROM 
    restaurants rs 
START WITH rs.city_name = 'TOKYO' 
CONNECT BY PRIOR rs.restaurant_name = rs.city_name;

PostgreSQL:

WITH RECURSIVE tmp AS (SELECT restaurant_name, city_name
                                 FROM restaurants
                                WHERE city_name = 'TOKYO'
                                UNION
                               SELECT m.restaurant_name, m.city_name
                                 FROM restaurants m
                                 JOIN tmp ON tmp.restaurant_name = m.city_name)
                  SELECT restaurant_name, city_name FROM tmp;

Chuyển đổi PLSQL sang PLPGSQL

Ngôn ngữ PL / pgSQL của PostgreSQL tương tự như ngôn ngữ PL / SQL của Oracle về nhiều mặt. Nó là một ngôn ngữ mệnh lệnh, có cấu trúc khối và tất cả các biến đều phải được khai báo. Trong cả hai phép gán, vòng lặp, điều kiện của cơ sở dữ liệu đều tương tự nhau.

Những điểm khác biệt chính mà bạn cần lưu ý khi chuyển từ PL / SQL của Oracle sang PL / pgSQL của PostgreSQL

Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức

Công cụ di chuyển

Có một số công cụ rất hữu ích cho quá trình di chuyển Oracle sang PostgreSQL. Bạn cũng có thể tạo công cụ của riêng mình dưới dạng tiện ích mở rộng và sử dụng nó bên trong PostgreSQL.

Orafce

Có thể sử dụng các hàm, kiểu dữ liệu và gói tương thích với Oracle như trong PostgreSQL. Đây là một công cụ mã nguồn mở có giấy phép BSD nên bất kỳ ai cũng có thể sử dụng công cụ này.

Hầu hết các chức năng chính đều có trong Orafce.

Các ứng dụng thường sử dụng các chức năng đó với nhiều lần xuất hiện. Bạn có thể giảm chi phí sửa đổi SQL bằng cách sử dụng công cụ này.

Tất cả các chức năng và gói được triển khai chính xác và nó được kiểm tra tốt.

Một số chức năng:

  • Dbms_output
  • dbms_random
  • utl_file - các chức năng liên quan đến hệ thống tệp
  • Dbms_pipe và dbms_alert
  • PLVdate, PLVstr, PLVchr
  • Kiểu dữ liệu DATE tương thích với Oracle và các chức năng như ADD_MONTHS, LAST_DAY, NEXT_DAY, v.v.
  • Chức năng NVL
  • Hàm SUBSTR và SUBSTRB
  • Hỗ trợ VARCHAR2 và NVARCHAR2
  • TO_DATE ()

Ora2pg

Ora2Pg là một công cụ miễn phí được sử dụng để di chuyển cơ sở dữ liệu Oracle sang một lược đồ tương thích với PostgreSQL.

Nó kết nối với cơ sở dữ liệu Oracle, tự động quét, trích xuất cấu trúc hoặc dữ liệu của nó và sau đó tạo các tập lệnh SQL mà bạn có thể tải vào cơ sở dữ liệu PostgreSQL của mình.

Ước tính chi phí trong quá trình di chuyển Oracle sang PostgreSQL không dễ dàng.

Ora2Pg kiểm tra tất cả các đối tượng cơ sở dữ liệu, tất cả các chức năng và thủ tục được lưu trữ để phát hiện xem vẫn còn một số đối tượng và mã PL / SQL mà Ora2Pg không thể tự động chuyển đổi.

Công cụ này rất hữu ích cho các chuyển đổi sau:

  • Chuyển đổi giản đồ
  • Chuyển đổi PLSQL sang PLPGSQL

Thử nghiệm

Kiểm tra toàn bộ ứng dụng và cơ sở dữ liệu đã di chuyển là rất quan trọng vì một số chức năng giống nhau trong cả hai cơ sở dữ liệu, tuy nhiên hoạt động là khác nhau.

  • Một số tình huống phổ biến cần được kiểm tra:
    • Kiểm tra xem tất cả các đối tượng có được chuyển đổi chính xác hay không.
    • Kiểm tra xem tất cả các DMLS có hoạt động bình thường hay không.
    • Tải một số dữ liệu mẫu trong cả hai cơ sở dữ liệu và kiểm tra kết quả. Kết quả của SQL từ cả hai cơ sở dữ liệu phải giống nhau.
    • Kiểm tra hiệu suất của DML và cải thiện nó nếu cần.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thêm tháng vào một ngày trong PostgreSQL

  2. Làm thế nào để trích xuất năm và tháng từ ngày trong PostgreSQL mà không sử dụng hàm to_char ()?

  3. Java Enums, JPA và Postgres enums - Làm cách nào để làm cho chúng hoạt động cùng nhau?

  4. Heroku psql:FATAL:các khe kết nối còn lại được dành riêng cho các kết nối siêu người dùng không sao chép

  5. Tổng quan về khả năng JSON trong PostgreSQL