Oracle University · D106546GC10

Oracle Database 19c
Administration Workshop

Tài liệu học tập toàn diện từ cơ bản đến nâng cao — với ví dụ thực tế, câu hỏi ôn tập và bài tập thực hành

33
Modules
570
Trang tài liệu
20+
Năm kinh nghiệm
MOD 01

Introduction to Oracle Database

Kiến trúc tổng quan, Multitenant, Sharding

Cơ bản Architecture

Module này cung cấp nền tảng kiến thức về kiến trúc Oracle Database 19c — hiểu rõ cấu trúc bên trong của một hệ quản trị cơ sở dữ liệu doanh nghiệp. Đây là bước bắt buộc phải nắm vững trước khi học bất kỳ module nào khác.

1. Ba thành phần chính của Oracle Database Server:

Thành phầnMô tảVí dụ
Memory Structures (SGA/PGA)Vùng bộ nhớ dùng chung và riêng cho từng tiến trìnhBuffer Cache, Shared Pool, Redo Log Buffer
ProcessesCác tiến trình nền Oracle quản lý hoạt động DBDBWn, LGWR, CKPT, SMON, PMON
Storage StructuresTập tin vật lý trên đĩa lưu trữ dữ liệuData files, Redo log files, Control files
💡 Cách nhớ: Oracle = Memory (não) + Processes (tay chân) + Storage (kho). Ba thứ phải đồng bộ mới hoạt động được.

2. Oracle Instance vs. Database:

  • Instance = Memory (SGA) + Processes — tồn tại trong RAM, mất khi shutdown
  • Database = tập tin trên đĩa — dữ liệu bền vững
  • Một Database có thể có nhiều Instance (RAC — Real Application Clusters)

3. Multitenant Container Database (CDB) — Điểm mới của 19c:

  • CDB (Container Database): Database "container" lớn chứa nhiều PDB
  • PDB (Pluggable Database): Database con, có thể "cắm vào / rút ra" linh hoạt
  • CDB$ROOT: Root container — quản lý toàn bộ CDB
  • PDB$SEED: Template chỉ đọc dùng để tạo PDB mới
🏗️ Mô hình CDB/PDB
┌─────────────────────────────────────────┐
│           CDB (Container DB)            │
│  ┌──────────┐  ┌──────┐  ┌──────────┐  │
│  │ CDB$ROOT │  │PDB$  │  │  PDB1    │  │
│  │ (Quản lý)│  │SEED  │  │  PDB2    │  │
│  └──────────┘  │(Tmpl)│  │  PDB3    │  │
│                └──────┘  └──────────┘  │
└─────────────────────────────────────────┘

4. Database Sharding (Phân mảnh):

Kỹ thuật phân tán dữ liệu ngang (horizontal partitioning) trên nhiều máy chủ độc lập (Shards). Mỗi shard chứa một phần dữ liệu, tăng khả năng mở rộng cực lớn cho hệ thống OLTP.

1. Oracle Instance khác Oracle Database ở điểm gì? +
Instance là SGA + Background Processes tồn tại trong RAM (mất khi tắt máy). Database là tập hợp tập tin vật lý trên đĩa (data files, redo logs, control files) — bền vững. Instance cần có để truy cập Database.
2. CDB$ROOT và PDB$SEED khác nhau thế nào? +
CDB$ROOT là root container chứa metadata và thông tin quản trị cho toàn bộ CDB. PDB$SEED là template chỉ đọc (read-only) dùng làm khuôn để tạo PDB mới — không thể modify trực tiếp.
3. Lợi ích lớn nhất của Multitenant Architecture là gì? +
Consolidation — nhiều schema/ứng dụng chạy trong các PDB riêng biệt, dùng chung một Oracle binary, SGA và background processes. Tiết kiệm tài nguyên, dễ quản lý, PDB có thể unplug/plug sang CDB khác không cần downtime lớn.
4. Trong RAC, có bao nhiêu Instance cho một Database? +
Nhiều Instance (nhiều node) cùng mount và mở một Database duy nhất. Ví dụ: 4 server = 4 Instance, cùng chia sẻ storage (thường qua ASM). Đây là cấu hình High Availability điển hình của Oracle.
SGA + ProcessesOracle Instance (RAM)
Data/Redo/Control filesOracle Database (Disk)
CDBContainer chứa PDB
PDBDB con, linh hoạt
ShardingScale-out ngang
RACMulti-instance/1 DB

Lab 1.1: Xem thông tin Instance và Database

SQL — Kết nối và kiểm tra instance
-- Kết nối với SQL*Plus với quyền SYSDBA
$ sqlplus / as sysdba

-- Xem tên instance đang chạy
SELECT instance_name, status, database_status
FROM v$instance;
📤 Kết quả đầu ra mẫu
INSTANCE_NAME STATUS DATABASE_STATUS ---------------- ------------ ----------------- orcl OPEN ACTIVE
-- Xem tên database
SELECT name, db_unique_name, cdb, con_id
FROM v$database;
NAME DB_UNIQUE_NAME CDB CON_ID --------- --------------- ---- ------ ORCL orcl YES 0

Lab 1.2: Xem danh sách PDB trong CDB

-- Liệt kê tất cả Container (CDB + PDBs)
SELECT con_id, name, open_mode, restricted
FROM v$pdbs;
CON_ID NAME OPEN_MODE RESTRICTED ------- ---------- ----------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 MOUNTED NO
Lời giải: CON_ID=1 là CDB$ROOT. CON_ID=2 luôn là PDB$SEED. Từ CON_ID=3 trở lên là các PDB thực tế. OPEN_MODE=MOUNTED nghĩa là PDB chưa được mở (cần ALTER PLUGGABLE DATABASE OPEN).
MOD 02

Accessing an Oracle Database

SQL*Plus, SQL Developer, DBCA, OEM

Cơ bản Tools

Nắm rõ các công cụ kết nối và quản trị Oracle Database: từ dòng lệnh (SQL*Plus) đến GUI (SQL Developer, OEM). DBA cần thành thạo tất cả để xử lý nhiều tình huống khác nhau.

Công cụLoạiDùng khi nào
SQL*PlusCLIScript automation, troubleshoot, khi không có GUI
SQL DeveloperGUI (Java)Phát triển, query, xem schema, PL/SQL debugging
DBCAGUI WizardTạo/xóa/cấu hình Database
OEM DB ExpressWeb (port 5500)Monitor nhẹ, không cần agent
OEM Cloud ControlWeb EnterpriseQuản lý hàng trăm DB từ một giao diện

SQL*Plus — Kết nối các dạng:

-- Kết nối local với SYSDBA (không cần password nếu OS auth)
$ sqlplus / as sysdba

-- Kết nối từ xa (Easy Connect syntax)
$ sqlplus hr/password@//192.168.1.10:1521/ORCLPDB1

-- Kết nối tới PDB cụ thể
$ sqlplus system/oracle@//localhost:1521/pdb1

-- Kết nối SYSBACKUP, SYSDG, SYSKM
$ sqlplus / as sysbackup

Oracle SQL Developer — Tạo kết nối:

  • New Connection → Connection Type: Basic
  • Hostname: IP server, Port: 1521, Service name: ORCLPDB1
  • Role: SYSDBA (nếu cần quyền admin)
💡 OEM DB Express URL: https://hostname:5500/em — truy cập từ browser, không cần cài thêm agent. Phù hợp monitor nhanh performance.
1. Tại sao SQL*Plus vẫn quan trọng dù đã có GUI?+
SQL*Plus là công cụ luôn có sẵn khi cài Oracle, không phụ thuộc GUI hay Java. Quan trọng khi server chỉ có CLI, khi scripting tự động hóa (shell script), khi emergency recovery không có mạng.
2. OEM DB Express khác OEM Cloud Control ở điểm gì?+
DB Express: built-in trong Oracle DB, không cần agent, chỉ monitor được 1 DB tại một thời điểm, features hạn chế. Cloud Control: cần cài OMS + Agent riêng, quản lý tập trung nhiều DB/host, có đầy đủ chức năng enterprise (job scheduling, patching, compliance).
3. Sự khác nhau giữa connect với SYSDBA và SYSOPER?+
SYSDBA: quyền tối cao — startup/shutdown, create/drop database, full DBA privileges, connect as SYS. SYSOPER: quyền hạn chế — startup/shutdown, backup/recovery nhưng không xem user data, không có CREATE DATABASE.
SQL*PlusCLI, luôn sẵn có
SQL DeveloperGUI, PL/SQL IDE
DBCAWizard tạo DB
OEM DB ExpressWeb :5500/em
Cloud ControlEnterprise quản lý

Lab 2.1: Kết nối SQL*Plus và chuyển đổi container

-- 1. Kết nối SYSDBA
$ sqlplus / as sysdba

-- 2. Xem đang ở container nào
SHOW con_name;

-- 3. Chuyển sang PDB1
ALTER SESSION SET container = PDB1;
SHOW con_name;

-- 4. Quay lại CDB$ROOT
ALTER SESSION SET container = CDB$ROOT;
CON_NAME ------------------------------ CDB$ROOT CON_NAME ------------------------------ PDB1
Lời giải: Khi connect vào CDB root, dùng ALTER SESSION SET CONTAINER để chuyển sang PDB. Đây là cách làm việc với PDB khi kết nối qua CDB port. Ngoài ra có thể kết nối thẳng vào PDB qua service name riêng của PDB.
MOD 03

Creating an Oracle Database by Using DBCA

Database Configuration Assistant, Character Sets

Cơ bảnSetup

Tạo Oracle Database bằng công cụ DBCA (GUI hoặc silent mode). Chọn đúng character set ngay từ đầu là cực kỳ quan trọng vì rất khó thay đổi sau khi có dữ liệu.

Lập kế hoạch trước khi tạo Database:

  • Tên DB: Global DB name = DB name + domain (vd: orcl.example.com)
  • Character set: AL32UTF8 (Unicode, khuyến nghị cho mọi hệ thống mới)
  • Storage: File System, ASM, hay OMF?
  • Memory: SGA + PGA (hoặc dùng AMM tự động)
  • Template: General Purpose, Data Warehouse, hay Custom

Character Set — Quyết định quan trọng nhất:

Character SetĐặc điểmDùng khi
AL32UTF8Unicode, hỗ trợ mọi ngôn ngữ✅ Mọi hệ thống mới — khuyến nghị
WE8ISO8859P1Latin-1, 1 byte/charLegacy Western European
VN8VN3Tiếng Việt TCVN 3Legacy VN — không dùng mới

Tạo DB với DBCA Silent Mode (dùng trong scripts):

# Tạo CDB mới bằng DBCA silent mode
$ dbca -silent -createDatabase \
  -templateName General_Purpose.dbc \
  -gdbName orcl \
  -sid orcl \
  -createAsContainerDatabase true \
  -numberOfPDBs 1 \
  -pdbName pdb1 \
  -pdbAdminPassword Oracle_4U \
  -sysPassword Oracle_4U \
  -systemPassword Oracle_4U \
  -characterSet AL32UTF8 \
  -totalMemory 2048 \
  -storageType FS \
  -datafileDestination /u01/app/oracle/oradata
Copying database files 1% complete ... 100% complete Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/orcl/orcl.log" for further details.

NLS_LANG — Cấu hình đúng phía Client:

# Trên Linux client — set NLS_LANG
$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

# Kiểm tra character set database
SELECT value FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';
VALUE ------- AL32UTF8
1. Tại sao AL32UTF8 được khuyến nghị cho mọi hệ thống mới?+
AL32UTF8 là implementation của Unicode (UTF-8) trong Oracle, hỗ trợ tất cả ngôn ngữ thế giới bao gồm tiếng Việt, tiếng Trung, tiếng Nhật, emoji... Tránh vấn đề conversion và mất dữ liệu khi làm việc đa ngôn ngữ.
2. DBCA Silent Mode có ưu điểm gì so với GUI?+
Silent Mode không cần màn hình GUI (headless server), có thể chạy trong script tự động, dễ lặp lại (reproducible), có thể quản lý version control cho response file. Thích hợp cho DevOps/automation.
3. Điều gì xảy ra nếu NLS_LANG client khác character set database?+
Dữ liệu tiếng Việt/đặc biệt bị lưu sai, hiển thị sai (mojibake/garbled characters). Oracle sẽ tự động convert nhưng nếu character set client hẹp hơn database, có thể mất ký tự đặc biệt vĩnh viễn.

Lab 3.1: Kiểm tra và xác nhận Character Set sau khi tạo DB

-- Xem đầy đủ NLS parameters của database
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter IN (
  'NLS_CHARACTERSET',
  'NLS_NCHAR_CHARACTERSET',
  'NLS_LANGUAGE',
  'NLS_TERRITORY'
);
PARAMETER VALUE ------------------------ --------------- NLS_CHARACTERSET AL32UTF8 NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA
Lời giải: NLS_CHARACTERSET là character set cho VARCHAR2/CHAR columns. NLS_NCHAR_CHARACTERSET là cho NVARCHAR2/NCHAR (luôn là Unicode). Nếu NLS_CHARACTERSET không phải AL32UTF8 trên hệ thống mới, cần rebuild database.
MOD 04

Creating an Oracle Database by Using SQL

CREATE DATABASE command, CDB creation

Cơ bảnSQL DDL

Hiểu cú pháp SQL thủ công để tạo CDB, giúp DBA kiểm soát hoàn toàn quá trình tạo database và xử lý các trường hợp đặc biệt mà DBCA không hỗ trợ.

Các bước tạo CDB thủ công:

  1. Tạo thư mục và file hệ thống (oradata, fast_recovery_area)
  2. Tạo file tham số (init.ora hoặc SPFILE)
  3. Start instance ở chế độ NOMOUNT
  4. Chạy lệnh CREATE DATABASE
  5. Chạy scripts catalog.sql và catproc.sql
-- Bước 3: Start NOMOUNT
$ sqlplus / as sysdba
STARTUP NOMOUNT pfile='/u01/app/oracle/admin/orcl/pfile/init.ora';

-- Bước 4: Tạo CDB bằng SQL
CREATE DATABASE orcl
  USER SYS IDENTIFIED BY Oracle_4U
  USER SYSTEM IDENTIFIED BY Oracle_4U
  LOGFILE GROUP 1 ('/u01/oradata/orcl/redo01.log') SIZE 100M,
          GROUP 2 ('/u01/oradata/orcl/redo02.log') SIZE 100M
  MAXLOGFILES 5
  MAXDATAFILES 100
  CHARACTER SET AL32UTF8
  NATIONAL CHARACTER SET AL16UTF16
  EXTENT MANAGEMENT LOCAL
  DATAFILE '/u01/oradata/orcl/system01.dbf'
    SIZE 700M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
  SYSAUX DATAFILE '/u01/oradata/orcl/sysaux01.dbf'
    SIZE 550M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
  DEFAULT TABLESPACE users
    DATAFILE '/u01/oradata/orcl/users01.dbf'
    SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
  DEFAULT TEMPORARY TABLESPACE temp
    TEMPFILE '/u01/oradata/orcl/temp01.dbf'
    SIZE 100M REUSE
  UNDO TABLESPACE undotbs1
    DATAFILE '/u01/oradata/orcl/undotbs01.dbf'
    SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
  ENABLE PLUGGABLE DATABASE
  SEED FILE_NAME_CONVERT =
    ('/u01/oradata/orcl/', '/u01/oradata/orcl/pdbseed/');

-- Bước 5: Chạy scripts cataolog
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
💡 Mệnh đề ENABLE PLUGGABLE DATABASE là bắt buộc để tạo CDB. Nếu thiếu, sẽ tạo Non-CDB (kiểu cũ, deprecated từ 21c).
1. Tại sao phải STARTUP NOMOUNT trước khi CREATE DATABASE?+
Vì NOMOUNT chỉ đọc parameter file (init.ora/spfile) và khởi tạo SGA + background processes, nhưng chưa mount control file (chưa có). CREATE DATABASE sẽ tạo control file mới và các file cần thiết.
2. Mệnh đề SEED FILE_NAME_CONVERT dùng để làm gì?+
Chỉ định nơi lưu data files của PDB$SEED (template PDB). Oracle sẽ copy files từ đường dẫn nguồn sang đích được chỉ định. Nếu dùng OMF (Oracle Managed Files), không cần mệnh đề này.
-- Xác minh database vừa tạo thành công
SELECT name, open_mode, log_mode, cdb
FROM v$database;

SELECT tablespace_name, status
FROM dba_tablespaces
ORDER BY tablespace_name;
NAME OPEN_MODE LOG_MODE CDB ----- ----------- ---------- --- ORCL READ WRITE NOARCHIVELOG YES TABLESPACE_NAME STATUS ---------------- -------- SYSAUX ONLINE SYSTEM ONLINE TEMP ONLINE UNDOTBS1 ONLINE USERS ONLINE
Lời giải: 5 tablespaces mặc định phải có: SYSTEM, SYSAUX, TEMP, UNDOTBS1, USERS. LOG_MODE mặc định là NOARCHIVELOG — cho production nên đổi sang ARCHIVELOG.
MOD 05

Starting Up and Shutting Down a Database Instance

STARTUP stages, SHUTDOWN modes, PDB management

Cơ bảnOperations

Hiểu các trạng thái của Oracle Instance và chọn đúng lệnh startup/shutdown phù hợp với từng tình huống. Đây là kỹ năng DBA cơ bản nhất.

Các trạng thái STARTUP (theo thứ tự):

┌──────────┐    ┌─────────┐    ┌──────────┐    ┌──────┐
│SHUTDOWN  │ →  │ NOMOUNT │ →  │ MOUNTED  │ →  │ OPEN │
│(no proc) │    │SGA+proc │    │+ctrl file│    │+data │
└──────────┘    └─────────┘    └──────────┘    └──────┘
                STARTUP        ALTER DATABASE  ALTER DATABASE
                NOMOUNT        MOUNT           OPEN
Trạng tháiĐã làmDùng khi
NOMOUNTĐọc param file, init SGA+processesCREATE DATABASE, RESTORE CONTROLFILE
MOUNT+ Đọc control fileRECOVERY, đổi LOG_MODE, RENAME files
OPEN+ Mở data files, redo logsTrạng thái hoạt động bình thường

Các lệnh STARTUP:

SQL> STARTUP;                    -- NOMOUNT→MOUNT→OPEN (thông thường)
SQL> STARTUP NOMOUNT;            -- Chỉ lên NOMOUNT
SQL> STARTUP MOUNT;             -- Lên MOUNT
SQL> STARTUP RESTRICT;          -- OPEN nhưng chỉ RESTRICTED SESSION
SQL> STARTUP FORCE;             -- SHUTDOWN ABORT rồi STARTUP
SQL> STARTUP PFILE='/path/init.ora'; -- Dùng pfile cụ thể

Các chế độ SHUTDOWN:

LệnhChờ transaction?Checkpoint?Recovery cần?
SHUTDOWN NORMALCó (vô tận)Không
SHUTDOWN TRANSACTIONALChờ commit/rollbackKhông
SHUTDOWN IMMEDIATERollback ngayKhông
SHUTDOWN ABORTKhôngKhôngCó (tự động)
⚠️ SHUTDOWN ABORT = "rút điện đột ngột". Oracle tự recover khi startup lại nhưng mất thời gian. Chỉ dùng khi DB bị treo hoàn toàn.

Quản lý PDB — Open/Close:

-- Mở tất cả PDB
ALTER PLUGGABLE DATABASE ALL OPEN;

-- Mở PDB cụ thể
ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- Đóng PDB
ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;

-- Cấu hình PDB tự động mở khi CDB startup
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ALL SAVE STATE;
1. Khi nào dùng STARTUP MOUNT thay vì STARTUP thông thường?+
Khi cần thực hiện các thao tác yêu cầu database closed nhưng đã mount control file: chuyển NOARCHIVELOG→ARCHIVELOG, rename/move data files khi offline, thực hiện database recovery, restore/replace control file.
2. SHUTDOWN IMMEDIATE vs SHUTDOWN ABORT — khi nào dùng cái nào?+
IMMEDIATE: cách shutdown thông thường cho production — rollback uncommitted transactions, checkpoint, sạch sẽ, không cần recovery. ABORT: khẩn cấp khi DB bị hang hoàn toàn, IMMEDIATE không phản hồi. Cần recovery khi startup lại nhưng Oracle tự làm.
3. ALTER PLUGGABLE DATABASE ALL SAVE STATE làm gì?+
Lưu trạng thái hiện tại (OPEN/CLOSE) của PDB vào data dictionary. Lần sau khi CDB startup, Oracle tự động mở PDB về trạng thái đã lưu. Không cần DBA phải manually mở từng PDB sau mỗi lần restart CDB.
-- Lab: Thực hành startup/shutdown và PDB management

-- 1. Shutdown IMMEDIATE (an toàn)
SQL> SHUTDOWN IMMEDIATE;

-- 2. Startup MOUNT (để xem trạng thái)
SQL> STARTUP MOUNT;

-- 3. Mở database
SQL> ALTER DATABASE OPEN;

-- 4. Xem trạng thái PDB
SQL> SELECT name, open_mode FROM v$pdbs;

-- 5. Mở tất cả PDB và lưu state
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;

-- 6. Xác nhận
SQL> SELECT name, open_mode FROM v$pdbs;
Database closed. Database dismounted. ORACLE instance shut down. ORACLE instance started. Database mounted. Database altered. NAME OPEN_MODE ---------- ---------- PDB$SEED READ ONLY PDB1 MOUNTED Pluggable database altered. Pluggable database altered. NAME OPEN_MODE ---------- ---------- PDB$SEED READ ONLY PDB1 READ WRITE
MOD 06

Managing Database Instances

Init parameters, ADR, Alert Log, Data Dictionary

Trung cấpAdministration

Quản lý các tham số khởi tạo (initialization parameters), đọc Alert Log để troubleshoot, sử dụng Data Dictionary và Dynamic Performance Views — ba kỹ năng thiết yếu của DBA hàng ngày.

Initialization Parameters — hai loại:

-- Xem tất cả tham số
SQL> SHOW PARAMETERS;
SQL> SHOW PARAMETERS sga;

-- Static parameter: cần restart mới có hiệu lực
SQL> ALTER SYSTEM SET db_block_size = 16384 SCOPE=SPFILE;

-- Dynamic parameter: có hiệu lực ngay, lưu vào SPFILE
SQL> ALTER SYSTEM SET sga_target = 2G SCOPE=BOTH;

-- SCOPE options:
-- MEMORY: chỉ áp dụng session hiện tại (mất sau restart)
-- SPFILE: lưu vào spfile (có hiệu lực sau restart)
-- BOTH:   áp dụng ngay + lưu vào spfile

Automatic Diagnostic Repository (ADR):

-- Tìm DIAGNOSTIC_DEST (thư mục gốc ADR)
SQL> SHOW PARAMETER diagnostic_dest;

-- Cấu trúc ADR:
$DIAGNOSTIC_DEST/diag/rdbms/<db_name>/<instance>/
├── alert/        ← Alert log (XML + text)
├── trace/        ← Trace files (.trc)
├── incident/     ← Incident dumps
└── cdump/        ← Core dumps

-- Xem Alert Log bằng ADRCI
$ adrci
adrci> show alert -tail 50

Querying Alert Log từ SQL (19c):

-- Xem 20 lỗi gần nhất trong alert log
SELECT originating_timestamp, message_text
FROM v$diag_alert_ext
WHERE message_text LIKE '%ORA-%'
ORDER BY originating_timestamp DESC
FETCH FIRST 20 ROWS ONLY;

Data Dictionary — ba tầng prefix:

PrefixPhạm viVí dụ
USER_Objects của user hiện tạiUSER_TABLES, USER_INDEXES
ALL_Objects user có quyền truy cậpALL_TABLES, ALL_PROCEDURES
DBA_Tất cả objects trong DB (cần DBA role)DBA_TABLES, DBA_USERS

Dynamic Performance Views (V$ views):

-- Xem các session đang kết nối
SELECT sid, serial#, username, status, machine, program
FROM v$session
WHERE type = 'USER';

-- Xem memory usage
SELECT pool, bytes/1024/1024 AS mb
FROM v$sgastat
ORDER BY bytes DESC;

-- Xem các parameter đã thay đổi so với default
SELECT name, value, isdefault
FROM v$parameter
WHERE isdefault = 'FALSE'
ORDER BY name;
1. SPFILE vs PFILE — khi nào dùng cái nào?+
SPFILE (Server Parameter File): binary, Oracle tự quản lý, hỗ trợ ALTER SYSTEM SCOPE=SPFILE — khuyến nghị cho production. PFILE (Parameter File): text file, có thể edit thủ công, dùng khi cần emergency startup hoặc đọc/chỉnh sửa trực tiếp. Tạo PFILE từ SPFILE: CREATE PFILE FROM SPFILE.
2. V$ views và DBA_ views khác nhau thế nào?+
V$ views (Dynamic Performance Views): thông tin runtime từ memory/SGA, thay đổi liên tục theo hoạt động DB — dùng để monitor real-time (sessions, waits, memory). DBA_ views: thông tin từ data dictionary (disk) — objects, users, privileges — ổn định hơn, dùng cho administration.
3. SCOPE=BOTH vs SCOPE=SPFILE khác nhau điểm gì?+
SCOPE=BOTH: áp dụng ngay lập tức (MEMORY) VÀ lưu vào SPFILE — dùng cho dynamic parameters. SCOPE=SPFILE: chỉ lưu vào SPFILE, không áp dụng ngay — dùng cho static parameters (cần restart). Nếu tham số là static mà dùng BOTH sẽ báo lỗi.
-- Lab: Tạo PFILE từ SPFILE, chỉnh sửa, và backup

-- 1. Tạo PFILE từ SPFILE hiện tại
CREATE PFILE = '/tmp/init_backup.ora' FROM SPFILE;

-- 2. Xem nội dung (trên Linux)
$ cat /tmp/init_backup.ora

-- 3. Thay đổi parameter dynamic
ALTER SYSTEM SET open_cursors = 500 SCOPE=BOTH;

-- 4. Xác nhận thay đổi
SHOW PARAMETER open_cursors;

-- 5. Restore nếu cần (từ PFILE)
CREATE SPFILE FROM PFILE = '/tmp/init_backup.ora';
File created. NAME TYPE VALUE -------------- ------- ----- open_cursors integer 500
MOD 07

Oracle Net Services: Overview

Network architecture, Listener, Dedicated vs Shared

Trung cấpNetworking

Hiểu cách Oracle Network hoạt động từ client đến database — listener, TNS, kết nối dedicated vs shared. Cần thiết để cấu hình và troubleshoot kết nối mạng.

Luồng kết nối Oracle Network:

Client                  Server
  │                       │
  │──TCP connect:1521──→  │ Listener (lsnrctl)
  │                       │  ↓ kiểm tra tns/service
  │←──redirect port──────│ (tạo server process)
  │                       │
  │──kết nối trực tiếp──→│ Server process
  │←──authenticated──────│
  │                       │
  │ [session hoạt động]   │

Dedicated vs Shared Server:

Dedicated ServerShared Server
Server process1 server process / 1 clientN clients / M server processes
PGARiêng từng process (lớn hơn)Trong SGA (UGA trong SGA)
Phù hợpBatch jobs, long transactionsNhiều kết nối idle (web apps)
Mặc định✅ Mặc địnhCần cấu hình thêm
-- Xem listener status
$ lsnrctl status

-- Xem service names đang đăng ký
$ lsnrctl services

-- Trong SQL: xem service_name
SHOW PARAMETER service_names;
1. Listener có vai trò gì trong kết nối Oracle?+
Listener là "receptionist" — lắng nghe trên port 1521, nhận connection request từ client, xác định service/SID yêu cầu, tạo hoặc chuyển hướng tới server process. Sau khi kết nối được thiết lập, client nói chuyện trực tiếp với server process — listener không tham gia nữa.
2. Khi nào nên dùng Shared Server thay Dedicated?+
Khi có hàng nghìn client kết nối nhưng mỗi session chủ yếu idle (web applications, connection pooling không đủ). Shared Server tiết kiệm memory vì dùng chung server processes. Không nên dùng cho batch jobs hay long-running transactions.
-- Lab: Kiểm tra listener và kết nối network
$ lsnrctl status LISTENER
LSNRCTL for Linux: Version 19.0.0.0.0 Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))) STATUS of the LISTENER ----------------------- Alias LISTENER Version TNSLSNR for Linux: Version 19.0.0.0.0 Start Date 07-APR-2026 08:00:01 Uptime 0 days 2 hr. 15 min. 33 sec Trace Level off Security ON: Local OS Authentication Listener Parameter File /u01/app/oracle/product/19c/network/admin/listener.ora Services Summary... Service "ORCL" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... Service "pdb1" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service...
MOD 08

Configuring Naming Methods

Easy Connect, Local Naming (tnsnames.ora), Directory Naming

Trung cấpNetworking

Cấu hình cách client "dịch" tên service thành địa chỉ kết nối. Ba phương thức chính: Easy Connect (đơn giản nhất), Local Naming (tnsnames.ora), và Directory Naming (LDAP).

Easy Connect — không cần cấu hình file:

-- Cú pháp: user/pass@host:port/service
$ sqlplus hr/password@192.168.1.10:1521/pdb1

-- Cú pháp đầy đủ (Easy Connect Plus - 19c)
$ sqlplus hr/pass@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=pdb1)))'

Local Naming — tnsnames.ora:

# File: $ORACLE_HOME/network/admin/tnsnames.ora
PDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

-- Dùng alias trong tnsnames.ora
$ sqlplus hr/password@PDB1

-- Test kết nối
$ tnsping PDB1
Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=pdb1))) OK (10 msec)

Thứ tự resolve tên (sqlnet.ora):

# /network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH = (EZCONNECT, TNSNAMES, LDAP)
1. Khi nào dùng Easy Connect thay tnsnames.ora?+
Easy Connect: đơn giản, không cần config file, thích hợp cho dev/test, ad-hoc connections, scripts đơn giản. tnsnames.ora: khi cần đặt alias rõ ràng, cấu hình phức tạp (failover, load balancing, multiple addresses), dùng nhiều lần cùng tên alias trong scripts lớn.
-- Thêm entry vào tnsnames.ora và test

-- 1. Edit tnsnames.ora
$ vi $ORACLE_HOME/network/admin/tnsnames.ora

-- Thêm vào cuối file:
MYPDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = pdb1))
  )

-- 2. Test
$ tnsping MYPDB
$ sqlplus system/oracle@MYPDB
MOD 09

Configuring and Administering the Listener

listener.ora, Dynamic/Static Registration, lsnrctl

Trung cấpNetworking

Cấu hình và quản lý Oracle Listener — cổng vào của mọi kết nối từ client tới database. Hiểu dynamic vs static registration để troubleshoot khi listener không thấy service.

listener.ora — file cấu hình listener:

# $ORACLE_HOME/network/admin/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

# Static registration (cho DB ở NOMOUNT/MOUNT hoặc không đăng ký dynamic)
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/19c)
      (SID_NAME = orcl)
    )
  )

Dynamic Registration (mặc định 19c):

-- LREG process tự động đăng ký instance với listener
-- Cấu hình: LOCAL_LISTENER parameter
ALTER SYSTEM SET local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))';

-- Buộc đăng ký ngay (không cần chờ)
ALTER SYSTEM REGISTER;

Quản lý Listener với lsnrctl:

$ lsnrctl start [listener_name]   # Khởi động
$ lsnrctl stop [listener_name]    # Dừng
$ lsnrctl status                  # Xem trạng thái
$ lsnrctl reload                  # Reload config không restart
$ lsnrctl services                # Xem services đang đăng ký
⚠️ Dynamic vs Static Registration: Dynamic registration (LREG) là mặc định và ưu tiên — instance tự đăng ký khi startup. Static cần khi kết nối với RMAN, Data Guard, hoặc khi DB chưa mở (NOMOUNT/MOUNT) mà vẫn cần listener nhận biết.
1. Tại sao cần static registration trong một số trường hợp?+
Khi DB ở NOMOUNT hoặc MOUNT, LREG process chưa có hoặc chưa đăng ký → listener không biết DB này tồn tại → không thể kết nối RMAN qua network. Static registration cho listener biết service tồn tại dù DB chưa OPEN. Cũng cần cho Data Guard Standby và một số tool khác.
2. Lệnh nào buộc instance đăng ký ngay với listener?+
ALTER SYSTEM REGISTER; — buộc LREG process đăng ký tất cả services ngay lập tức thay vì chờ đến lần tự động tiếp theo (60 giây). Hữu ích sau khi khởi động DB hoặc thêm service mới.
-- Restart listener và force registration
$ lsnrctl stop
$ lsnrctl start
$ sqlplus / as sysdba
SQL> ALTER SYSTEM REGISTER;
$ lsnrctl services
Service "pdb1" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service...
MOD 10–11

Shared Server & Connection Manager

Shared Server Architecture, CMAN Multiplexing & Access Control

Trung cấpNâng cao

Cấu hình Shared Server để hàng nghìn client dùng chung server processes, và Oracle Connection Manager (CMAN) để multiplexing kết nối và kiểm soát truy cập mạng.

Kích hoạt Shared Server:

-- Bật Shared Server (tối thiểu)
ALTER SYSTEM SET shared_servers = 5;
ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(SERVICE=orclXDB)';

-- Kiểm soát shared server
ALTER SYSTEM SET max_shared_servers = 20;
ALTER SYSTEM SET shared_server_sessions = 200;

-- Monitor shared servers
SELECT name, status, requests, busy
FROM v$shared_server;

Oracle Connection Manager (CMAN) — cman.ora:

# cman.ora — CMAN configuration
CMAN =
  (CONFIGURATION =
    (ADDRESS = (PROTOCOL=TCP)(HOST=cman_host)(PORT=1521))
    (RULE_LIST =
      (RULE =
        (SRC_HOST = 10.0.1.0/24)
        (DST_HOST = dbserver)
        (SRV = pdb1)
        (ACT = accept)
      )
      (RULE =
        (SRC_HOST = *)
        (DST_HOST = dbserver)
        (SRV = *)
        (ACT = reject)
      )
    )
    (PARAMETER_LIST =
      (MAX_CONNECTIONS = 1000)
      (SESSION_TIMEOUT = 60)
    )
  )
💡 CMAN hữu ích khi: (1) Firewall chỉ cho phép một IP duy nhất kết nối DB, (2) Cần multiplexing nhiều client connections thành ít TCP connections thực sự, (3) Kiểm soát ai được phép kết nối DB qua filtering rules.
1. SGA và PGA thay đổi thế nào khi dùng Shared Server?+
Shared Server: UGA (User Global Area) — thường nằm trong PGA với Dedicated — được chuyển vào trong SGA (Large Pool hoặc Shared Pool). SGA cần lớn hơn để chứa UGA của nhiều sessions. PGA mỗi shared server process nhỏ hơn vì không chứa UGA session.
-- Kiểm tra Dispatcher và Shared Server processes
SELECT name, status, messages, bytes
FROM v$dispatcher;

SELECT name, status, requests
FROM v$shared_server;
MOD 12–14

Creating and Managing PDBs

PDB từ Seed, Clone, Unplug/Plug, Proxy PDB, Quản lý PDB

Trung cấpCDB/PDB

Nắm vững tất cả phương thức tạo PDB và quản lý vòng đời của chúng — đây là trọng tâm của Oracle Multitenant, ứng dụng rộng rãi trong cloud và môi trường multi-tenant hiện đại.

Tạo PDB từ PDB$SEED (cách đơn giản nhất):

-- Kết nối tới CDB$ROOT
$ sqlplus / as sysdba

-- Tạo PDB mới từ seed
CREATE PLUGGABLE DATABASE pdb2
  ADMIN USER pdb2admin IDENTIFIED BY Oracle_4U
  ROLES = (dba)
  FILE_NAME_CONVERT =
    ('/u01/oradata/orcl/pdbseed/', '/u01/oradata/orcl/pdb2/');

-- Mở PDB vừa tạo
ALTER PLUGGABLE DATABASE pdb2 OPEN;

Clone PDB (tạo bản sao từ PDB hiện có):

-- Clone PDB1 thành PDB3
CREATE PLUGGABLE DATABASE pdb3 FROM pdb1
  FILE_NAME_CONVERT =
    ('/u01/oradata/orcl/pdb1/', '/u01/oradata/orcl/pdb3/');

-- Hot Clone (PDB1 không cần close — 12.2+)
ALTER PLUGGABLE DATABASE pdb1 ENABLE RECOVERY;
CREATE PLUGGABLE DATABASE pdb3 FROM pdb1;

Unplug / Plug PDB (di chuyển giữa CDB):

-- Bước 1: Close PDB
ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;

-- Bước 2: Unplug (tạo file XML manifest)
ALTER PLUGGABLE DATABASE pdb1
  UNPLUG INTO '/tmp/pdb1.xml';

-- Bước 3: Drop (sau khi unplug, data files vẫn còn)
DROP PLUGGABLE DATABASE pdb1 KEEP DATAFILES;

-- Bước 4: Plug vào CDB khác
CREATE PLUGGABLE DATABASE pdb1
  USING '/tmp/pdb1.xml'
  COPY FILE_NAME_CONVERT =
    ('/u01/oradata/cdb1/', '/u01/oradata/cdb2/');

ALTER PLUGGABLE DATABASE pdb1 OPEN;

Quản lý PDB — các thao tác quan trọng (Module 14):

-- Thay đổi init parameter cho PDB cụ thể
ALTER SESSION SET container = pdb1;
ALTER SYSTEM SET open_cursors = 300 SCOPE=BOTH;

-- Cấu hình hostname và port riêng cho PDB
ALTER PLUGGABLE DATABASE pdb1
  SET listener_hosts = 'pdb1.example.com:1522';

-- Drop PDB (xóa hoàn toàn)
ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;
DROP PLUGGABLE DATABASE pdb1 INCLUDING DATAFILES;
1. Khác nhau giữa DROP PDB KEEP DATAFILES và INCLUDING DATAFILES?+
KEEP DATAFILES: xóa PDB khỏi CDB dictionary nhưng giữ data files trên đĩa — dùng khi unplug để plug vào CDB khác. INCLUDING DATAFILES: xóa hoàn toàn PDB và tất cả data files — không thể khôi phục. Cẩn thận với INCLUDING DATAFILES!
2. Hot Clone khác Cold Clone thế nào?+
Cold Clone: PDB nguồn phải ở READ ONLY hoặc CLOSE trong khi clone. Hot Clone (ENABLE RECOVERY): PDB nguồn vẫn READ WRITE, user vẫn làm việc bình thường — Oracle dùng online redo để đảm bảo consistency. Hot Clone cần PDB nguồn ở chế độ ENABLE RECOVERY.
3. Tại sao Unplug/Plug PDB quan trọng trong cloud?+
Cho phép di chuyển workload giữa các CDB (host) với downtime rất thấp. Trong cloud: dễ dàng upgrade database version bằng cách plug PDB vào CDB mới version cao hơn. Cũng hỗ trợ near-zero downtime PDB relocation (12.2+) không cần close PDB.
-- Lab hoàn chỉnh: Tạo PDB, verify, drop

-- 1. Tạo PDB mới từ seed
SQL> CREATE PLUGGABLE DATABASE testpdb
     ADMIN USER pdbadmin IDENTIFIED BY Oracle_4U
     FILE_NAME_CONVERT =
       ('/pdbseed/', '/testpdb/');

-- 2. Mở và verify
SQL> ALTER PLUGGABLE DATABASE testpdb OPEN;
SQL> SELECT name, open_mode FROM v$pdbs;

-- 3. Kết nối vào PDB
SQL> ALTER SESSION SET container = testpdb;
SQL> SHOW con_name;

-- 4. Cleanup
SQL> ALTER SESSION SET container = CDB$ROOT;
SQL> ALTER PLUGGABLE DATABASE testpdb CLOSE IMMEDIATE;
SQL> DROP PLUGGABLE DATABASE testpdb INCLUDING DATAFILES;
MOD 15–18

Database Storage Management

Storage Overview, Tablespaces, Space Usage, Undo Data

Trung cấpStorage

Quản lý lưu trữ vật lý và logic của Oracle Database — từ Tablespace, Data files đến Undo management. Đây là kỹ năng thiết yếu để tránh lỗi "ORA-01653: unable to extend" và quản lý space hiệu quả.

Cấu trúc lưu trữ Logic → Physical:

Database
  └── Tablespace (logical)
        └── Segment (table, index, undo, temp)
              └── Extent (nhóm blocks liên tiếp)
                    └── Block (đơn vị nhỏ nhất — default 8KB)

Tạo và quản lý Tablespace (Module 16):

-- Tạo tablespace mới
CREATE TABLESPACE app_data
  DATAFILE '/u01/oradata/orcl/app_data01.dbf'
  SIZE 500M
  AUTOEXTEND ON NEXT 100M MAXSIZE 10G
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE
  SEGMENT SPACE MANAGEMENT AUTO;

-- Thêm datafile vào tablespace (mở rộng)
ALTER TABLESPACE app_data
  ADD DATAFILE '/u01/oradata/orcl/app_data02.dbf'
  SIZE 500M AUTOEXTEND ON;

-- Xem thông tin tablespace
SELECT tablespace_name, status, block_size,
       extent_management, allocation_type
FROM dba_tablespaces;

-- Xem usage của tablespace
SELECT tablespace_name,
       ROUND(used_space * 8192 / 1024 / 1024, 1) used_mb,
       ROUND(tablespace_size * 8192 / 1024 / 1024, 1) total_mb,
       ROUND(used_percent, 1) pct_used
FROM dba_tablespace_usage_metrics
ORDER BY pct_used DESC;
TABLESPACE_NAME USED_MB TOTAL_MB PCT_USED ---------------- -------- --------- -------- SYSTEM 650.2 700.0 92.9 APP_DATA 123.5 500.0 24.7 USERS 45.2 200.0 22.6

Table Compression (Module 17):

-- Basic compression (chỉ direct-path insert)
CREATE TABLE sales_arch (...)
  COMPRESS;

-- Advanced Row Compression (cho mọi DML)
CREATE TABLE sales (...)
  ROW STORE COMPRESS ADVANCED;

-- Shrink segment (lấy lại space)
ALTER TABLE sales ENABLE ROW MOVEMENT;
ALTER TABLE sales SHRINK SPACE;
ALTER TABLE sales SHRINK SPACE COMPACT; -- chỉ compact, không adjust HWM

Undo Management (Module 18):

-- Undo giữ thông tin cũ để:
-- 1. Rollback transaction
-- 2. Read consistency (queries thấy snapshot nhất quán)
-- 3. Flashback queries

-- Cấu hình undo retention
ALTER SYSTEM SET undo_retention = 900; -- 900 giây (15 phút)

-- Guarantee retention (không cho ghi đè undo cũ)
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;

-- Monitor undo
SELECT tablespace_name, status, sum(bytes)/1024/1024 mb
FROM dba_undo_extents
GROUP BY tablespace_name, status;

-- LOCAL UNDO (19c) — mỗi PDB có undo tablespace riêng
ALTER DATABASE LOCAL UNDO ON;
1. Lỗi ORA-01654 "unable to extend index" xảy ra do đâu?+
Tablespace không còn dung lượng để cấp thêm extent cho index. Giải quyết: (1) Thêm datafile: ALTER TABLESPACE ... ADD DATAFILE, (2) Bật autoextend cho datafile hiện có, (3) Xóa/compress dữ liệu cũ, (4) Di chuyển index sang tablespace khác.
2. UNDO_RETENTION và RETENTION GUARANTEE khác nhau?+
UNDO_RETENTION: thời gian Oracle cố gắng giữ undo data (mặc định 900s) — nhưng nếu undo tablespace đầy, Oracle vẫn có thể ghi đè undo cũ. RETENTION GUARANTEE: bắt buộc không ghi đè undo trong thời gian retention — transaction mới có thể fail nếu không còn space, nhưng Flashback queries được đảm bảo.
3. LOCAL UNDO trong CDB/PDB mang lại lợi ích gì?+
Mỗi PDB có undo tablespace riêng — dễ quản lý, isolate undo của từng PDB. Cho phép unplug/plug PDB sang CDB khác dễ dàng hơn. Với SHARED UNDO (trước 19c), tất cả PDB dùng chung undo tablespace của CDB root — khó quản lý và cô lập.
-- Lab: Tạo tablespace, monitor, và mở rộng

-- 1. Tạo tablespace
CREATE TABLESPACE labdata
  DATAFILE '/u01/oradata/orcl/labdata01.dbf'
  SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2G;

-- 2. Tạo table trong tablespace đó
CREATE TABLE test_tab (id NUMBER, data VARCHAR2(100))
  TABLESPACE labdata;

-- 3. Xem usage
SELECT file_name, bytes/1024/1024 mb, autoextensible, maxbytes/1024/1024 maxmb
FROM dba_data_files
WHERE tablespace_name = 'LABDATA';

-- 4. Cleanup
DROP TABLE test_tab;
DROP TABLESPACE labdata INCLUDING CONTENTS AND DATAFILES;
FILE_NAME MB AUT MAXMB ---------------------------------------- --- ---- ----- /u01/oradata/orcl/labdata01.dbf 100 YES 2048
MOD 19–22

Security: Users, Privileges, Profiles & Auditing

User Management, Roles, Resource Limits, Unified Auditing

Trung cấpSecurity

Bảo mật database: tạo và quản lý users, phân quyền chính xác theo nguyên tắc least privilege, giới hạn tài nguyên, và audit các hoạt động nhạy cảm để tuân thủ compliance.

Tạo User trong CDB/PDB (Module 19):

-- Common User (tồn tại trong toàn CDB + tất cả PDB)
-- Tên phải bắt đầu bằng C## hoặc c##
SQL> CREATE USER c##dba_common IDENTIFIED BY Oracle_4U
     CONTAINER=ALL;

-- Local User (chỉ trong PDB hiện tại)
SQL> ALTER SESSION SET container = pdb1;
SQL> CREATE USER appuser IDENTIFIED BY App_Pass_4U
     DEFAULT TABLESPACE app_data
     TEMPORARY TABLESPACE temp
     QUOTA 100M ON app_data;

-- Schema-only account (không thể login — 18c+)
SQL> CREATE USER schema_owner NO AUTHENTICATION;

Privileges và Roles (Module 20):

-- Grant system privilege
GRANT CREATE SESSION, CREATE TABLE TO appuser;

-- Grant object privilege
GRANT SELECT, INSERT ON hr.employees TO appuser;
GRANT SELECT ON hr.employees TO appuser WITH GRANT OPTION;

-- Tạo và quản lý role
CREATE ROLE app_developer;
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO app_developer;
GRANT app_developer TO appuser;

-- Revoke
REVOKE CREATE TABLE FROM appuser;
REVOKE app_developer FROM appuser;

Profiles — giới hạn tài nguyên (Module 21):

CREATE PROFILE app_profile LIMIT
  SESSIONS_PER_USER          3        -- Tối đa 3 session đồng thời
  CPU_PER_SESSION            UNLIMITED
  IDLE_TIME                  30       -- Timeout sau 30 phút idle
  CONNECT_TIME               480      -- Tối đa 8 giờ kết nối
  FAILED_LOGIN_ATTEMPTS      5        -- Khóa sau 5 lần sai pass
  PASSWORD_LOCK_TIME         1/24     -- Khóa 1 giờ
  PASSWORD_LIFE_TIME         90       -- Hết hạn sau 90 ngày
  PASSWORD_REUSE_TIME        365      -- Không tái sử dụng trong 1 năm
  PASSWORD_VERIFY_FUNCTION   ora12c_strong_verify_function;

ALTER USER appuser PROFILE app_profile;

Unified Auditing (Module 22):

-- Tạo audit policy
CREATE AUDIT POLICY data_access_policy
  ACTIONS SELECT, INSERT, UPDATE, DELETE
  ON hr.employees
  WHEN 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR'''
  EVALUATE PER SESSION;

-- Kích hoạt policy
AUDIT POLICY data_access_policy;

-- Xem audit trail
SELECT dbusername, action_name, object_name, event_timestamp
FROM unified_audit_trail
WHERE unified_audit_policies = 'DATA_ACCESS_POLICY'
ORDER BY event_timestamp DESC;

-- Purge audit trail
EXEC dbms_audit_mgmt.clean_audit_trail(
  audit_trail_type => dbms_audit_mgmt.audit_trail_unified,
  use_last_arch_timestamp => false);
1. Common User và Local User khác nhau thế nào trong CDB?+
Common User: tên bắt đầu C##, tồn tại trong CDB$ROOT và tất cả PDB, quản lý tập trung — dùng cho DBA quản trị. Local User: chỉ tồn tại trong PDB cụ thể, tên tự do — dùng cho ứng dụng thông thường. Không thể tạo Local User trong CDB$ROOT.
2. Tại sao dùng Role thay vì grant trực tiếp system/object privilege?+
Role giúp quản lý tập trung — thay đổi role một lần, tất cả user được gán role tự động nhận quyền mới. Dễ revoke (chỉ cần revoke role, không phải từng privilege). Tuân thủ principle of least privilege và dễ audit. Oracle cũng cung cấp built-in roles (DBA, CONNECT, RESOURCE) tiện lợi.
3. Unified Auditing khác Traditional Auditing ở điểm gì?+
Unified Auditing (12c+): tất cả audit records lưu vào một bảng duy nhất (UNIFIED_AUDIT_TRAIL) bao gồm DB audit, OS audit, FGA, RMAN, Data Pump. Dễ query và manage. Traditional: lưu vào nhiều nơi khác nhau (AUD$, OS files, XML files) — phức tạp hơn, deprecated từ 21c.
4. Schema-only account (NO AUTHENTICATION) dùng để làm gì?+
Tạo schema chỉ để sở hữu objects (tables, procedures) mà không có khả năng login trực tiếp — bảo mật tốt hơn. Application account riêng được grant quyền cần thiết trên objects của schema_owner. Ngăn chặn tấn công qua account schema trực tiếp.
-- Lab: Thiết lập security đầy đủ cho một ứng dụng

-- 1. Tạo profile với password policy
CREATE PROFILE app_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LOCK_TIME    1/24
  PASSWORD_LIFE_TIME    90
  IDLE_TIME             30;

-- 2. Tạo schema owner (no login)
CREATE USER myapp_schema NO AUTHENTICATION;

-- 3. Tạo application user
CREATE USER myapp_user IDENTIFIED BY App_Secure_4U
  PROFILE app_profile
  DEFAULT TABLESPACE users
  QUOTA 50M ON users;

-- 4. Grant quyền tối thiểu
GRANT CREATE SESSION TO myapp_user;
GRANT SELECT, INSERT ON myapp_schema.orders TO myapp_user;

-- 5. Tạo và enable audit policy
CREATE AUDIT POLICY myapp_audit
  ACTIONS DELETE ON myapp_schema.orders;
AUDIT POLICY myapp_audit;
MOD 23–26

Loading and Transporting Data

SQL*Loader, Data Pump Export/Import, External Tables

Nâng caoData Movement

Nắm vững ba công cụ chuyển dữ liệu Oracle: SQL*Loader (nạp từ flat file), Data Pump (export/import giữa databases), và External Tables (đọc flat files như tables).

SQL*Loader — Nạp dữ liệu từ flat file (Module 24):

-- Control file: employees.ctl
LOAD DATA
INFILE '/data/employees.csv'
BADFILE '/data/employees.bad'
DISCARDFILE '/data/employees.dsc'
APPEND INTO TABLE employees
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(emp_id, first_name, last_name, salary, hire_date DATE "YYYY-MM-DD")

-- Chạy SQL*Loader
$ sqlldr userid=hr/password@pdb1 control=employees.ctl log=employees.log

-- Express Mode (không cần control file)
$ sqlldr hr/password@pdb1 TABLE=employees
    DATA=/data/employees.csv
    FIELDS=(emp_id, first_name, last_name, salary, hire_date)
SQL*Loader: Release 19.0.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. Commit point reached - logical record count 64 Commit point reached - logical record count 128 Table EMPLOYEES: 500 Rows successfully loaded. 0 Rows not loaded due to data errors. Check the log file: employees.log

Data Pump Export/Import (Module 25):

-- Export toàn bộ database (Full)
$ expdp system/oracle@pdb1 \
  FULL=Y \
  DIRECTORY=DATA_PUMP_DIR \
  DUMPFILE=full_export_%U.dmp \
  LOGFILE=full_export.log \
  PARALLEL=4

-- Export schema cụ thể
$ expdp hr/hr@pdb1 \
  SCHEMAS=HR \
  DIRECTORY=DATA_PUMP_DIR \
  DUMPFILE=hr_schema.dmp \
  LOGFILE=hr_export.log

-- Import vào PDB khác
$ impdp system/oracle@pdb2 \
  DIRECTORY=DATA_PUMP_DIR \
  DUMPFILE=hr_schema.dmp \
  REMAP_SCHEMA=HR:HR_NEW \
  REMAP_TABLESPACE=USERS:APP_DATA \
  LOGFILE=hr_import.log

-- Kiểm tra thư mục Data Pump
SELECT directory_name, directory_path
FROM dba_directories
WHERE directory_name = 'DATA_PUMP_DIR';

External Tables (Module 26):

-- Tạo directory object
CREATE DIRECTORY ext_data AS '/data/external';
GRANT READ, WRITE ON DIRECTORY ext_data TO hr;

-- Tạo external table (chỉ đọc flat file, không import)
CREATE TABLE ext_employees (
  emp_id    NUMBER,
  full_name VARCHAR2(100),
  salary    NUMBER
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY ext_data
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY ','
  )
  LOCATION ('employees.csv')
)
REJECT LIMIT UNLIMITED;

-- Query external table như table thông thường
SELECT * FROM ext_employees WHERE salary > 50000;
1. SQL*Loader và External Table — khi nào dùng cái nào?+
SQL*Loader: nạp dữ liệu vào Oracle tables (one-time hoặc periodic batch load), cần import vào database. External Table: đọc flat file trực tiếp như một Oracle table mà không copy data — dùng khi file được update thường xuyên, cần query nhưng không cần lưu vào DB, hoặc làm staging cho ETL.
2. REMAP_SCHEMA và REMAP_TABLESPACE trong Data Pump dùng để làm gì?+
REMAP_SCHEMA=HR:HR_NEW: import tất cả objects từ schema HR (trong dump) vào schema HR_NEW (trong target DB). REMAP_TABLESPACE=USERS:APP_DATA: objects ban đầu ở tablespace USERS sẽ được tạo trong APP_DATA ở target. Rất hữu ích khi môi trường target có cấu trúc khác nguồn.
3. Direct-path load trong SQL*Loader là gì và tại sao nhanh hơn?+
Direct-path load: ghi trực tiếp formatted blocks vào data files, bypass SQL engine, buffer cache, và undo generation. Nhanh hơn conventional load (qua SQL engine) nhiều lần, nhưng không generate undo, không thể rollback partial load, disable triggers, và table bị locked toàn bộ trong khi load.
-- Lab: Export/Import schema với Data Pump

-- 1. Tạo directory (nếu chưa có)
$ mkdir -p /u01/datapump
SQL> CREATE DIRECTORY dpump_dir AS '/u01/datapump';
SQL> GRANT READ, WRITE ON DIRECTORY dpump_dir TO system;

-- 2. Export HR schema
$ expdp system/oracle@pdb1 schemas=HR \
  directory=DPUMP_DIR \
  dumpfile=hr_bak.dmp \
  logfile=hr_exp.log

-- 3. Import vào schema mới (HR_TEST)
$ impdp system/oracle@pdb1 \
  directory=DPUMP_DIR \
  dumpfile=hr_bak.dmp \
  remap_schema=HR:HR_TEST \
  logfile=hr_imp.log

-- 4. Verify
SQL> SELECT table_name FROM dba_tables
     WHERE owner = 'HR_TEST';
MOD 27–28

Automated Maintenance Tasks

Scheduler, Maintenance Windows, AWR, Auto Stats

Nâng caoAutomation

Oracle tự động hóa các tác vụ bảo trì định kỳ (thu thập statistics, rebuild index, purge audit trail) qua Maintenance Windows. DBA cần hiểu cách cấu hình và kiểm soát chúng.

Predefined Automated Tasks:

Task NameMô tảWindow mặc định
auto_optimizer_stats_collectionThu thập optimizer statisticsHàng đêm + cuối tuần
auto_segment_advisorPhân tích segment có thể shrinkHàng đêm
auto_sql_tuning_advisorPhân tích SQL chạy chậmHàng đêm
-- Xem predefined maintenance tasks
SELECT client_name, status, attributes
FROM dba_autotask_client;

-- Enable/Disable task
EXEC dbms_auto_task_admin.disable(
  client_name => 'auto optimizer stats collection',
  operation   => NULL,
  window_name => NULL);

-- Xem maintenance windows
SELECT window_name, repeat_interval, duration, enabled
FROM dba_scheduler_windows;

Tùy chỉnh Maintenance Window:

-- Thay đổi giờ bắt đầu WEEKNIGHT_WINDOW (ví dụ: 10PM thay 10PM)
EXEC dbms_scheduler.set_attribute(
  name      => 'WEEKNIGHT_WINDOW',
  attribute => 'REPEAT_INTERVAL',
  value     => 'freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0;bysecond=0');

-- Tạo Custom Maintenance Window
EXEC dbms_scheduler.create_window(
  window_name     => 'MY_MAINT_WINDOW',
  resource_plan   => 'DEFAULT_MAINTENANCE_PLAN',
  start_date      => systimestamp,
  repeat_interval => 'freq=weekly;byday=SAT;byhour=1;byminute=0',
  duration        => interval '4' hour,
  comments        => 'Custom Saturday 1AM maintenance');
1. Tại sao auto optimizer stats collection quan trọng?+
Oracle CBO (Cost-Based Optimizer) dựa vào statistics để chọn execution plan tối ưu. Statistics lỗi thời dẫn đến bad execution plans, query chạy chậm. Auto stats collection đảm bảo statistics luôn cập nhật sau khi dữ liệu thay đổi nhiều, giảm thiểu cần DBA can thiệp thủ công.
2. Khi nào nên disable auto maintenance tasks?+
Khi maintenance window trùng giờ cao điểm của ứng dụng, hay khi DBA muốn tự kiểm soát thời điểm collect stats (ví dụ: production database cần thu thập stats vào giờ cụ thể). Không nên disable hoàn toàn lâu dài vì statistics sẽ lỗi thời ảnh hưởng performance.
-- Xem trạng thái các automated tasks
SELECT client_name, status
FROM dba_autotask_client;

-- Chạy thủ công stats collection cho một schema
EXEC dbms_stats.gather_schema_stats(
  ownname => 'HR',
  estimate_percent => dbms_stats.auto_sample_size,
  method_opt => 'FOR ALL COLUMNS SIZE AUTO',
  degree => 4);
MOD 29–31

Database Monitoring & Performance Tuning

AWR, ADDM, Alert Metrics, Wait Events, DB Processes

Nâng caoPerformance

Proactive monitoring và reactive troubleshoot performance Oracle Database — sử dụng AWR snapshots, ADDM recommendations, alert metrics, và phân tích wait events để xác định và giải quyết bottleneck.

AWR (Automatic Workload Repository):

-- AWR tự động chụp snapshot mỗi 60 phút
-- Lưu trữ 8 ngày mặc định

-- Xem AWR snapshots
SELECT snap_id, begin_interval_time, end_interval_time
FROM dba_hist_snapshot
ORDER BY snap_id DESC
FETCH FIRST 10 ROWS ONLY;

-- Chụp snapshot thủ công
EXEC dbms_workload_repository.create_snapshot();

-- Thay đổi AWR settings
EXEC dbms_workload_repository.modify_snapshot_settings(
  retention => 30*24*60,  -- Giữ 30 ngày (phút)
  interval  => 30);       -- Snapshot mỗi 30 phút

-- Tạo AWR report (HTML)
$ sqlplus / as sysdba
@?/rdbms/admin/awrrpt.sql

ADDM (Automatic Database Diagnostic Monitor):

-- Xem ADDM findings gần nhất
SELECT task_name, status, advisor_name, created
FROM dba_advisor_tasks
WHERE advisor_name = 'ADDM'
ORDER BY created DESC
FETCH FIRST 5 ROWS ONLY;

-- Xem recommendations từ ADDM task
SELECT r.message, r.benefit, f.message finding
FROM dba_advisor_recommendations r
JOIN dba_advisor_findings f
  ON r.task_id = f.task_id
  AND r.finding_id = f.finding_id
ORDER BY r.benefit DESC;

Wait Events — Tìm bottleneck (Module 30):

-- Top wait events hiện tại
SELECT event, total_waits, time_waited,
       ROUND(time_waited/total_waits/100, 2) avg_wait_ms
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC
FETCH FIRST 10 ROWS ONLY;

-- Session đang bị chặn
SELECT s.sid, s.username, s.event, s.seconds_in_wait
FROM v$session s
WHERE s.wait_class != 'Idle'
  AND s.status = 'ACTIVE'
ORDER BY s.seconds_in_wait DESC;

Background Processes Oracle (Module 31):

ProcessTên đầy đủChức năng
DBWnDatabase WriterGhi dirty blocks từ buffer cache xuống data files
LGWRLog WriterGhi redo entries từ log buffer xuống redo log files
CKPTCheckpointCập nhật header, kích hoạt DBWn flush, giảm recovery time
SMONSystem MonitorInstance recovery khi startup, dọn temp segments
PMONProcess MonitorCleanup khi user process chết, release resources
ARCnArchiverCopy filled redo logs sang archive log (nếu ARCHIVELOG mode)
LREGListener RegĐăng ký instance với listener (dynamic registration)
-- Xem các background processes đang chạy
SELECT pname, description, con_id
FROM v$bgprocess
WHERE paddr != '00'
ORDER BY pname;
1. Wait event "db file sequential read" cho thấy vấn đề gì?+
Single-block I/O — thường do index scans. Nếu time_waited cao: (1) Thiếu index hoặc index không được dùng, (2) Chỉ số selectivity index kém, (3) Đĩa chậm (I/O subsystem bottleneck), (4) Buffer cache quá nhỏ (nhiều physical reads). Cần xem execution plan của SQL liên quan.
2. Tại sao LGWR quan trọng hơn DBWn cho performance?+
COMMIT không thể complete cho đến khi LGWR ghi redo entries ra đĩa (commit durability). LGWR là bottleneck trực tiếp cho transaction throughput. DBWn ghi async — buffer có thể dirty một thời gian mà không ảnh hưởng COMMIT. "log file sync" wait event = client chờ LGWR.
3. Checkpoint (CKPT) ảnh hưởng recovery time thế nào?+
Checkpoint ghi SCN vào control file và data file headers, kích hoạt DBWn flush dirty blocks. Khi crash recovery, Oracle chỉ cần replay redo logs từ thời điểm checkpoint gần nhất. Checkpoint càng thường xuyên → recovery time ngắn hơn, nhưng I/O overhead tăng. FAST_START_MTTR_TARGET kiểm soát tần suất checkpoint.
-- Lab: Phân tích performance với AWR và wait events

-- 1. Chụp AWR snapshot trước workload
SQL> EXEC dbms_workload_repository.create_snapshot();

-- 2. Chạy workload (ví dụ query phức tạp)
SQL> SELECT /*+ FULL(e) */ count(*) FROM hr.employees e, hr.departments d
     WHERE e.department_id = d.department_id;

-- 3. Chụp snapshot sau workload
SQL> EXEC dbms_workload_repository.create_snapshot();

-- 4. Xem top wait events giữa 2 snapshots
SQL> SELECT event_name, total_waits_fg, time_waited_fg
     FROM dba_hist_system_event
     WHERE snap_id BETWEEN :begin_snap AND :end_snap
       AND wait_class# != 6  -- Exclude Idle
     ORDER BY time_waited_fg DESC
     FETCH FIRST 10 ROWS ONLY;
MOD 32–33

Managing Memory & SQL Tuning

SGA, PGA, AMM, ASSM, SQL Tuning Advisor, Optimizer

Nâng caoTuning

Cấu hình memory tối ưu cho Oracle Instance và phân tích, tối ưu hóa SQL queries — hai kỹ năng nâng cao nhất của DBA, trực tiếp ảnh hưởng tới performance ứng dụng.

Các thành phần Memory Oracle (Module 32):

Thành phầnMô tảKey Parameter
Buffer CacheCache data blocks từ data filesdb_cache_size
Shared PoolLibrary cache (SQL plans) + Dictionary cacheshared_pool_size
Redo Log BufferBuffer ghi redo trước khi flush đĩalog_buffer
Large PoolRMAN, Parallel Query, Shared Server UGAlarge_pool_size
Java PoolJava class definitions trong JVM Oraclejava_pool_size
PGARiêng từng server process: sort, hash join areapga_aggregate_target

Automatic Memory Management (AMM) — Đơn giản nhất:

-- AMM: Oracle tự quản lý SGA + PGA
ALTER SYSTEM SET memory_target = 4G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target = 6G SCOPE=SPFILE;
-- Khi dùng AMM: không set SGA_TARGET hay PGA_AGGREGATE_TARGET

-- Xem memory usage hiện tại
SELECT component, current_size/1024/1024 current_mb,
       min_size/1024/1024 min_mb, max_size/1024/1024 max_mb
FROM v$memory_dynamic_components
WHERE current_size > 0;
COMPONENT CURRENT_MB MIN_MB MAX_MB ---------------------------- ---------- ------ ------ shared pool 400.0 300.0 800.0 large pool 16.0 16.0 64.0 java pool 16.0 16.0 128.0 buffer cache 2048.0 1024.0 4096.0 PGA Target 1024.0 256.0 2048.0

SQL Tuning Advisor (Module 33):

-- Chạy SQL Tuning Advisor cho SQL_ID cụ thể
DECLARE
  l_task_name VARCHAR2(30);
BEGIN
  l_task_name := dbms_sqltune.create_tuning_task(
    sql_id      => 'abc123xyz',
    scope       => dbms_sqltune.scope_comprehensive,
    time_limit  => 300,  -- 5 phút
    task_name   => 'tune_emp_query'
  );
  dbms_sqltune.execute_tuning_task(task_name => l_task_name);
END;
/

-- Xem recommendations
SELECT dbms_sqltune.report_tuning_task('tune_emp_query')
FROM dual;

Optimizer Statistics — Cách thu thập hiệu quả:

-- Gather stats cho table cụ thể
EXEC dbms_stats.gather_table_stats(
  ownname     => 'HR',
  tabname     => 'EMPLOYEES',
  cascade     => true,       -- Bao gồm indexes
  estimate_percent => dbms_stats.auto_sample_size,
  method_opt  => 'FOR ALL COLUMNS SIZE AUTO');

-- Xem statistics của table
SELECT table_name, num_rows, blocks, avg_row_len,
       last_analyzed
FROM dba_tables
WHERE owner = 'HR' AND table_name = 'EMPLOYEES';

-- Xem execution plan
EXPLAIN PLAN FOR
SELECT * FROM hr.employees WHERE department_id = 60;

SELECT * FROM table(dbms_xplan.display());
Plan hash value: 1833546154 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 5 | 2 | | 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 5 | 2 | |* 2 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 5 | 1 | --------------------------------------------------------------------------- Predicate Information: 2 - access("DEPARTMENT_ID"=60)
1. AMM vs ASMM — khi nào dùng cái nào?+
AMM (Automatic Memory Management): MEMORY_TARGET — Oracle tự phân chia SGA + PGA, đơn giản nhất, nhưng không hỗ trợ trên Linux với HugePages. ASMM (Automatic Shared Memory Management): SGA_TARGET — tự phân chia các SGA components nhưng PGA cần set riêng (PGA_AGGREGATE_TARGET). Trên Linux production với HugePages: dùng ASMM hoặc manual, không dùng AMM.
2. Execution plan "FULL TABLE SCAN" có phải luôn là xấu?+
Không. Full Table Scan tốt khi: (1) Query trả về phần lớn rows của table (>20-30%), (2) Table nhỏ, fit vào buffer cache, (3) Direct-path reads cho analytics. Bad khi: table lớn, query chỉ cần ít rows nhưng thiếu index. Optimizer chọn FTS dựa vào statistics — nếu statistics sai, plan có thể sai.
3. SQL Plan Directives là gì trong 19c?+
SQL Plan Directives: hints tự động Oracle tạo ra khi phát hiện optimizer cardinality estimates sai so với thực tế (qua Adaptive Query Optimization). Lưu trong SYSAUX, tự động apply cho SQL tương tự trong tương lai, thúc đẩy dynamic statistics collection. Giúp tránh bad plans do stale statistics.
4. Shared Pool "ORA-04031: unable to allocate X bytes" nghĩa là gì?+
Shared Pool đầy — không đủ contiguous free memory. Nguyên nhân: (1) SHARED_POOL_SIZE quá nhỏ, (2) Quá nhiều SQL hard parsing (non-reusable SQL với literals), (3) Memory fragmentation. Giải quyết: tăng shared_pool_size, dùng bind variables để giảm hard parse, flush shared pool (ALTER SYSTEM FLUSH SHARED_POOL — chỉ khi thực sự cần).
5. Phân biệt SQL Tuning Advisor và SQL Access Advisor?+
SQL Tuning Advisor: phân tích từng SQL statement, đề xuất: gather missing stats, tạo SQL Profile, tái cấu trúc SQL, tạo index mới. SQL Access Advisor: phân tích workload, đề xuất tập hợp index, materialized views, partitioning strategies để tối ưu tổng thể. Tuning Advisor cho từng query, Access Advisor cho toàn bộ workload.
Mod 1–2Architecture & Tools
Mod 3–4Tạo Database
Mod 5–6Instance Management
Mod 7–11Oracle Net & Listener
Mod 12–14CDB/PDB Lifecycle
Mod 15–18Storage & Undo
Mod 19–22Security & Auditing
Mod 23–26Data Loading
Mod 27–28Auto Maintenance
Mod 29–31Monitoring & Processes
Mod 32–33Memory & SQL Tuning
🎓 Lộ trình học tập khuyến nghị: Mod 1→2→5→6 (nền tảng) → Mod 3→4 (tạo DB) → Mod 7→8→9 (network) → Mod 15→16→18 (storage) → Mod 19→20→21→22 (security) → Mod 12→13→14 (PDB) → Mod 23→24→25 (data) → Mod 29→30→31→32→33 (performance).

Scenario: Thiết lập môi trường Oracle 19c hoàn chỉnh từ đầu

========================================================
BƯỚC 1: Tạo CDB với DBCA silent mode
========================================================
$ dbca -silent -createDatabase \
  -templateName General_Purpose.dbc \
  -gdbName prodcdb \
  -sid prodcdb \
  -createAsContainerDatabase true \
  -numberOfPDBs 1 -pdbName prod \
  -sysPassword Oracle_4U \
  -characterSet AL32UTF8 \
  -totalMemory 4096

========================================================
BƯỚC 2: Cấu hình PDB tự động mở
========================================================
SQL> ALTER PLUGGABLE DATABASE prod OPEN;
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;

========================================================
BƯỚC 3: Tạo tablespace và user
========================================================
SQL> ALTER SESSION SET container = prod;
SQL> CREATE TABLESPACE appdata
     DATAFILE '/u01/oradata/prodcdb/prod/appdata01.dbf'
     SIZE 1G AUTOEXTEND ON;

SQL> CREATE PROFILE appprofile LIMIT
     FAILED_LOGIN_ATTEMPTS 5
     PASSWORD_LIFE_TIME 90
     IDLE_TIME 30;

SQL> CREATE USER appowner NO AUTHENTICATION;
SQL> CREATE USER appuser IDENTIFIED BY SecurePass_4U
     DEFAULT TABLESPACE appdata
     QUOTA 500M ON appdata
     PROFILE appprofile;

========================================================
BƯỚC 4: Grant quyền
========================================================
SQL> GRANT CREATE SESSION TO appuser;
SQL> GRANT CREATE TABLE, CREATE INDEX TO appowner;

========================================================
BƯỚC 5: Cấu hình Auditing
========================================================
SQL> CREATE AUDIT POLICY prod_dml
     ACTIONS INSERT, UPDATE, DELETE ON appowner.orders;
SQL> AUDIT POLICY prod_dml;

========================================================
BƯỚC 6: Verify toàn bộ setup
========================================================
SQL> SELECT con_id, name, open_mode FROM v$pdbs;
SQL> SELECT username, account_status, profile
     FROM dba_users
     WHERE username IN ('APPOWNER', 'APPUSER');
SQL> SELECT policy_name, enabled_option
     FROM audit_unified_enabled_policies;
CON_ID NAME OPEN_MODE ------- ------- ---------- 2 PDB$SEED READ ONLY 3 PROD READ WRITE USERNAME ACCOUNT_STATUS PROFILE ---------- --------------- ----------- APPOWNER OPEN DEFAULT APPUSER OPEN APPPROFILE POLICY_NAME ENABLED_OPTION ------------ ------------------- PROD_DML BY USER
🎓 Chúc mừng! Bạn đã hoàn thành Oracle 19c Administration Workshop. Bước tiếp theo: thực hành RMAN backup/recovery, Data Guard, và Performance Tuning nâng cao để chuẩn bị cho chứng chỉ Oracle Database Administrator Certified Professional (OCP).