Thứ Tư, 19 tháng 8, 2026

RUNBOOK TRIỂN KHAI MIGRATION ORACLE → POSTGRESQL

RUNBOOK TRIỂN KHAI MIGRATION ORACLE → POSTGRESQL   |   Low-downtime / one-way CDC

Chủ tài liệu

Trần Văn Bình

Phiên bản

1.0 — 20/07/2026

Trạng thái

DRAFT → REVIEW → APPROVED

Hệ thống

<TBD>

RTO/RPO

<TBD> / RPO mục tiêu 0

CAB/Cutover

<TBD yyyy-mm-dd hh:mm TZ>

MỤC TIÊU / GUARDRAIL

Tải nền nhất quán tại SCN S0 bằng Ora2Pg; GoldenGate chỉ bắt DML sau S0; đối soát rồi chuyển kết nối ứng dụng. Không coi việc trỏ lại Oracle là rollback hợp lệ sau khi PostgreSQL đã phát sinh ghi. Muốn rollback hậu cutover phải có đường đồng bộ ngược/dual-write đã diễn tập; nếu chưa có, điểm cam kết cuối là trước khi mở ghi PostgreSQL.

PHẠM VI, VAI TRÒ VÀ CỔNG KIỂM SOÁT

Pha

Công việc

Chủ trì

Đầu ra bắt buộc

Exit / Gate

P0

Khởi động & thiết kế

PM/Architect

Scope, inventory app, downtime, RTO/RPO, security, support matrix, RACI

G0: Charter + RACI + CAB duyệt

P1

Khảo sát nguồn

Oracle DBA/App

Assessment, dependency, data profile, SQL/PLSQL, workload baseline

G1: Không còn đối tượng chưa phân loại

P2

Dựng PostgreSQL

PG DBA/Infra

HA, backup/PITR, monitoring, security, capacity, extensions

G2: Restore/HA/failover thử đạt

P3

Chuyển đổi

DB Dev/App

Schema, data type, PL/pgSQL, SQL ứng dụng, driver/ORM

G3: Compile 100%; unit test critical 100%

P4

Tải nền

Migration DBA

Snapshot S0, COPY parallel, post-load index/FK/statistics/sequence

G4: Row/hash/control-total đạt

P5

Kiểm thử

QA/Business/SRE

Functional, reconciliation, performance, security, HA/DR, rollback rehearsal

G5: UAT + performance + rollback ký

P6

CDC & cutover

GG DBA/Change Mgr

Catch-up, write freeze, final reconcile, connection switch

G6: Go/No-Go; owner ký từng gate

P7

Hypercare/đóng

Ops/Owners

Theo dõi, backup, tuning, decommission sau retention

G7: Nghiệm thu + PIR + handover

KHẢO SÁT ORACLE — CHẠY READ-ONLY, LƯU SPOOL LÀM BẰNG CHỨNG 

Miền

Câu lệnh / nguồn

Bằng chứng và quyết định phải chốt

Nền tảng

select banner_full from v$version; select db_unique_name,open_mode,log_mode,force_logging,current_scn from v$database;
select parameter,value from nls_database_parameters where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET','NLS_LENGTH_SEMANTICS');

Version/edition/options; CDB/PDB/RAC/DG; charset/timezone; archive retention; size & growth 12 tháng

Dung lượng/khối lượng

select owner,segment_type,round(sum(bytes)/1024/1024/1024,2) gb,count(*) n from dba_segments where owner in (<SCHEMAS>) group by owner,segment_type;
select owner,table_name,num_rows,blocks,avg_row_len,last_analyzed from dba_tables where owner in (<SCHEMAS>);

Top tables/LOB/partitions; rows; daily DML/redo; cửa sổ batch; băng thông; ETA tải

Đối tượng/phụ thuộc

select owner,object_type,status,count(*) from dba_objects where owner in (<SCHEMAS>) group by owner,object_type,status;
select owner,name,type,referenced_owner,referenced_name,referenced_type from dba_dependencies where owner in (<SCHEMAS>);

TABLE/VIEW/MVIEW/SEQ/INDEX/TRIGGER/TYPE/SYNONYM/DBLINK/DIRECTORY/JOB/AQ; invalid & dependency graph

Khóa & CDC

select t.owner,t.table_name from dba_tables t where t.owner in (<SCHEMAS>) and not exists (select 1 from dba_constraints c where c.owner=t.owner and c.table_name=t.table_name and c.constraint_type='P');
select owner,table_name,column_name,data_type,data_length,data_precision,data_scale from dba_tab_columns where owner in (<SCHEMAS>);

PK/UK dùng định danh; keyless → thiết kế KEYCOLS/khóa; kiểu không hỗ trợ, LOB, LONG, XMLTYPE, UDT, Spatial

PL/SQL & tính năng Oracle

select owner,type,name,line,text from dba_source where owner in (<SCHEMAS>) order by owner,type,name,line;
select owner,name,type,referenced_name,referenced_type from dba_dependencies where owner in (<SCHEMAS>) and referenced_owner='SYS';

PACKAGE/state, autonomous txn, DBMS_*, cursor, dynamic SQL, bulk collect, pipelined, AQ, scheduler, hints, CONNECT BY

Workload/app

AWR/ASH/Statspack + listener/app logs; inventory JDBC/ODP.NET/ORM, pool, SQL literals/binds, txn/isolation, batch/API

Baseline TPS/QPS, p50/p95/p99, top SQL/waits, concurrency; NULL/empty string, case-folding, DATE/timezone, sequence semantics

Ora2Pg assessment
ora2pg --init_project ora2pg_<system> --project_base <workdir>
ora2pg -c <conf> -t SHOW_REPORT --estimate_cost --dump_as_html > 01_assessment.html
# conf tối thiểu: ORACLE_DSN dbi:Oracle:host=<h>;service_name=<svc>;port=1521 | SCHEMA <SCHEMAS> | EXPORT_SCHEMA 1
# Không ghi mật khẩu vào conf/Git: dùng ORA2PG_USER + ORA2PG_PASSWD hoặc secret store; pin phiên bản Ora2Pg và checksum gói.

GO / NO-GO G1

GO khi 100% object và bảng được phân loại {AUTO | MANUAL | REDESIGN | EXCLUDE}; có owner/ETA; mọi bảng CDC có khóa xác định; flashback/redo/trail retention > thời gian full load + buffer; phiên bản Oracle–OGG–PostgreSQL–OS nằm trong ma trận hỗ trợ. Còn UDT/LOB/keyless/chức năng Oracle chưa có phương án = NO-GO.


DỰNG POSTGRESQL ĐÍCH VÀ CHUẨN BỊ TRIỂN KHAI

Nhóm

Tiêu chuẩn hoàn thành

Nền tảng

Chọn PostgreSQL version/LTS theo chính sách; HA 2–3 node; load balancer/VIP; đồng bộ thời gian; storage IOPS/latency; capacity ≥ data + index + WAL + 30–40% headroom.

An toàn

TLS, pg_hba.conf allowlist, SCRAM, role tách owner/runtime/readonly/migration/monitor; secret store; audit theo yêu cầu; mã hóa backup; không dùng superuser cho app.

Khả dụng

Base backup + WAL archive/PITR; retention phủ toàn cutover/hypercare; restore thử; replica lag alert; diễn tập switchover/failover và xác nhận connection retry.

Vận hành

Prometheus/Grafana hoặc công cụ chuẩn; alert CPU/RAM/disk/WAL/replication/locks/connections/autovacuum; pg_stat_statements; log_min_duration_statement; runbook incident.

Thông số

Đo rồi chỉnh: shared_buffers, effective_cache_size, work_mem × concurrency, maintenance_work_mem, max_connections + pooler, wal_level, max_wal_size, checkpoint_timeout, autovacuum. Không sao chép tham số Oracle.

Tiện ích

Chỉ cài extension đã duyệt (ví dụ pg_stat_statements, pgcrypto, uuid-ossp, PostGIS/oracle_fdw nếu thật sự cần); pin version; kiểm tra license/security/backup compatibility.

CHUYỂN SCHEMA VÀ PL/SQL — TRIỂN KHAI LẶP, LUÔN CHẠY TỪ SOURCE CONTROL

Lệnh mẫu — xác nhận lại option theo Ora2Pg version đã pin
export ORA2PG_USER='<secret-ref>'; export ORA2PG_PASSWD='<secret-ref>'
ora2pg -c <conf> -t TABLE      -o 10_tables.sql      && psql <pg_dsn> -v ON_ERROR_STOP=1 -f 10_tables.sql
ora2pg -c <conf> -t SEQUENCE   -o 11_sequences.sql   && psql <pg_dsn> -v ON_ERROR_STOP=1 -f 11_sequences.sql
ora2pg -c <conf> -t VIEW       -o 12_views.sql       # review dependency/order before apply
ora2pg -c <conf> -t FUNCTION   -o 30_functions.sql   # repeat: PROCEDURE, PACKAGE, TRIGGER, MVIEW, GRANT
ora2pg -c <conf> -t TEST       -o 90_schema_test.sql; ora2pg -c <conf> -t TEST_VIEW -o 91_view_test.sql
# Mỗi file: lint/review → apply DEV → unit test → commit hash → promote SIT/UAT/PROD. psql luôn ON_ERROR_STOP=1.

Oracle

PostgreSQL gợi ý

Quy tắc ra quyết định

VARCHAR2/NVARCHAR2/CHAR

varchar/text/char

Kiểm tra BYTE vs CHAR, collation, trailing spaces, empty string: Oracle '' = NULL; PostgreSQL '' ≠ NULL.

NUMBER(p,0)

smallint/int/bigint/numeric

Chọn theo range thực tế; không ép NUMBER không precision thành bigint nếu có scale/overflow.

NUMBER(p,s)/FLOAT

numeric(p,s)/double precision

numeric chính xác cho tiền; floating có sai số — đối soát với tolerance được phê duyệt.

DATE

timestamp(0) without time zone

Oracle DATE có cả giờ; chỉ dùng date khi chứng minh phần thời gian luôn 00:00:00.

TIMESTAMP WITH TZ

timestamptz

PostgreSQL lưu instant, hiển thị theo session timezone; kiểm thử DST và client timezone.

CLOB/NCLOB/BLOB/RAW

text/bytea

Profile max/avg; kiểm tra NUL, encoding, checksum byte; OGG LOB support/size theo release.

LONG/LONG RAW/XMLTYPE/UDT/Spatial

text/bytea/xml/jsonb/composite/PostGIS

Không chuyển máy móc; redesign và test riêng. GTT/package state/DB link/AQ cần pattern thay thế.

SEQUENCE/IDENTITY

sequence/generated identity

Giữ cache/ordering nếu business cần; setval sau full load và ngay trước mở ghi.

Chủ đề

Cách xử lý và tiêu chí review

PACKAGE

Tách thành function/procedure trong schema; state package → bảng/session context/app cache; đặc tả public → API contract.

EXCEPTION/transaction

Map SQLSTATE; không COMMIT/ROLLBACK tùy tiện trong function; PRAGMA AUTONOMOUS_TRANSACTION → queue/dblink/service riêng có kiểm soát.

SQL khác biệt

NVL→coalesce; DECODE→case; SYSDATE→clock_timestamp/current_timestamp theo semantics; ROWNUM→limit/window; (+)→ANSI join; MERGE/CONNECT BY phải kiểm thử.

Bulk/dynamic/cursor

BULK COLLECT/FORALL → set-based/COPY; EXECUTE IMMEDIATE → EXECUTE format(...), quote_identifier/literal; REF CURSOR/API contract cần regression test.

Job/DBMS/AQ/DB link

Chuyển sang pg_cron/enterprise scheduler, extension hoặc service; ghi rõ retry/idempotency/transaction/alert. Không giữ stub “compile được nhưng sai nghiệp vụ”.

TẢI DỮ LIỆU NỀN NHẤT QUÁN TẠI S0

Bước

Thực hiện / bằng chứng

1. Chốt S0

Freeze DDL; GoldenGate đã REGISTER trước. Lấy S0 > registration SCN; giữ redo/archive/trail. Dùng một SCN cho toàn snapshot; ghi SCN, UTC time, config hash, table list.

2. Export/Load

ora2pg -c <conf> -t COPY --scn <S0> -P <parallel_tables> -J <parallel_jobs> -o data.sql; load theo nhóm dung lượng. Replicat CDC vẫn STOP, Extract RUNNING.

3. Tối ưu an toàn

Tải vào bảng chưa có FK/secondary index/trigger business; không tắt durability trên PROD nếu không có phê duyệt/rủi ro được chấp nhận; log từng table rows/bytes/start/end/error.

4. Hậu tải

Tạo PK/UK → index → FK/check → view/mview → trigger → grant; ANALYZE; kiểm tra invalid; setval sequence ≥ max(key); bật lại job/trigger theo lịch cutover, không bật sớm.

5. Đối soát

100% bảng: row count; bảng tài chính/critical: SUM/MIN/MAX/null/duplicate + hash theo chunk/PK; LOB: byte length/checksum; mọi mismatch có ticket và disposition.

GO / NO-GO G4

GO khi load không lỗi, object compile hợp lệ, sequence đúng, đối soát đạt ngưỡng đã ký và PostgreSQL còn đủ dung lượng/WAL. Không dùng HANDLECOLLISIONS để che lỗi instantiation; mọi duplicate/missing row phải tìm được nguyên nhân.

KIỂM THỬ VÀ CHUẨN CHẤT LƯỢNG

Lớp

Tiêu chí pass bắt buộc

Schema

So count/DDL/dependency/owner/grant/default/nullability/PK-UK-FK-check/index/partition/view/trigger/sequence; 0 lỗi apply, 0 object “chưa quyết định”.

Dữ liệu

Row count 100% bảng; control totals critical 100%; hash chunk; LOB checksum; timezone/Unicode/null-empty/precision; sai lệch cho phép = <TBD, mặc định 0 với dữ liệu nghiệp vụ>.

Chức năng

Unit PL/pgSQL + API/integration/E2E + batch/report; positive/negative/idempotency/concurrency/deadlock/retry; 100% P0/P1 pass, không còn Sev1/Sev2.

Hiệu năng

Replay workload; TPS/QPS, p95/p99, CPU/IO/WAL/locks/connections; mục tiêu <TBD> (gợi ý p95 không xấu hơn 10%, throughput ≥ baseline); EXPLAIN ANALYZE top SQL.

Phi chức năng

TLS/RBAC/audit/vulnerability; backup/PITR restore; HA failover; monitoring/alert/on-call; connection failover; capacity soak ≥ <TBD> giờ; rollback rehearsal có biên bản.

GOLDENGATE CDC ORACLE → POSTGRESQL

Điều kiện & instantiation

Oracle source / Extract

PostgreSQL target / Replicat / monitor

Prereq & boundary
Xác nhận support matrix; ARCHIVELOG + supplemental logging; credential store/TLS; PK/UK/KEYCOLS; LOB/partition/UDT limits; DDL freeze; trail retention.

Snapshot Ora2Pg AS OF SCN S0. Chỉ dùng AFTERCSN <CSN-S0> khi format đã được xác nhận; test giao dịch trước/tại/sau S0. Legacy trail có thể cần DEFGEN.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
OGG> DBLOGIN USERIDALIAS ora_src
OGG> ADD SCHEMATRANDATA <schema> ALLCOLS
OGG> REGISTER EXTRACT EXTORA DATABASE
SQL> select current_scn from v$database; -- S0 > registration SCN
OGG> ADD EXTRACT EXTORA, INTEGRATED TRANLOG, SCN <S0>
OGG> ADD EXTTRAIL <trail>, EXTRACT EXTORA
# params: EXTRACT EXTORA | USERIDALIAS ora_src
# EXTTRAIL <trail> | TABLE <schema>.*;
OGG> START EXTRACT EXTORA

OGG> DBLOGIN USERIDALIAS pg_tgt
OGG> ADD CHECKPOINTTABLE ggs.gg_checkpoint
OGG> ADD REPLICAT REPPG, EXTTRAIL <trail>,
     CHECKPOINTTABLE ggs.gg_checkpoint
# params: REPLICAT REPPG
# TARGETDB USERIDALIAS pg_tgt | BATCHSQL
# MAP <schema>.*, TARGET <schema>.*;
OGG> START REPLICAT REPPG AFTERCSN <CSN-S0>

Monitor: INFO/STATUS/LAG/REPORT/DISCARD + heartbeat; alert ABENDED/lag/disk/checkpoint/apply error; không purge trước rollback window.

KỊCH BẢN CUTOVER VÀ ROLLBACK

Mốc

Hành động / điều kiện

T−7d → T−24h

CAB/war-room/on-call; backup Oracle+PG+OGG config; restore test; UAT sign; dry-run; freeze DDL; pre-stage app config/secret; xác nhận rollback authority.

T−2h

Health check Oracle/PG/OGG/network/storage; Replicat catch-up; đối soát; pause batch/job; thông báo; Go/No-Go #1. Trigger rollback nếu prerequisite fail hoặc ETA vượt cửa sổ.

T0

Đóng/readonly ingress; chờ transaction active = 0; ghi SCN/CSN; Extract/Replicat lag = 0; final reconcile; stop writer Oracle; backup/checkpoint; Go/No-Go #2.

T+

Set sequence; bật trigger/job PG theo thứ tự; đổi DSN/service; canary → tăng traffic; smoke P0; theo dõi error/p95/locks/WAL; business sign; mở toàn bộ.

Rollback A

Trước khi PG nhận ghi: đóng ingress, trỏ DSN lại Oracle, mở writer/job Oracle, smoke/monitor, ghi bằng chứng. Target giữ nguyên để RCA/re-run.

Rollback B

Sau khi PG đã nhận ghi: STOP THE WORLD; không trỏ thẳng về Oracle. Chạy reverse-CDC/dual-write đã diễn tập hoặc export delta PG→Oracle; reconcile 100%; owner dữ liệu ký; sau đó mới trỏ lại. Không có đường ngược đã test = NO-GO mở ghi PG.

Hypercare

Theo dõi 24×7 trong <TBD 3–7 ngày>; daily reconcile; PITR/backup verify; PIR. Chỉ decommission Oracle sau retention <TBD>, audit/legal hold, rollback window và CAB phê duyệt.

CHECKLIST NGHIỆM THU — KÝ THEO BẰNG CHỨNG, KHÔNG KÝ THEO CẢM NHẬN

Điều kiện nghiệm thu

Chủ ký

Bằng chứng

Kết quả

Scope/object mapping 100%; exclusions được business phê duyệt

Architect/App

<link/ticket>

□Pass □Fail

Schema/PLpgSQL/SQL app: compile + P0/P1 tests 100%

DB Dev/QA

<report>

□Pass □Fail

Data reconciliation, LOB, sequence, timezone/Unicode đạt

DBA/Data Owner

<report>

□Pass □Fail

GoldenGate 0 abend; lag/heartbeat/trail retention đạt

GG DBA

<report>

□Pass □Fail

Performance/capacity/concurrency đạt SLA đã duyệt

SRE/App

<report>

□Pass □Fail

Security, backup/PITR, HA/failover, monitoring/alert đạt

SecOps/PG DBA

<evidence>

□Pass □Fail

Cutover + rollback A/B (nếu cam kết) đã diễn tập

Change Mgr

<minutes>

□Pass □Fail

SOP vận hành, KT, CMDB, license, support, DR và on-call bàn giao

Ops/PM

<sign-off>

□Pass □Fail

QUYẾT ĐỊNH

GO khi toàn bộ mục bắt buộc Pass, không còn Sev1/Sev2, người có thẩm quyền dữ liệu/ứng dụng/vận hành/CAB ký. NO-GO nếu còn mismatch chưa giải thích, CDC không xác định đúng boundary, rollback hậu ghi chưa khả thi nhưng lại được cam kết, hoặc backup/restore/HA chưa thử.

Nguồn chuẩn cần đối chiếu theo release triển khai: Ora2Pg documentation  •  Oracle GoldenGate 26ai  •  PostgreSQL current docs  |  Mọi lệnh OGG là template: checkprm + dry-run + support matrix quyết định cú pháp cuối.

=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master