---
id: database-oracle
title: "Oracle Database"
shortTitle: "Oracle"
track: database
trackTitle: "Database"
order: 6
level: normal
status: published
estimatedMinutes: 25
prerequisites:
  - database-dynamodb
next: caching-redis
reviewedAgainst: 2026-10-12
sources:
  - title: "Oracle Database documentation"
    url: https://docs.oracle.com/en/database/oracle/oracle-database/index.html
  - title: "Multitenant architecture"
    url: https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/CDBs-and-PDBs.html
---

# Oracle Database

Oracle xuất hiện ở hệ thống đã chạy nhiều năm. Ở bài này bạn đọc chuỗi kết nối và tên listener. Không cài Oracle trong lab. Image và giấy phép nằm ngoài bài này.

## Để làm gì

Tách host, port, và service name trong một connection string, và không dùng account `SYS` cho app.

## Gồm những gì

- Listener, port 1521, service name.
- CDB và PDB ở mức tên gọi.
- Backup đi qua RMAN. Chỉ cần nhận ra từ khóa này khi đọc runbook.

Không gồm cài Database, Data Guard, hay tối ưu SQL.

## Dùng khi nào

Runbook ghi một chuỗi `host:1521/service`, hoặc một app Java có URL JDBC `oracle:thin:@//host:1521/FREEPDB1`. Bạn cần biết cổng đó không phải 5432 của PostgreSQL.

Đừng mở 1521 ra Internet để client nội bộ đỡ phải VPN. Listener là cửa vào database.

## Kiến thức cốt lõi

Listener là process nhận kết nối rồi đưa vào instance. Port mặc định 1521. Service name là tên mà client yêu cầu, không phải lúc nào cũng trùng SID cũ. Chuỗi dễ gặp:

```text
appuser/secret@db.internal:1521/FREEPDB1
```

Phần trước dấu `@` là user. Đừng để dạng này trong script đã commit. Dùng secret store hoặc Oracle Wallet. User của app không phải `SYS` hay `SYSTEM`. Hai account đó là quản trị.

Từ bản 12c, database thường là container database (CDB) chứa pluggable database (PDB). Dữ liệu app nằm trong PDB. Nối nhầm vào CDB thì không thấy bảng của app, hoặc không được tạo user ở đúng chỗ.

RMAN là công cụ backup của Oracle. Lệnh `pg_dump` không dùng cho Oracle. Khi đọc lịch vận hành, tìm job RMAN, không tìm cron `pg_dump`.

## Lệnh và code mẫu

Không có lệnh cài. Tách chuỗi sau trên giấy:

```text
jdbc:oracle:thin:@//db.internal:1521/FREEPDB1
```

| Phần | Giá trị |
| --- | --- |
| Driver | `oracle:thin` |
| Host | `db.internal` |
| Port | `1521` |
| Service | `FREEPDB1` |

## Thực hành

1. Tách bốn phần của URL ở trên.
2. Đối chiếu với chuỗi Postgres trong bài trước: port và từ khóa user khác.
3. Không tải Oracle XE và không đăng ký tài khoản chỉ cho bài này.

## Kết quả mong đợi

Bạn chỉ đúng host, port 1521, và service `FREEPDB1`.

## Checklist

- [ ] App dùng user riêng trong PDB, không dùng `SYS`.
- [ ] Connection string không nằm trong Git.
- [ ] Runbook backup nói RMAN, không copy lệnh `pg_dump`.

## Lỗi thường gặp

**Nối vào service của CDB.** Bảng app không có. Xin đúng service name của PDB từ người quản trị database, đừng đoán `ORCL` vì bài cũ dùng SID đó.

**Tường lửa mở 1521 vì app báo timeout.** Timeout có thể là listener sai host, hoặc security group. Kiểm tra tên service và đường mạng nội bộ trước khi nới rule.

## Nguồn

1. [Oracle Database documentation](https://docs.oracle.com/en/database/oracle/oracle-database/index.html) — cổng vào tài liệu theo phiên bản.
2. [CDBs and PDBs](https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/CDBs-and-PDBs.html) — container và pluggable database.

## Tiếp theo

[Redis](../caching/01-redis.md)
