Oracle CDC 4 — Lab GoldenGate: Oracle → Oracle
Giới thiệu
Bài này là một LAB thực hành đầy đủ: replicate dữ liệu từ một database Oracle nguồn sang một database Oracle đích bằng Oracle GoldenGate Microservices Architecture (MA) phiên bản 19c/21c. Chúng ta sử dụng cơ chế Integrated Extract (Extract đọc redo qua LogMiner server bên trong database, không tự phân tích redo file thô) và Integrated/Parallel Replicat bên đích.
Bài viết giả định bạn đã hoàn thành các bước ở Oracle CDC 2 — nghĩa là cả hai
database đã bật ARCHIVELOG và đã bật supplemental logging ở mức tối thiểu.
Nếu chưa, hãy quay lại làm trước, vì GoldenGate Integrated Extract bắt buộc phải
có redo đầy đủ để dựng lại các thao tác DML/DDL.
Toàn bộ lệnh dưới đây là lab step — bạn gõ trong SQL*Plus (Oracle), trong shell
Linux, hoặc trong adminclient / GGSCI của GoldenGate. Cú pháp GoldenGate MA có
khác so với Classic Architecture cũ; khi không chắc chi tiết của một phiên bản cụ
thể, hãy đối chiếu tài liệu chính thức Oracle GoldenGate Microservices
Documentation cho đúng release của bạn.
Mô hình lab
- Nguồn (source): DB
ORCLSRC, PDBPDBSRC, schemaHR. - Đích (target): DB
ORCLTGT, PDBPDBTGT, schemaHR. - Hai deployment GoldenGate riêng:
srcdep(bên nguồn) vàtgtdep(bên đích). Trong lab đơn giản, cả hai có thể nằm trên cùng một máy, chỉ khác cổng.
Đây là bản dựng để lab/học tập, không phải cấu hình production đã tinh chỉnh (chưa bàn tuning, security TLS đầy đủ, HA của Service Manager, v.v.).
Phần 1 — Chuẩn bị database
1.1 Kiểm tra tiền đề (cả nguồn và đích)
-- Kết nối SYSDBA vào CDB root
SELECT log_mode FROM v$database; -- phải là ARCHIVELOG
SELECT supplemental_log_data_min FROM v$database;-- phải là YES (hoặc IMPLICIT)
SELECT force_logging FROM v$database; -- nên là YES
Nếu SUPPLEMENTAL_LOG_DATA_MIN chưa bật:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE FORCE LOGGING;
ALTER SYSTEM SWITCH LOGFILE;
1.2 Bật GoldenGate replication
Tham số ENABLE_GOLDENGATE_REPLICATION phải bật ở cả nguồn và đích để
Integrated Extract/Replicat gọi được các API nội bộ (LogMiner server, apply
server):
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE SCOPE = BOTH;
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;
1.3 Tạo user GoldenGate
Trong môi trường multitenant (CDB/PDB), Extract kết nối vào CDB root nên
user quản trị phải là common user (C##). Replicat bên đích kết nối trực tiếp
vào PDB nên có thể là user thường trong PDB. Ở đây ta dùng chung tên cho dễ nhớ.
Trên DB nguồn (CDB root):
-- Kết nối: sqlplus sys/password@ORCLSRC as sysdba
CREATE USER c##ggadmin IDENTIFIED BY "GGadmin#2024"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
CONTAINER = ALL;
GRANT DBA TO c##ggadmin CONTAINER = ALL; -- lab: cấp rộng cho gọn
ALTER USER c##ggadmin SET CONTAINER_DATA = ALL CONTAINER = CURRENT;
-- Cấp quyền GoldenGate qua package chuẩn
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE( -
grantee => 'C##GGADMIN', -
privilege_type => 'CAPTURE', -
grant_select_privileges => TRUE, -
do_grants => TRUE, -
container => 'ALL');
Lưu ý cú pháp: trong SQL*Plus, ký tự nối dòng cho một câu lệnh PL/SQL là dấu
-ở cuối dòng. Nếu bạn gõ một dòng thì bỏ các dấu-.
Trên DB đích (kết nối vào PDBTGT):
-- sqlplus sys/password@PDBTGT as sysdba
CREATE USER ggadmin IDENTIFIED BY "GGadmin#2024"
DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT DBA TO ggadmin; -- lab
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE( -
grantee => 'GGADMIN', -
privilege_type => 'APPLY', -
grant_select_privileges => TRUE, -
do_grants => TRUE);
privilege_type => 'CAPTURE' cấp quyền cho Extract; 'APPLY' cấp quyền cho
Replicat; dùng '*' để cấp cả hai. Package DBMS_GOLDENGATE_AUTH là cách được
Oracle khuyến nghị thay cho việc GRANT từng quyền thủ công.
1.4 Bật supplemental logging ở mức bảng (nguồn)
Ngoài mức database tối thiểu, GoldenGate cần schema/table-level supplemental
logging cho các bảng được capture. Việc này sẽ làm bằng lệnh ADD SCHEMATRANDATA trong GoldenGate (mục 3.4), nhưng bạn cũng có thể chuẩn bị schema
HR với vài bảng test:
-- Trên PDBSRC
CREATE TABLE hr.employees_cdc (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
salary NUMBER,
updated DATE DEFAULT SYSDATE
);
Tạo bảng tương ứng bên PDBTGT với cùng cấu trúc để Replicat có đích ánh xạ.
Phần 2 — Cài đặt GoldenGate Microservices
2.1 Cài phần mềm
Có hai cách phổ biến để dựng cho lab:
- OUI silent + response file: giải nén bộ cài
fbo_ggs_Linux_x64_services_shiphome, rồi chạy trình cài đặt ở chế độ silent. - Container image: dùng image GoldenGate đã có sẵn (nếu bạn theo hướng container).
Ví dụ cài silent bằng response file:
# Giải nén bộ cài
cd /home/oracle/soft
unzip -q V*.zip
cd fbo_ggs_Linux_x64_services_shiphome/Disk1
# Chạy OUI silent với response file mẫu (điều chỉnh biến trong file trước)
./runInstaller -silent -nowait \
-responseFile /home/oracle/soft/oggcore.rsp \
INSTALL_OPTION=ORA21c \
SOFTWARE_LOCATION=/u01/app/ogg/21c
Trong oggcore.rsp bạn khai SOFTWARE_LOCATION (OGG_HOME) và INSTALL_OPTION
tương ứng phiên bản DB (ORA19c, ORA21c...). Chi tiết các biến response file
thay đổi theo release — hãy đối chiếu tài liệu cài đặt của đúng version.
2.2 Tạo Service Manager và Deployment
GoldenGate MA gồm Service Manager (điều phối) và một hay nhiều deployment, mỗi deployment chứa các microservice: Administration Service, Distribution Service, Receiver Service, Performance Metrics Service.
Dùng công cụ oggca.sh (GoldenGate Configuration Assistant) — có GUI, nhưng cũng
chạy được silent bằng response file:
export OGG_HOME=/u01/app/ogg/21c
$OGG_HOME/bin/oggca.sh -silent \
-responseFile /home/oracle/soft/srcdep.rsp
Trong response file của oggca bạn khai:
- Tên Service Manager, cổng (vd 9100), có đăng ký như dịch vụ systemd không.
- Tên deployment (
srcdep), thư mụcOGG_DATA_HOME/DEPLOYMENT_HOME. - Cổng của Administration/Distribution/Receiver/Metrics service.
- Tài khoản admin của deployment (vd
oggadmin+ mật khẩu) — khác với user DB.
Lặp lại để tạo deployment thứ hai tgtdep (cổng khác) cho bên đích.
2.3 Truy cập
- Web UI: mở trình duyệt tới
https://<host>:<adminport>của deployment, đăng nhập bằng tài khoản deployment (vdoggadmin). - adminclient (CLI): công cụ dòng lệnh thay cho GGSCI trong MA.
export OGG_HOME=/u01/app/ogg/21c
$OGG_HOME/bin/adminclient
Trong prompt OGG>, kết nối vào Administration Service của deployment nguồn:
OGG (not connected) 1> CONNECT https://localhost:9101 DEPLOYMENT srcdep AS oggadmin PASSWORD ***** !
Cờ
!ở cuối bỏ qua kiểm tra chứng chỉ TLS tự ký (chỉ nên dùng trong lab).
Phần 3 — Cấu hình Extract (bên nguồn)
3.1 Tạo Credential Store và alias
GoldenGate MA không lưu USERID/mật khẩu thẳng trong param file mà dùng
credential store với alias. Trong adminclient đã connect tới srcdep:
OGG (srcdep) 2> ADD CREDENTIALSTORE
OGG (srcdep) 3> ALTER CREDENTIALSTORE ADD USER c##ggadmin@ORCLSRC PASSWORD GGadmin#2024 ALIAS ggsrc DOMAIN OracleGoldenGate
OGG (srcdep) 4> INFO CREDENTIALSTORE
c##ggadmin@ORCLSRC dùng chuỗi kết nối tới CDB root (net service name
ORCLSRC trỏ vào CDB, không phải PDB), vì Integrated Extract kết nối ở root.
Kiểm tra kết nối:
OGG (srcdep) 5> DBLOGIN USERIDALIAS ggsrc
Successfully logged into database CDB$ROOT.
3.2 Bật schema-level supplemental logging cho bảng nguồn
Sau khi DBLOGIN vào root, chọn PDB rồi bật trandata:
OGG (srcdep as c##ggadmin@ORCLSRC/CDB$ROOT) 6> DBLOGIN USERIDALIAS ggsrc
OGG (srcdep) 7> ADD SCHEMATRANDATA PDBSRC.HR ALLCOLS
OGG (srcdep) 8> INFO SCHEMATRANDATA PDBSRC.HR
ADD SCHEMATRANDATAbật supplemental logging cho tất cả bảng trong schema (kể cả bảng tạo sau này).ALLCOLSghi bổ sung mọi cột — tiện cho lab (đảm bảo Replicat có đủ dữ liệu); production thường chỉ cần key columns.- Với bảng lẻ, dùng
ADD TRANDATA PDBSRC.HR.EMPLOYEES_CDC.
3.3 Register Integrated Extract
Integrated Extract phải được đăng ký với database (tạo một capture/LogMiner process nội bộ) trước khi add:
OGG (srcdep) 9> DBLOGIN USERIDALIAS ggsrc
OGG (srcdep) 10> REGISTER EXTRACT EXTHR DATABASE CONTAINER (PDBSRC)
Lệnh này trả về một SCN — ghi nhớ; đó là SCN bắt đầu capture. Với multitenant,
CONTAINER (PDBSRC) giới hạn capture trong PDB nguồn.
3.4 Tạo Extract và trail
OGG (srcdep) 11> ADD EXTRACT EXTHR, INTEGRATED TRANLOG, BEGIN NOW
OGG (srcdep) 12> ADD EXTTRAIL ea, EXTRACT EXTHR, MEGABYTES 100
INTEGRATED TRANLOG= Integrated Extract (khácTRANLOGcủa classic capture).EXTTRAIL ea= local trail 2 ký tự tên (ea) đặt trongDEPLOYMENT_HOME/var/lib/data.- Trail sẽ tự đánh số:
ea000000000,ea000000001...
3.5 Param file của Extract
Trong MA, param file được sửa qua Web UI hoặc bằng lệnh EDIT PARAMS:
OGG (srcdep) 13> EDIT PARAMS EXTHR
Nội dung param file EXTHR:
EXTRACT EXTHR
USERIDALIAS ggsrc DOMAIN OracleGoldenGate
-- ghi log source timestamp để tính LAG chính xác
TRANLOGOPTIONS INTEGRATEDPARAMS (MAX_SGA_SIZE 256)
-- capture DDL
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
-- trail đích của extract
EXTTRAIL ea
-- bảng cần capture (schema.* trong PDB)
SOURCECATALOG PDBSRC
TABLE HR.*;
Ghi chú:
SOURCECATALOG PDBSRCkhai PDB làm catalog mặc định, nênTABLE HR.*được hiểu làPDBSRC.HR.*.DDL INCLUDE MAPPEDcapture cả thay đổi cấu trúc bảng đã map (tùy nhu cầu).INTEGRATEDPARAMStruyền tham số cho LogMiner server;MAX_SGA_SIZEví dụ.
3.6 Khởi động Extract
OGG (srcdep) 14> START EXTRACT EXTHR
OGG (srcdep) 15> INFO EXTRACT EXTHR DETAIL
OGG (srcdep) 16> STATS EXTRACT EXTHR
INFO ... DETAIL cho thấy trạng thái RUNNING, trail đang ghi, và SCN checkpoint.
Phần 4 — Distribution Path (đẩy trail sang đích)
Trong MA, việc chuyển trail giữa hai deployment do Distribution Service đảm nhận qua một Distribution Path. (Nếu Extract và Replicat cùng một deployment, Replicat đọc trực tiếp local trail và bạn có thể bỏ qua phần này.)
4.1 Chuẩn bị credential nhận ở đích
Bên deployment đích cần một user để Receiver Service xác thực. Cách gọn nhất là
tạo target-initiated path hoặc dùng user deployment. Trong lab, ta tạo một
distribution path push từ srcdep sang tgtdep.
4.2 Tạo path bằng adminclient
Vẫn trong adminclient đã connect srcdep:
OGG (srcdep) 17> ADD DISTPATH phr, SOURCE ea, TARGET wss://<targethost>:9111/services/v2/targets?trail=ra
OGG (srcdep) 18> ALTER DISTPATH phr, TARGETAUTH ALIAS tgtrcv DOMAIN OracleGoldenGate
OGG (srcdep) 19> START DISTPATH phr
OGG (srcdep) 20> INFO DISTPATH phr
SOURCE ea= local trail của Extract.TARGET wss://.../targets?trail=ra= URL của Receiver Service bêntgtdep, trail đích tênra(remote trail).tgtrcvlà alias credential (đãALTER CREDENTIALSTORE ADD USER oggadmin@... ALIAS tgtrcv) dùng để xác thực với deployment đích.
Trong Web UI, việc này tương đương với: Distribution Service → Add Path → chọn source trail, target host/port, protocol (
wss/ws/ogg), và trail đích. UI thường dễ hơn để tránh gõ sai URL. Cú phápADD DISTPATHkhác nhau nhẹ giữa các release — kiểm tra tài liệu Distribution Service của version bạn dùng.
Sau khi path chạy, bên tgtdep sẽ xuất hiện remote trail ra000000000... trong
DEPLOYMENT_HOME/var/lib/data.
Phần 5 — Cấu hình Replicat (bên đích)
Mở một phiên adminclient mới (hoặc CONNECT lại) tới deployment đích:
OGG (not connected) 1> CONNECT https://localhost:9111 DEPLOYMENT tgtdep AS oggadmin PASSWORD ***** !
5.1 Credential store bên đích
OGG (tgtdep) 2> ADD CREDENTIALSTORE
OGG (tgtdep) 3> ALTER CREDENTIALSTORE ADD USER ggadmin@PDBTGT PASSWORD GGadmin#2024 ALIAS ggtgt DOMAIN OracleGoldenGate
OGG (tgtdep) 4> DBLOGIN USERIDALIAS ggtgt
Replicat kết nối trực tiếp vào PDB đích (PDBTGT), không phải root.
5.2 Tạo checkpoint table (khuyến nghị)
Checkpoint table giúp Replicat lưu tiến độ giao dịch một cách an toàn:
OGG (tgtdep) 5> ADD CHECKPOINTTABLE ggadmin.ggcheckpoint
5.3 Tạo Replicat
Dùng Parallel Replicat (khuyến nghị cho 19c/21c) hoặc Integrated Replicat:
-- Parallel Replicat (đọc remote trail 'ra')
OGG (tgtdep) 6> ADD REPLICAT REPHR, PARALLEL, EXTTRAIL ra, CHECKPOINTTABLE ggadmin.ggcheckpoint
Nếu muốn Integrated Replicat:
OGG (tgtdep) 6b> ADD REPLICAT REPHR, INTEGRATED, EXTTRAIL ra
5.4 Param file của Replicat
OGG (tgtdep) 7> EDIT PARAMS REPHR
Nội dung param file REPHR:
REPLICAT REPHR
USERIDALIAS ggtgt DOMAIN OracleGoldenGate
-- xử lý va chạm/lỗi ghi report thay vì abend ngay (tùy chọn lab)
DDL INCLUDE MAPPED
DDLERROR DEFAULT IGNORE
-- ánh xạ nguồn -> đích
MAP PDBSRC.HR.*, TARGET PDBTGT.HR.*;
Với Parallel Replicat bạn có thể thêm khối cấu hình song song trong Web UI (số apply threads, split by transaction). Trong lab, mặc định là đủ.
5.5 Khởi động Replicat
OGG (tgtdep) 8> START REPLICAT REPHR
OGG (tgtdep) 9> INFO REPLICAT REPHR DETAIL
OGG (tgtdep) 10> STATS REPLICAT REPHR
Phần 6 — Kiểm thử replication
6.1 Sinh DML bên nguồn
-- Trên PDBSRC, kết nối HR
INSERT INTO hr.employees_cdc (emp_id, emp_name, salary)
VALUES (1, 'Nguyen Van A', 1500);
INSERT INTO hr.employees_cdc (emp_id, emp_name, salary)
VALUES (2, 'Tran Thi B', 2200);
COMMIT;
UPDATE hr.employees_cdc SET salary = 1800 WHERE emp_id = 1;
COMMIT;
DELETE FROM hr.employees_cdc WHERE emp_id = 2;
COMMIT;
6.2 Kiểm tra bên đích
-- Trên PDBTGT
SELECT emp_id, emp_name, salary FROM hr.employees_cdc ORDER BY emp_id;
-- Kỳ vọng: chỉ còn emp_id = 1 với salary = 1800
6.3 Giám sát trên GoldenGate
-- bên srcdep
OGG (srcdep)> INFO ALL
OGG (srcdep)> STATS EXTRACT EXTHR, TOTAL
OGG (srcdep)> LAG EXTRACT EXTHR
-- bên tgtdep
OGG (tgtdep)> INFO ALL
OGG (tgtdep)> STATS REPLICAT REPHR, TOTAL
OGG (tgtdep)> LAG REPLICAT REPHR
INFO ALLliệt kê mọi process với trạng thái (RUNNING/STOPPED/ABENDED), lag và thời gian checkpoint gần nhất.STATS ... TOTALcho biết số insert/update/delete đã xử lý cho từng bảng — đối chiếu với DML bạn vừa chạy.LAGcho biết độ trễ hiện tại.
Nếu số liệu STATS khớp và bảng đích đúng kết quả, replication đã hoạt động.
Phần 7 — Xử lý lỗi thường gặp
7.1 Thiếu supplemental logging
Triệu chứng: Replicat abend với lỗi không tìm được row để update/delete, hoặc Extract cảnh báo về key columns. Kiểm tra và sửa:
OGG (srcdep)> DBLOGIN USERIDALIAS ggsrc
OGG (srcdep)> INFO SCHEMATRANDATA PDBSRC.HR
OGG (srcdep)> ADD SCHEMATRANDATA PDBSRC.HR ALLCOLS
Lưu ý: bật trandata chỉ có hiệu lực cho các giao dịch sau thời điểm bật, nên DML cũ chưa có supplemental data.
7.2 Lỗi credential / DBLOGIN
Triệu chứng: DBLOGIN báo ORA-01017: invalid username/password hoặc alias
không tồn tại.
OGG (srcdep)> INFO CREDENTIALSTORE
OGG (srcdep)> ALTER CREDENTIALSTORE ADD USER c##ggadmin@ORCLSRC PASSWORD <newpass> ALIAS ggsrc DOMAIN OracleGoldenGate
Kiểm tra thêm: net service name (ORCLSRC) có trong tnsnames.ora mà GoldenGate
dùng (biến TNS_ADMIN trong deployment), và Extract đang trỏ đúng CDB root.
7.3 Extract không register được
Triệu chứng: REGISTER EXTRACT báo lỗi thiếu quyền hoặc
ENABLE_GOLDENGATE_REPLICATION chưa bật.
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION; -- phải TRUE
-- cấp lại quyền CAPTURE nếu cần
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('C##GGADMIN','CAPTURE',TRUE,TRUE, container=>'ALL');
7.4 Replicat ABENDED vì ORA lỗi ghi
Ví dụ ORA-00001: unique constraint (trùng khóa) khi replay lại một transaction
đã áp dụng. Xem chi tiết trong report file và discard file:
# report file của process (trong DEPLOYMENT_HOME/var/log của tgtdep)
ls -l /u01/.../tgtdep/var/log/
# hoặc xem qua adminclient:
OGG (tgtdep)> VIEW REPORT REPHR
OGG (tgtdep)> INFO REPLICAT REPHR DETAIL
Cấu hình discard file trong param Replicat để không mất bản ghi lỗi:
DISCARDFILE ./dirrpt/rephr.dsc, APPEND, MEGABYTES 50
REPERROR (DEFAULT, DISCARD)
REPERROR (DEFAULT, DISCARD) cho Replicat ghi bản ghi lỗi vào discard file và
tiếp tục, thay vì abend — hữu ích khi debug lab. Sau khi tìm ra nguyên nhân, gỡ bỏ
để trở lại hành vi an toàn (abend khi có lỗi).
7.5 Distribution Path không kết nối
Triệu chứng: path ở trạng thái không chạy, Receiver Service báo lỗi xác thực hoặc network.
- Kiểm tra cổng của Receiver Service bên đích mở và đúng URL trong
TARGET. - Kiểm tra alias
TARGETAUTHkhớp với user deployment đích. - Trong lab dùng
ws://(không TLS) cho đơn giản nếu chưa cấu hình chứng chỉ; production nên dùngwss://.
Tóm tắt
Bạn vừa dựng một pipeline CDC Oracle→Oracle hoàn chỉnh bằng GoldenGate
Microservices: chuẩn bị database (ARCHIVELOG, supplemental logging,
ENABLE_GOLDENGATE_REPLICATION, user C##GGADMIN với
DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE); cài phần mềm và tạo Service Manager
- deployment; tạo credential store; REGISTER + ADD Integrated Extract, bật
SCHEMATRANDATA, ghi trailea; đẩy trail qua Distribution Path sang remote trailra; và ADD Parallel/Integrated Replicat apply vào PDB đích. Việc kiểm thử dựa vào DML thực tế cộng vớiINFO ALL,STATS,LAG, và khi có sự cố thì đọc report/discard file. Luôn đối chiếu cú pháp chi tiết với tài liệu chính thức của đúng release GoldenGate bạn triển khai.
Tự kiểm tra
- Vì sao Integrated Extract trong môi trường multitenant phải kết nối vào CDB root thay vì PDB?
ADD SCHEMATRANDATAkhácADD TRANDATAở điểm nào, và tại sao lab dùngALLCOLS?- Lệnh nào cần chạy trước
ADD EXTRACT ... INTEGRATED TRANLOGvà nó trả về giá trị gì quan trọng? - Distribution Path chuyển dữ liệu giữa hai thành phần nào, và trail nguồn/đích tương ứng là gì trong lab?
- Khi Replicat
ABENDEDvìORA-00001, bạn xem những file/lệnh nào để chẩn đoán và tùy chọn param nào giúp bỏ qua bản ghi lỗi khi debug? - Hai tham số database nào phải bật ở cả nguồn và đích để Integrated Extract/Replicat hoạt động?
Đọc tiếp
Bài viết liên quan
CSV/JSON/Parquet/Avro, lưu trữ theo hàng vs cột, nén, và OLTP vs OLAP.
Data Engineering là gì, vai trò trong vòng đời dữ liệu, và bức tranh hệ sinh thái công cụ.
Vì sao xử lý phân tán, mô hình Spark (RDD/DataFrame), lazy evaluation, shuffle và tối ưu.
Đảm bảo chất lượng & minh bạch dữ liệu bằng dbt: data tests dựng sẵn (unique, not_null, relationships, accepted_values), singular test, unit test, và tài liệu tự sinh kèm lineage graph.