---
title: "Chuyển PostgreSQL sang Oracle trên trình duyệt"
description: "Di chuyển cơ sở dữ liệu PostgreSQL sang Oracle: chuyển tệp pg_dump thành tập lệnh cùng bảng, khóa và dữ liệu, kèm báo cáo mọi thay đổi."
canonical: https://intosql.com/vi/postgresql-sang-oracle
last_updated: 2026-10-15
---

# Chuyển PostgreSQL sang Oracle trên trình duyệt

Thả bản dump dạng plain từ pg_dump hoặc pg_dumpall, dạng .sql hoặc .sql.gz, và tải xuống tập lệnh Oracle với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị Oracle không chứa được nguyên trạng, và mọi đối tượng nó không hỗ trợ, đều được liệt kê trong báo cáo.

[Hướng dẫn di chuyển PostgreSQL sang Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)

[Kiểu dữ liệu từ PostgreSQL sang Oracle](https://intosql.com/docs/types/postgresql-to-oracle)

## Những gì thay đổi từ PostgreSQL sang Oracle

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

| Trong PostgreSQL | Trong Oracle | Dòng báo cáo |
| --- | --- | --- |
| boolean | NUMBER(1) kèm CHECK 0 và 1 |  |
| varchar(n), char(n) | VARCHAR2(n CHAR), đếm theo ký tự |  |
| text | VARCHAR2(4000 CHAR) khi mọi giá trị vừa 4000 byte (750 ký tự trong khóa), nếu không thì CLOB | `text_as_lob` |
| empty strings and empty bytea values | NULL | `empty_string_null` |
| citext | so sánh chính xác | `case_insensitive_collation` |
| numeric(p,s) past 38 digits; numeric without a precision | NUMBER khi giá trị vừa 38 chữ số, nếu không thì VARCHAR2 | `decimal_as_text` |
| money | NUMBER(19,2) | `type_replaced` |
| interval | VARCHAR2(100 CHAR) với văn bản của PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | CLOB chứa mảng JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | VARCHAR2 hoặc CLOB với văn bản của PostgreSQL | `type_replaced` |
| json, jsonb | CLOB |  |
| timestamp | TIMESTAMP |  |
| timestamp with time zone | TIMESTAMP WITH TIME ZONE theo UTC |  |
| time | INTERVAL DAY TO SECOND tính từ nửa đêm |  |
| infinity, -infinity, BC dates and years past 9999 | NULL | `date_out_of_range` |
| NaN and Infinity in numeric | NULL | `invalid_value_null` |
| NOT NULL columns with values that become NULL | bỏ NOT NULL | `not_null_relaxed` |
| enum types | VARCHAR2 kèm CHECK các nhãn |  |
| enum columns holding values outside their labels | VARCHAR2 không có ràng buộc kiểm tra | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | VARCHAR2 |  |
| bytea | BLOB |  |
| bit(n), bit varying | NUMBER với giá trị của các bit đến 63 bit; dài hơn là chữ số dạng text |  |
| oid, xid, cid | NUMBER(10) kèm CHECK không âm |  |
| serial, identity | GENERATED BY DEFAULT ON NULL AS IDENTITY, tiếp tục sau id lớn nhất |  |
| a second serial or identity column in a table | một số nguyên thường | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE, ở giá trị đã đạt tới |  |
| generated columns | cột ảo | `stored_as_virtual` |
| generated columns with functions Oracle lacks | một cột thường với các giá trị | `generated_not_translated` |
| defaults with functions Oracle lacks, and defaults from a sequence | không có giá trị mặc định | `default_not_translated` |
| CHECK constraints | được chuyển đổi, viết trực tiếp trong CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | không được tạo | `check_skipped` |
| CHECK ... NOT VALID | không được tạo | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns | không được tạo | `index_skipped` |
| foreign keys | sau dữ liệu ENABLE NOVALIDATE, rồi xác thực kèm cảnh báo về hàng mồ côi |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | bị bỏ | `foreign_key_action_unsupported` |
| foreign keys to tables the dump doesn't create | không được tạo | `foreign_key_skipped` |
| names over 128 bytes | được rút ngắn | `name_shortened` |
| partitioned tables | một bảng chứa các hàng của mọi phân vùng | `partitions_dropped` |
| schemas | một schema, mỗi bảng có tên schema ở đầu | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | được liệt kê trong báo cáo | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | kiểu suy ra từ giá trị | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| text that isn't valid in its encoding | byte lỗi thành ký tự thay thế | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | sao chép nguyên trạng | `mojibake_suspected` |

## Nạp tập lệnh vào Oracle

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

```shell
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @postgresql.oracle.sql
```

Khóa ngoại được thêm với ENABLE NOVALIDATE, nên hàng mới được kiểm tra ngay, rồi được xác thực. Nếu một hàng cũ trỏ tới hàng không tồn tại, tập lệnh cho biết ràng buộc nào và để nó ở trạng thái chưa xác thực, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy chạy SQL*Plus trên cùng máy với cơ sở dữ liệu. Tập lệnh commit sau mỗi 100 hàng. Người dùng chạy tập lệnh cần quyền CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER và CREATE PROCEDURE, cùng hạn mức trên tablespace của mình.

## Tạo bản dump PostgreSQL để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

- --format=plain, mặc định của pg_dump, ghi ra SQL. Kho lưu trữ custom hoặc directory (-Fc, -Fd) thành SQL bằng pg_restore -f dump.sql, không cần máy chủ cơ sở dữ liệu.
- --no-owner --no-privileges bỏ vai trò và quyền, những thứ trình chuyển đổi vốn bỏ qua, nên bản dump nhỏ hơn.
- pg_dumpall dump mọi cơ sở dữ liệu vào một tệp; bảng của mỗi cơ sở dữ liệu có tên của nó ở đầu, nên không có gì trùng.

## Những gì không được chuyển đổi

Khung nhìn, khung nhìn cụ thể hóa, hàm, thủ tục, trình kích hoạt, quy tắc, chính sách bảo mật cấp hàng, tiện ích mở rộng và kiểu được viết bằng ngôn ngữ riêng của PostgreSQL. Chúng được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn viết lại cho Oracle.

## Câu hỏi về PostgreSQL sang Oracle

### Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

### Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

### Nó có đọc được kho lưu trữ pg_dump -Fc không?

Không trực tiếp: kho lưu trữ custom là định dạng nhị phân. pg_restore -f dump.sql dump.backup chuyển nó thành SQL dạng plain mà trình chuyển đổi đọc được, không cần kết nối máy chủ. Trình chuyển đổi sẽ báo khi nhận một kho lưu trữ.

### Bản dump có thể đến từ những phiên bản PostgreSQL nào?

Bản dump do pg_dump và pg_dumpall ghi từ PostgreSQL 10 trở lên, với các hàng COPY hoặc INSERT. Mọi bản dump thử nghiệm đến từ PostgreSQL 13 và 18 và được so với nguồn từng ô một.

### Giá trị serial và identity có được giữ không?

Có. Cột serial hoặc identity của mỗi bảng trở thành cột identity, mọi hàng giữ id của nó, và id tiếp theo tiếp tục sau id lớn nhất. Sequence không thuộc cột nào thành sequence Oracle ở giá trị đã đạt tới.

### Mảng, enum và các kiểu PostgreSQL khác sẽ ra sao?

Mảng thành mảng JSON, boolean thành NUMBER(1), timestamp có múi giờ thành TIMESTAMP WITH TIME ZONE, và văn bản thành VARCHAR2 khi giá trị vừa, nếu không thì CLOB. Chuỗi rỗng thành NULL, vì Oracle lưu chúng như vậy, và báo cáo đếm chúng.

### Còn hàm, trình kích hoạt và khung nhìn thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, vì mỗi cơ sở dữ liệu viết chúng bằng ngôn ngữ riêng.

### Tập lệnh nạp được trên những phiên bản Oracle nào?

Oracle 19c trở lên. Mọi bản dump thử nghiệm đều nạp được trên 21c và 23ai, và dừng ở lỗi đầu tiên nếu có sự cố.

## Từ PostgreSQL

- [PostgreSQL sang PostgreSQL](https://intosql.com/vi/postgresql-sang-postgresql)
- [PostgreSQL sang MySQL](https://intosql.com/vi/postgresql-sang-mysql)
- [PostgreSQL sang MariaDB](https://intosql.com/vi/postgresql-sang-mariadb)
- [PostgreSQL sang SQLite](https://intosql.com/vi/postgresql-sang-sqlite)
- [PostgreSQL sang SQL Server](https://intosql.com/vi/postgresql-sang-sql-server)

## Sang Oracle

- [MySQL sang Oracle](https://intosql.com/vi/mysql-sang-oracle)
- [MariaDB sang Oracle](https://intosql.com/vi/mariadb-sang-oracle)
- [SQL Server sang Oracle](https://intosql.com/vi/sql-server-sang-oracle)
- [SQLite sang Oracle](https://intosql.com/vi/sqlite-sang-oracle)
- [Oracle sang Oracle](https://intosql.com/vi/oracle-sang-oracle)

## Hướng dẫn và mọi cặp

- [Oracle sang PostgreSQL](https://intosql.com/vi/oracle-sang-postgresql)
- [Hướng dẫn di chuyển PostgreSQL sang Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)
- [Kiểu dữ liệu từ PostgreSQL sang Oracle](https://intosql.com/docs/types/postgresql-to-oracle)
- [Mọi cặp cơ sở dữ liệu](https://intosql.com/vi/chuyen-co-so-du-lieu)
