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.
Introduction to Oracle Database
Kiến trúc tổng quan, Multitenant, Sharding
Mục đích của Module
Giải thích chi tiết
1. Ba thành phần chính của Oracle Database Server:
| Thành phần | Mô tả | Ví dụ |
|---|---|---|
| Memory Structures (SGA/PGA) | Vùng bộ nhớ dùng chung và riêng cho từng tiến trình | Buffer Cache, Shared Pool, Redo Log Buffer |
| Processes | Các tiến trình nền Oracle quản lý hoạt động DB | DBWn, LGWR, CKPT, SMON, PMON |
| Storage Structures | Tập tin vật lý trên đĩa lưu trữ dữ liệu | Data files, Redo log files, Control files |
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
┌─────────────────────────────────────────┐
│ 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.
Câu hỏi ôn tập
Tổng kết
Bài tập thực hành
Lab 1.1: Xem thông tin Instance và Database
-- 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;
-- Xem tên database
SELECT name, db_unique_name, cdb, con_id
FROM v$database;
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;
Accessing an Oracle Database
SQL*Plus, SQL Developer, DBCA, OEM
Mục đích của Module
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.
Giải thích chi tiết
| Công cụ | Loại | Dùng khi nào |
|---|---|---|
| SQL*Plus | CLI | Script automation, troubleshoot, khi không có GUI |
| SQL Developer | GUI (Java) | Phát triển, query, xem schema, PL/SQL debugging |
| DBCA | GUI Wizard | Tạo/xóa/cấu hình Database |
| OEM DB Express | Web (port 5500) | Monitor nhẹ, không cần agent |
| OEM Cloud Control | Web Enterprise | Quả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)
https://hostname:5500/em — truy cập từ browser, không cần cài thêm agent. Phù hợp monitor nhanh performance.Câu hỏi ôn tập
Tổng kết
Bài tập thực hành
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;
Creating an Oracle Database by Using DBCA
Database Configuration Assistant, Character Sets
Mục đích
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.
Giải thích chi tiết
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ểm | Dùng khi |
|---|---|---|
| AL32UTF8 | Unicode, hỗ trợ mọi ngôn ngữ | ✅ Mọi hệ thống mới — khuyến nghị |
| WE8ISO8859P1 | Latin-1, 1 byte/char | Legacy Western European |
| VN8VN3 | Tiếng Việt TCVN 3 | Legacy 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
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';
Câu hỏi ôn tập
Bài tập thực hành
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'
);
Creating an Oracle Database by Using SQL
CREATE DATABASE command, CDB creation
Mục đích
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ợ.
Giải thích chi tiết
Các bước tạo CDB thủ công:
- Tạo thư mục và file hệ thống (oradata, fast_recovery_area)
- Tạo file tham số (init.ora hoặc SPFILE)
- Start instance ở chế độ NOMOUNT
- Chạy lệnh CREATE DATABASE
- 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
Câu hỏi ôn tập
Bài tập thực hành
-- 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;
Starting Up and Shutting Down a Database Instance
STARTUP stages, SHUTDOWN modes, PDB management
Mục đích
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.
Giải thích chi tiế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àm | Dùng khi |
|---|---|---|
| NOMOUNT | Đọc param file, init SGA+processes | CREATE DATABASE, RESTORE CONTROLFILE |
| MOUNT | + Đọc control file | RECOVERY, đổi LOG_MODE, RENAME files |
| OPEN | + Mở data files, redo logs | Trạ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ệnh | Chờ transaction? | Checkpoint? | Recovery cần? |
|---|---|---|---|
| SHUTDOWN NORMAL | Có (vô tận) | Có | Không |
| SHUTDOWN TRANSACTIONAL | Chờ commit/rollback | Có | Không |
| SHUTDOWN IMMEDIATE | Rollback ngay | Có | Không |
| SHUTDOWN ABORT | Không | Không | Có (tự động) |
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;
Câu hỏi ôn tập
Bài tập thực hành
-- 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;
Managing Database Instances
Init parameters, ADR, Alert Log, Data Dictionary
Mục đích
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.
Giải thích chi tiết
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:
| Prefix | Phạm vi | Ví dụ |
|---|---|---|
| USER_ | Objects của user hiện tại | USER_TABLES, USER_INDEXES |
| ALL_ | Objects user có quyền truy cập | ALL_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;
Câu hỏi ôn tập
Bài tập thực hành
-- 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';
Oracle Net Services: Overview
Network architecture, Listener, Dedicated vs Shared
Mục đích
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.
Giải thích chi tiết
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 Server | Shared Server | |
|---|---|---|
| Server process | 1 server process / 1 client | N clients / M server processes |
| PGA | Riêng từng process (lớn hơn) | Trong SGA (UGA trong SGA) |
| Phù hợp | Batch jobs, long transactions | Nhiều kết nối idle (web apps) |
| Mặc định | ✅ Mặc định | Cầ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;
Câu hỏi ôn tập
Bài tập thực hành
-- Lab: Kiểm tra listener và kết nối network
$ lsnrctl status LISTENER
Configuring Naming Methods
Easy Connect, Local Naming (tnsnames.ora), Directory Naming
Mục đích
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).
Giải thích chi tiết
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
Thứ tự resolve tên (sqlnet.ora):
# /network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH = (EZCONNECT, TNSNAMES, LDAP)
Câu hỏi ôn tập
Bài tập thực hành
-- 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
Configuring and Administering the Listener
listener.ora, Dynamic/Static Registration, lsnrctl
Mục đích
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.
Giải thích chi tiết
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ý
Câu hỏi ôn tập
Bài tập thực hành
-- Restart listener và force registration
$ lsnrctl stop
$ lsnrctl start
$ sqlplus / as sysdba
SQL> ALTER SYSTEM REGISTER;
$ lsnrctl services
Shared Server & Connection Manager
Shared Server Architecture, CMAN Multiplexing & Access Control
Mục đích
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.
Giải thích chi tiết
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)
)
)
Câu hỏi ôn tập
Bài tập thực hành
-- Kiểm tra Dispatcher và Shared Server processes
SELECT name, status, messages, bytes
FROM v$dispatcher;
SELECT name, status, requests
FROM v$shared_server;
Creating and Managing PDBs
PDB từ Seed, Clone, Unplug/Plug, Proxy PDB, Quản lý PDB
Mục đích
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.
Giải thích chi tiết
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;
Câu hỏi ôn tập
Bài tập thực hành
-- 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;
Database Storage Management
Storage Overview, Tablespaces, Space Usage, Undo Data
Mục đích
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ả.
Giải thích chi tiết
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;
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;
Câu hỏi ôn tập
Bài tập thực hành
-- 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;
Security: Users, Privileges, Profiles & Auditing
User Management, Roles, Resource Limits, Unified Auditing
Mục đích
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.
Giải thích chi tiết
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);
Câu hỏi ôn tập
Bài tập thực hành
-- 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;
Loading and Transporting Data
SQL*Loader, Data Pump Export/Import, External Tables
Mục đích
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).
Giải thích chi tiết
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)
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;
Câu hỏi ôn tập
Bài tập thực hành
-- 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';
Automated Maintenance Tasks
Scheduler, Maintenance Windows, AWR, Auto Stats
Mục đích
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.
Giải thích chi tiết
Predefined Automated Tasks:
| Task Name | Mô tả | Window mặc định |
|---|---|---|
| auto_optimizer_stats_collection | Thu thập optimizer statistics | Hàng đêm + cuối tuần |
| auto_segment_advisor | Phân tích segment có thể shrink | Hàng đêm |
| auto_sql_tuning_advisor | Phân tích SQL chạy chậm | Hà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');
Câu hỏi ôn tập
Bài tập thực hành
-- 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);
Database Monitoring & Performance Tuning
AWR, ADDM, Alert Metrics, Wait Events, DB Processes
Mục đích
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.
Giải thích chi tiết
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):
| Process | Tên đầy đủ | Chức năng |
|---|---|---|
| DBWn | Database Writer | Ghi dirty blocks từ buffer cache xuống data files |
| LGWR | Log Writer | Ghi redo entries từ log buffer xuống redo log files |
| CKPT | Checkpoint | Cập nhật header, kích hoạt DBWn flush, giảm recovery time |
| SMON | System Monitor | Instance recovery khi startup, dọn temp segments |
| PMON | Process Monitor | Cleanup khi user process chết, release resources |
| ARCn | Archiver | Copy filled redo logs sang archive log (nếu ARCHIVELOG mode) |
| LREG | Listener 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;
Câu hỏi ôn tập
Bài tập thực hành
-- 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;
Managing Memory & SQL Tuning
SGA, PGA, AMM, ASSM, SQL Tuning Advisor, Optimizer
Mục đích
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.
Giải thích chi tiết
Các thành phần Memory Oracle (Module 32):
| Thành phần | Mô tả | Key Parameter |
|---|---|---|
| Buffer Cache | Cache data blocks từ data files | db_cache_size |
| Shared Pool | Library cache (SQL plans) + Dictionary cache | shared_pool_size |
| Redo Log Buffer | Buffer ghi redo trước khi flush đĩa | log_buffer |
| Large Pool | RMAN, Parallel Query, Shared Server UGA | large_pool_size |
| Java Pool | Java class definitions trong JVM Oracle | java_pool_size |
| PGA | Riêng từng server process: sort, hash join area | pga_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;
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());
Câu hỏi ôn tập
Tổng kết toàn khóa học
Bài tập tổng hợp cuối khóa
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;