{"id":5770,"date":"2026-07-16T14:53:07","date_gmt":"2026-07-16T09:23:07","guid":{"rendered":"https:\/\/w3buddy.com\/?p=5770"},"modified":"2026-07-19T22:14:13","modified_gmt":"2026-07-19T16:44:13","slug":"oracle-goldengate-19c-installation-and-configuration","status":"publish","type":"post","link":"https:\/\/w3buddy.com\/blog\/oracle-goldengate-19c-installation-and-configuration\/","title":{"rendered":"Oracle GoldenGate 19c Installation and Configuration"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A complete production-ready SOP for installing and configuring Oracle GoldenGate 19c on Linux from scratch. Covers GoldenGate architecture, source and target preparation, Manager configuration, Extract setup, Data Pump configuration, Replicat setup, initial load, DDL replication, monitoring, and full validation \u2014 with real commands, expected outputs, and consultant-level notes for both classic and Microservices architecture.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. Document Info<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Detail<\/th><\/tr><\/thead><tbody><tr><td>GoldenGate Version<\/td><td>19c (19.1.0+)<\/td><\/tr><tr><td>Oracle DB Version<\/td><td>19c<\/td><\/tr><tr><td>OS<\/td><td>Oracle Linux 7.x \/ RHEL 7.x or 8.x<\/td><\/tr><tr><td>Architecture<\/td><td>Classic (covered fully) + Microservices (noted where different)<\/td><\/tr><tr><td>Source DB<\/td><td>SOURCEDB (dbserver01)<\/td><\/tr><tr><td>Target DB<\/td><td>TARGETDB (dbserver02)<\/td><\/tr><tr><td>Replication Type<\/td><td>Unidirectional (Source to Target)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1411356.1 (GoldenGate Installation Guide)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1298817.1 (GoldenGate Best Practices)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 2193391.1 (GoldenGate 19c Certification Matrix)<\/td><\/tr><tr><td>Prepared By<\/td><td>Oracle DBA \/ Consultant<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. GoldenGate Architecture \u2014 Understand Before You Start<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is Oracle GoldenGate?<\/strong> GoldenGate is Oracle&#8217;s real-time data replication and integration software. It captures changes from a source database (using Oracle redo logs or other DB transaction logs) and delivers them to a target database with very low latency \u2014 typically sub-second. Unlike Data Guard which replicates an entire database, GoldenGate can replicate selected tables, transform data, filter rows, and replicate between different database versions, platforms, and even different database engines.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When is GoldenGate used instead of Data Guard?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Replication between different Oracle versions (e.g., 11g source to 19c target)<\/li>\n\n\n\n<li>Replication between different platforms (Oracle to PostgreSQL, Oracle to Kafka)<\/li>\n\n\n\n<li>Selective table replication (only certain tables, not entire DB)<\/li>\n\n\n\n<li>Bidirectional replication (active-active)<\/li>\n\n\n\n<li>Zero-downtime database migrations<\/li>\n\n\n\n<li>Real-time data warehousing and reporting<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Key GoldenGate Components<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Component<\/th><th>What It Does<\/th><th>Where It Runs<\/th><\/tr><\/thead><tbody><tr><td>Manager<\/td><td>The GoldenGate controller process. Starts, stops, and monitors all other GG processes. Must be running before any other GG process can start.<\/td><td>Both source and target<\/td><\/tr><tr><td>Extract<\/td><td>Captures changes from source database redo\/archive logs. Reads every committed transaction and writes to trail files.<\/td><td>Source server<\/td><\/tr><tr><td>Trail File<\/td><td>Binary files that store captured change records. Acts as a buffer between Extract and Replicat. Located in the GoldenGate directory.<\/td><td>Source and target<\/td><\/tr><tr><td>Data Pump<\/td><td>A secondary Extract process that reads local trail files and sends them over the network to the target server. Provides network fault tolerance.<\/td><td>Source server<\/td><\/tr><tr><td>Collector<\/td><td>A passive process that receives data from the Data Pump and writes it to remote trail files on the target. Started automatically by Manager.<\/td><td>Target server<\/td><\/tr><tr><td>Replicat<\/td><td>Reads trail files on the target and applies changes to the target database using SQL DML.<\/td><td>Target server<\/td><\/tr><tr><td>Checkpoint<\/td><td>Records the last processed position in the trail or redo log. Allows processes to resume after restart without data loss or duplication.<\/td><td>Both<\/td><\/tr><tr><td>Parameter File<\/td><td>Configuration file for each GoldenGate process. Defines what to replicate, where to send it, transformations, filtering etc.<\/td><td>Both<\/td><\/tr><tr><td>GLOBALS<\/td><td>A special GoldenGate-wide parameter file for settings that apply to all processes (like checkpoint table name, port).<\/td><td>Both<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">GoldenGate Data Flow<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>SOURCE DATABASE                         TARGET DATABASE\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500                       \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nOracle Redo Logs\n      \u2502\n      \u25bc\n  &#91;EXTRACT]  \u2500\u2500\u2500\u2500 writes \u2500\u2500\u2500\u2500\u25ba  Local Trail Files (\/gg\/dirdat\/lt*)\n                                        \u2502\n                                        \u25bc\n                                  &#91;DATA PUMP]  \u2500\u2500\u2500\u2500 TCP\/IP \u2500\u2500\u2500\u2500\u25ba  Remote Trail Files (\/gg\/dirdat\/rt*)\n                                                                          \u2502\n                                                                          \u25bc\n                                                                     &#91;REPLICAT]\n                                                                          \u2502\n                                                                          \u25bc\n                                                                  TARGET DATABASE<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why have a Data Pump between Extract and Replicat?<\/strong> The Data Pump decouples the source and target. If the target is unavailable (network outage, maintenance), the Extract continues writing to local trail files and the Data Pump queues the data. When the target comes back, the Data Pump sends everything that accumulated. Without a Data Pump (direct delivery mode), Extract would stop or slow down when the target is unavailable.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Classic vs Microservices Architecture<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Feature<\/th><th>Classic<\/th><th>Microservices<\/th><\/tr><\/thead><tbody><tr><td>Interface<\/td><td>Command line (GGSCI)<\/td><td>Web UI + REST API + GGSCI<\/td><\/tr><tr><td>Process management<\/td><td>Manual via GGSCI<\/td><td>Service-oriented via Admin Server<\/td><\/tr><tr><td>Deployment<\/td><td>Traditional<\/td><td>Container-friendly, cloud-ready<\/td><\/tr><tr><td>Configuration<\/td><td>Parameter files<\/td><td>Parameter files + REST API<\/td><\/tr><tr><td>Recommended for<\/td><td>On-premises, traditional setups<\/td><td>Cloud, containers, modern deployments<\/td><\/tr><tr><td>Port management<\/td><td>Manual<\/td><td>Automatic via Service Manager<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd This SOP covers <strong>Classic architecture<\/strong> fully. Where Microservices differs significantly, notes are added. For most on-premises Oracle-to-Oracle replication, Classic is still the most widely deployed.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Path Conventions and Environment Details<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Source Server (dbserver01)<\/th><th>Target Server (dbserver02)<\/th><\/tr><\/thead><tbody><tr><td>GoldenGate Home<\/td><td>\/u01\/app\/goldengate\/19.1<\/td><td>\/u01\/app\/goldengate\/19.1<\/td><\/tr><tr><td>GoldenGate Base<\/td><td>\/u01\/app\/goldengate<\/td><td>\/u01\/app\/goldengate<\/td><\/tr><tr><td>Trail files (local)<\/td><td>\/u01\/app\/goldengate\/19.1\/dirdat<\/td><td>\/u01\/app\/goldengate\/19.1\/dirdat<\/td><\/tr><tr><td>Oracle Home<\/td><td>\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1<\/td><td>\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1<\/td><\/tr><tr><td>Oracle SID<\/td><td>SOURCEDB<\/td><td>TARGETDB<\/td><\/tr><tr><td>GG Manager Port<\/td><td>7809<\/td><td>7809<\/td><\/tr><tr><td>OS User<\/td><td>oracle<\/td><td>oracle<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Convention B paths:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GoldenGate Home: <code>\/oracle\/GG\/19.1<\/code> on both servers<\/li>\n\n\n\n<li>Oracle Home: <code>\/oracle\/RDBMS\/19.31<\/code> (source) and <code>\/oracle\/RDBMS\/19.31Standby<\/code> (target)<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why same port 7809 on both servers?<\/strong> Manager on source and Manager on target both listen on 7809 by default. Since they are on different servers, there is no conflict.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Pre-Installation Checks \u2014 Both Servers<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Complete all pre-checks on both source and target servers before starting any installation or configuration.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.1 \u2014 Verify Oracle Database Version and Edition<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> GoldenGate 19c supports specific Oracle database versions. Also, some GoldenGate features (like DDL replication) require Oracle Enterprise Edition. Standard Edition has limitations.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE database\nsqlplus \/ as sysdba\n\nset linesize 150\nset pagesize 50\ncol banner for a80\n\nSELECT banner FROM v$version;\n\n-- Check if Enterprise Edition\nSELECT * FROM v$version WHERE banner LIKE '%Enterprise%';\n\n-- Check database character set\nset linesize 150\nset pagesize 50\ncol parameter for a35\ncol value     for a40\n\nSELECT parameter, value\nFROM   nls_database_parameters\nWHERE  parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET')\nORDER BY parameter;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcce GoldenGate 19c certification matrix: MOS Doc ID <strong>2193391.1<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.2 \u2014 Verify Source Database is in ARCHIVELOG Mode<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> GoldenGate Extract reads from Oracle redo and archive logs. If the database is not in ARCHIVELOG mode, Extract cannot access committed transactions that have been overwritten in the online redo logs.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\nsqlplus \/ as sysdba\n\nset linesize 150\nset pagesize 50\ncol name     for a12\ncol log_mode for a15\n\nSELECT name, log_mode FROM v$database;\n\nARCHIVE LOG LIST;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> SOURCE database MUST be in ARCHIVELOG mode. Enable it if not:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>SHUTDOWN IMMEDIATE;\nSTARTUP MOUNT;\nALTER DATABASE ARCHIVELOG;\nALTER DATABASE OPEN;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.3 \u2014 Check Supplemental Logging on Source Database<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Supplemental logging adds extra information to Oracle redo records that GoldenGate needs to correctly identify and replicate row changes. Without supplemental logging, GoldenGate cannot determine which row was changed (especially for UPDATE statements on tables without primary keys).<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Two levels of supplemental logging:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Minimal supplemental logging<\/strong> \u2014 database level \u2014 must always be enabled<\/li>\n\n\n\n<li><strong>All columns supplemental logging<\/strong> \u2014 table or schema level \u2014 enables GoldenGate to capture all column values for UPDATE statements (required for most configurations)<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\n-- Check minimal supplemental logging (database level)\nset linesize 150\nset pagesize 50\ncol supplemental_log_data_min for a10\ncol supplemental_log_data_pk  for a10\ncol supplemental_log_data_all for a10\n\nSELECT supplemental_log_data_min,\n       supplemental_log_data_pk,\n       supplemental_log_data_ui,\n       supplemental_log_data_fk,\n       supplemental_log_data_all\nFROM   v$database;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> <code>supplemental_log_data_min<\/code> must show <code>YES<\/code>. If it shows <code>NO<\/code> \u2014 enable it now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Enable minimal supplemental logging (database level \u2014 required)\nALTER DATABASE ADD SUPPLEMENTAL LOG DATA;\n\n-- Verify\nSELECT supplemental_log_data_min FROM v$database;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.4 \u2014 Verify Network Connectivity Between Source and Target<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># From SOURCE \u2014 test connectivity to target\nping -c 5 dbserver02\n\n# Test GoldenGate Manager port connectivity (7809)\ntelnet dbserver02 7809\n# OR\nnc -zv dbserver02 7809\n\n# From TARGET \u2014 test connectivity to source\nping -c 5 dbserver01\nnc -zv dbserver01 7809<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Firewall must allow TCP port 7809 (Manager port) between source and target in both directions. Also allow the Data Pump port range (default 7840-7914) from source to target. Check with your network team if ports are blocked.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.5 \u2014 Check Disk Space for GoldenGate Installation and Trail Files<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> GoldenGate software needs about 2 GB. Trail files can grow significantly depending on transaction volume. Plan trail file storage carefully \u2014 if trail files fill up the filesystem, GoldenGate stops replication.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On BOTH servers\ndf -hP \/u01\/app\/goldengate\n\n# Minimum space requirements:\n# GoldenGate software = 2GB\n# Trail files = depends on transaction volume\n# Rule of thumb: 3x the peak hourly redo generation rate\n# For a 10GB\/hour redo database, allocate at least 30GB for trail files\n\n# Check how much redo is being generated on SOURCE\n# Run on SOURCE DB:<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE \u2014 check redo generation rate\nset linesize 150\nset pagesize 50\ncol begin_time for a25\ncol end_time   for a25\ncol redo_gb    for 9999.99\n\nSELECT begin_time, end_time,\n       blocks * block_size \/ 1024\/1024\/1024 redo_gb\nFROM   v$archived_log\nWHERE  completion_time &gt; SYSDATE - 1\nORDER BY sequence#;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.6 \u2014 Check OS User and Required Permissions<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify oracle user exists on both servers\nid oracle\n\n# Check oracle user's Oracle environment\nsu - oracle -c \"echo \\$ORACLE_HOME\"\nsu - oracle -c \"echo \\$ORACLE_SID\"\n\n# Verify oracle user can connect to database\nsu - oracle\nsqlplus \/ as sysdba\nSELECT status FROM v$instance;\nEXIT;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. Source Database Preparation<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> All steps in this section are performed on the SOURCE database server unless stated otherwise.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.1 \u2014 Create GoldenGate Admin User on Source Database<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> GoldenGate needs a dedicated database user (typically called <code>ggadmin<\/code> or <code>c##ggadmin<\/code> for CDB) with specific privileges to connect to the database, read the redo logs, and access the data dictionary. Never use SYS or SYSTEM for GoldenGate \u2014 use a dedicated user.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE database\nsqlplus \/ as sysdba\n\n-- For NON-CDB database (traditional)\nCREATE USER ggadmin IDENTIFIED BY GGadmin_123\n    DEFAULT TABLESPACE users\n    TEMPORARY TABLESPACE temp\n    PROFILE DEFAULT;\n\n-- Grant required privileges\nGRANT CREATE SESSION     TO ggadmin;\nGRANT ALTER SESSION      TO ggadmin;\nGRANT SELECT ANY TABLE   TO ggadmin;\nGRANT SELECT ANY DICTIONARY TO ggadmin;\nGRANT FLASHBACK ANY TABLE TO ggadmin;\nGRANT CREATE TABLE       TO ggadmin;\nGRANT INSERT ANY TABLE   TO ggadmin;\nGRANT UPDATE ANY TABLE   TO ggadmin;\nGRANT DELETE ANY TABLE   TO ggadmin;\nGRANT DROP ANY TABLE     TO ggadmin;\nGRANT EXECUTE ON DBMS_FLASHBACK TO ggadmin;\n\n-- Grant specific GoldenGate required privileges\nGRANT SELECT ON DBA_CLUSTERS     TO ggadmin;\nGRANT SELECT ON DBA_OBJECTS      TO ggadmin;\nGRANT SELECT ON DBA_SEQUENCES    TO ggadmin;\nGRANT SELECT ON DBA_TABLES       TO ggadmin;\nGRANT SELECT ON DBA_USERS        TO ggadmin;\nGRANT SELECT ON V_$DATABASE      TO ggadmin;\nGRANT SELECT ON V_$ARCHIVED_LOG  TO ggadmin;\nGRANT SELECT ON V_$LOG           TO ggadmin;\nGRANT SELECT ON V_$LOGFILE       TO ggadmin;\nGRANT SELECT ON V_$NLS_PARAMETERS TO ggadmin;\nGRANT SELECT ON V_$PARAMETER     TO ggadmin;\n\n-- Quota on USERS tablespace for checkpoint table\nALTER USER ggadmin QUOTA UNLIMITED ON USERS;\n\n-- Verify user created\nSELECT username, account_status, default_tablespace\nFROM   dba_users\nWHERE  username = 'GGADMIN';<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>For CDB database (Container Database) \u2014 use common user:<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- CDB requires C## prefix for common users\nCREATE USER c##ggadmin IDENTIFIED BY GGadmin_123\n    DEFAULT TABLESPACE users\n    TEMPORARY TABLESPACE temp\n    CONTAINER=ALL;\n\nGRANT CREATE SESSION     TO c##ggadmin CONTAINER=ALL;\nGRANT ALTER SESSION      TO c##ggadmin CONTAINER=ALL;\nGRANT SELECT ANY TABLE   TO c##ggadmin CONTAINER=ALL;\nGRANT SELECT ANY DICTIONARY TO c##ggadmin CONTAINER=ALL;\n-- ... (same grants as above with CONTAINER=ALL)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.2 \u2014 Enable GoldenGate Replication in Database Parameter<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> The <code>ENABLE_GOLDENGATE_REPLICATION<\/code> parameter must be set to <code>TRUE<\/code> in Oracle 11.2.0.4+ databases. It enables internal Oracle optimizations for GoldenGate and allows GoldenGate to mine the redo logs correctly.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\nsqlplus \/ as sysdba\n\n-- Check current value\nSHOW PARAMETER enable_goldengate_replication;\n\n-- Enable it\nALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;\n\n-- Verify\nSHOW PARAMETER enable_goldengate_replication;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.3 \u2014 Enable Supplemental Logging for Replicated Tables<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why table-level supplemental logging?<\/strong> Database-level minimal supplemental logging (done in Section 4.3) only logs the minimal information needed for Oracle internal operations. For GoldenGate to correctly replicate updates and deletes, it needs all primary key columns (and ideally all columns) to be logged. This must be enabled at the table level.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\n-- Option 1: Enable for specific tables only (recommended for targeted replication)\nALTER TABLE hr.employees ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;\nALTER TABLE hr.departments ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;\n\n-- Option 2: Enable for all tables in a schema (easier for full schema replication)\n-- Run this for each schema being replicated\nEXEC DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name=&gt;'HR.EMPLOYEES');\n\n-- Option 3: Enable all-column supplemental logging for entire database\n-- Use only if replicating entire database \u2014 impacts redo volume\nALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;\n\n-- Verify supplemental logging for specific tables\nset linesize 200\nset pagesize 100\ncol owner           for a20\ncol log_group_name  for a30\ncol table_name      for a30\ncol log_group_type  for a30\n\nSELECT owner, log_group_name, table_name, log_group_type\nFROM   dba_log_groups\nWHERE  owner = 'HR'\nORDER BY table_name;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.4 \u2014 Create Checkpoint Table on Source Database<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> The GoldenGate checkpoint table stores the Extract&#8217;s read position in the redo logs. If Extract stops and restarts, it reads the checkpoint table to know where it left off \u2014 ensuring no transactions are missed or duplicated.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Connect to source as ggadmin\nsqlplus ggadmin\/GGadmin_123@SOURCEDB\n\n-- Create checkpoint table\n-- This table is managed entirely by GoldenGate \u2014 do not manually insert\/delete\n-- The table name here must match what you specify in the GLOBALS file\nEXEC DBMS_APPLICATION_INFO.SET_MODULE('GoldenGate','Checkpoint');<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Note:<\/strong> The actual checkpoint table creation is done from GGSCI after GoldenGate is installed (Section 7). The database user just needs the privilege to create tables in its default tablespace (granted in Section 5.1).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. Target Database Preparation<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> All steps in this section are performed on the TARGET database server.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.1 \u2014 Create GoldenGate Admin User on Target Database<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET database\nsqlplus \/ as sysdba\n\n-- Create GoldenGate user on target\nCREATE USER ggadmin IDENTIFIED BY GGadmin_123\n    DEFAULT TABLESPACE users\n    TEMPORARY TABLESPACE temp\n    PROFILE DEFAULT;\n\n-- Target ggadmin needs DML privileges on replicated tables\nGRANT CREATE SESSION     TO ggadmin;\nGRANT ALTER SESSION      TO ggadmin;\nGRANT CREATE TABLE       TO ggadmin;\nGRANT INSERT ANY TABLE   TO ggadmin;\nGRANT UPDATE ANY TABLE   TO ggadmin;\nGRANT DELETE ANY TABLE   TO ggadmin;\nGRANT SELECT ANY TABLE   TO ggadmin;\nGRANT SELECT ANY DICTIONARY TO ggadmin;\nGRANT FLASHBACK ANY TABLE TO ggadmin;\n\n-- Quota for checkpoint table\nALTER USER ggadmin QUOTA UNLIMITED ON USERS;\n\n-- Verify\nSELECT username, account_status FROM dba_users WHERE username = 'GGADMIN';<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.2 \u2014 Enable GoldenGate Replication on Target Database<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET database\nsqlplus \/ as sysdba\n\nALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;\nSHOW PARAMETER enable_goldengate_replication;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.3 \u2014 Create Target Schema and Tables<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> GoldenGate Replicat does not create tables \u2014 it only applies DML. The target schema and tables must exist before Replicat starts. They must have the same structure as the source tables.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET database\n-- Create the schema\/user that will hold replicated data\nsqlplus \/ as sysdba\n\nCREATE USER hr IDENTIFIED BY Hr_123\n    DEFAULT TABLESPACE users\n    TEMPORARY TABLESPACE temp;\n\nGRANT CREATE SESSION, RESOURCE TO hr;\nALTER USER hr QUOTA UNLIMITED ON USERS;\n\n-- Create tables matching source structure exactly\n-- Example for HR.EMPLOYEES table\nsqlplus hr\/Hr_123@TARGETDB\n\nCREATE TABLE hr.employees (\n    employee_id    NUMBER(6)     NOT NULL,\n    first_name     VARCHAR2(20),\n    last_name      VARCHAR2(25)  NOT NULL,\n    email          VARCHAR2(25)  NOT NULL,\n    phone_number   VARCHAR2(20),\n    hire_date      DATE          NOT NULL,\n    job_id         VARCHAR2(10)  NOT NULL,\n    salary         NUMBER(8,2),\n    commission_pct NUMBER(2,2),\n    manager_id     NUMBER(6),\n    department_id  NUMBER(4),\n    CONSTRAINT emp_emp_id_pk PRIMARY KEY (employee_id)\n);<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Tip:<\/strong> Use Oracle Data Pump (<code>expdp<\/code>\/<code>impdp<\/code>) with <code>CONTENT=METADATA_ONLY<\/code> to export the DDL from source and import it on target. This is faster and more reliable than manually recreating tables when you have many tables.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE \u2014 export schema structure only (no data)\nexpdp system\/Oracle_123@SOURCEDB \\\n    SCHEMAS=HR \\\n    CONTENT=METADATA_ONLY \\\n    DUMPFILE=hr_structure.dmp \\\n    LOGFILE=hr_structure_exp.log \\\n    DIRECTORY=DATA_PUMP_DIR\n\n# Copy dump file to target\nscp \/oracle\/admin\/SOURCEDB\/dpdump\/hr_structure.dmp \\\n    oracle@dbserver02:\/oracle\/admin\/TARGETDB\/dpdump\/\n\n# On TARGET \u2014 import structure only\nimpdp system\/Oracle_123@TARGETDB \\\n    SCHEMAS=HR \\\n    CONTENT=METADATA_ONLY \\\n    DUMPFILE=hr_structure.dmp \\\n    LOGFILE=hr_structure_imp.log \\\n    DIRECTORY=DATA_PUMP_DIR \\\n    TABLE_EXISTS_ACTION=REPLACE<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.4 \u2014 Create Checkpoint Table on Target Database<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> The Replicat process uses a checkpoint table on the TARGET database to track which trail file records it has applied. If Replicat stops and restarts, it reads this checkpoint to resume from exactly where it left off \u2014 preventing duplicate applies.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>This is done from GGSCI after GoldenGate is installed<\/strong> \u2014 referenced here so you know why the ggadmin user needs CREATE TABLE privilege on target.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. GoldenGate Software Installation<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Install GoldenGate on BOTH source and target servers. The installation steps are identical on both \u2014 only the configuration after installation differs.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.1 \u2014 Download and Stage GoldenGate Software<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Download GoldenGate 19c for Oracle on Linux x86-64 from MOS\n# MOS \u2192 Patches &amp; Updates \u2192 search \"GoldenGate 19.1\" for Linux\n\n# Verify checksum\nsha256sum \/stage\/goldengate\/191004_fbo_ggs_Linux_x64_Oracle_shiphome.zip\n\n# Stage on both servers\nls -lh \/stage\/goldengate\/191004_fbo_ggs_Linux_x64_Oracle_shiphome.zip\n\n# Copy to target server if needed\nscp \/stage\/goldengate\/191004_fbo_ggs_Linux_x64_Oracle_shiphome.zip \\\n    oracle@dbserver02:\/stage\/goldengate\/<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.2 \u2014 Create GoldenGate Directory Structure<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On BOTH servers as oracle user (or root \u2014 then chown to oracle)\nsu - oracle\n\n# Create GoldenGate home directory\nmkdir -p \/u01\/app\/goldengate\/19.1\n\n# Convention B\n# mkdir -p \/oracle\/GG\/19.1\n\n# Set ownership\nchown -R oracle:oinstall \/u01\/app\/goldengate\nchmod -R 775 \/u01\/app\/goldengate\n\n# Verify\nls -ld \/u01\/app\/goldengate\/19.1<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.3 \u2014 Install GoldenGate Software (Silent Installation)<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why silent?<\/strong> Same reasons as Oracle DB silent install \u2014 no GUI required, repeatable, scriptable.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On BOTH servers as oracle user\nsu - oracle\n\n# Unzip the GoldenGate installer\ncd \/stage\/goldengate\nunzip -q 191004_fbo_ggs_Linux_x64_Oracle_shiphome.zip\n\n# Navigate to installer directory\ncd \/stage\/goldengate\/fbo_ggs_Linux_x64_shiphome\/Disk1\n\n# Create silent response file\ncat &gt; \/tmp\/gg_install.rsp &lt;&lt; 'EOF'\noracle.install.responseFileVersion=\/oracle\/install\/rspfmt_ogginstall_response_schema_v19_1_0\nINSTALL_OPTION=ORA19c\nSOFTWARE_LOCATION=\/u01\/app\/goldengate\/19.1\nSTART_MANAGER=false\nMANAGER_PORT=7809\nDATABASE_LOCATION=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\nINVENTORY_LOCATION=\/u01\/app\/oraInventory\nUNIX_GROUP_NAME=oinstall\nEOF\n\n# Run silent installation\n.\/runInstaller -silent \\\n    -responseFile \/tmp\/gg_install.rsp \\\n    -ignoreSysPrereqs \\\n    -showProgress\n\n# Monitor installation log\ntail -100f \/tmp\/OraInstall*\/installActions*.log<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>For Convention B \u2014 change SOFTWARE_LOCATION:<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>SOFTWARE_LOCATION=\/oracle\/GG\/19.1\nDATABASE_LOCATION=\/oracle\/RDBMS\/19.31<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected completion message:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>The installation of Oracle GoldenGate for Oracle 19c was successful.<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.4 \u2014 Set GoldenGate Environment Variables<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Add to oracle user's ~\/.bash_profile on BOTH servers\nsu - oracle\nvi ~\/.bash_profile<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add at the end:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# GoldenGate Environment Variables\n# -------------------------------------------------------\n\n# GoldenGate Home directory\nexport GG_HOME=\/u01\/app\/goldengate\/19.1\n# Convention B: export GG_HOME=\/oracle\/GG\/19.1\n\n# Add GoldenGate to PATH\nexport PATH=$GG_HOME:$PATH\n\n# LD_LIBRARY_PATH \u2014 GoldenGate needs Oracle libraries\nexport LD_LIBRARY_PATH=$ORACLE_HOME\/lib:$GG_HOME:$LD_LIBRARY_PATH\n\n# Convenient alias to launch GGSCI from anywhere\nalias ggsci='cd $GG_HOME &amp;&amp; .\/ggsci'\nalias ggstart='cd $GG_HOME &amp;&amp; .\/ggsci &lt;&lt;EOF\\nSTART MANAGER\\nEXIT\\nEOF'<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Apply profile\n. ~\/.bash_profile\n\n# Verify\necho $GG_HOME\nls $GG_HOME\/ggsci<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.5 \u2014 Create GoldenGate Subdirectories<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> GoldenGate needs specific subdirectories for parameter files, trail files, report files, checkpoint files, and log files. The <code>CREATE SUBDIRS<\/code> command in GGSCI creates all of them automatically.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On BOTH servers\nsu - oracle\ncd $GG_HOME\n\n# Launch GGSCI\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Inside GGSCI on BOTH servers\nGGSCI&gt; CREATE SUBDIRS<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Creating subdirectories under current directory \/u01\/app\/goldengate\/19.1\n\nParameter files:   \/u01\/app\/goldengate\/19.1\/dirprm: created\nReport files:      \/u01\/app\/goldengate\/19.1\/dirrpt: created\nCheckpoint files:  \/u01\/app\/goldengate\/19.1\/dirchk: created\nProcess status:    \/u01\/app\/goldengate\/19.1\/dirpcs: created\nSQL script files:  \/u01\/app\/goldengate\/19.1\/dirsql: created\nDatabase definitions: \/u01\/app\/goldengate\/19.1\/dirdef: created\nExtract data files: \/u01\/app\/goldengate\/19.1\/dirdat: created\nTemporary files:   \/u01\/app\/goldengate\/19.1\/dirtmp: created\nCredential store:  \/u01\/app\/goldengate\/19.1\/dircrd: created\nMasterkey wallet:  \/u01\/app\/goldengate\/19.1\/dirwlt: created\nDump files:        \/u01\/app\/goldengate\/19.1\/dirdmp: created<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; EXIT<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.6 \u2014 Create GLOBALS File on Both Servers<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> The GLOBALS file contains GoldenGate-wide settings that apply to all processes on this server. The most important setting is <code>CHECKPOINTTABLE<\/code> \u2014 the name of the checkpoint table in the database that all Extract\/Replicat processes will use to store their positions.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server\nsu - oracle\ncd $GG_HOME\n\n# Create GLOBALS file\n# The GLOBALS file must be named exactly \"GLOBALS\" (no extension) in GG_HOME\nvi $GG_HOME\/GLOBALS<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add to GLOBALS file on SOURCE:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- GoldenGate GLOBALS file\n-- This file is read at GGSCI startup \u2014 applies to all processes\n\n-- Checkpoint table \u2014 GoldenGate creates and manages this table\n-- Must match the user.table format \u2014 ggadmin owns it\nCHECKPOINTTABLE ggadmin.ggchkpt\n\n-- GoldenGate Manager port\n-- Must be consistent across all config files\nGGSCHEMA ggadmin<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server\nvi $GG_HOME\/GLOBALS<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add to GLOBALS file on TARGET:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- GoldenGate GLOBALS file \u2014 TARGET SERVER\nCHECKPOINTTABLE ggadmin.ggchkpt\nGGSCHEMA ggadmin<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.7 \u2014 Create GoldenGate Credential Store and Add Database Login<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why use credential store?<\/strong> Instead of putting database passwords in plain text in parameter files, GoldenGate&#8217;s credential store (wallet) stores encrypted credentials. You reference credentials by an alias. This is much more secure and is the recommended approach.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server \u2014 launch GGSCI\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Create credential store\nGGSCI&gt; CREATE CREDENTIALSTORE\n\n-- Add source database credentials\n-- Alias SOURCEDB will be used in parameter files instead of password\nGGSCI&gt; ADD CREDENTIALSTORE\nGGSCI&gt; ALTER CREDENTIALSTORE ADD USER ggadmin PASSWORD GGadmin_123 ALIAS SOURCEDB\n\n-- Verify credential was added\nGGSCI&gt; INFO CREDENTIALSTORE<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server \u2014 launch GGSCI\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; CREATE CREDENTIALSTORE\nGGSCI&gt; ALTER CREDENTIALSTORE ADD USER ggadmin PASSWORD GGadmin_123 ALIAS TARGETDB\nGGSCI&gt; INFO CREDENTIALSTORE<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">8. Manager Configuration<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is Manager?<\/strong> Manager is the GoldenGate controller process. It must be running before any Extract, Data Pump, or Replicat can be started. Manager monitors all other GG processes and restarts them if they stop (based on AUTORESTART configuration). Think of Manager as the GoldenGate supervisor.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.1 \u2014 Create Manager Parameter File on Source<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server\nsu - oracle\ncd $GG_HOME\n\n# Edit Manager parameter file\n# The Manager parameter file is always named mgr.prm\nvi $GG_HOME\/dirprm\/mgr.prm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add the following to mgr.prm on SOURCE:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- -------------------------------------------------------\n-- GoldenGate Manager Parameter File \u2014 SOURCE SERVER\n-- File: $GG_HOME\/dirprm\/mgr.prm\n-- -------------------------------------------------------\n\n-- Manager listens on this port\n-- Data Pump on source connects to Manager on target via this port\nPORT 7809\n\n-- Dynamic port range for Collector processes\n-- When Data Pump sends data, Manager on target allocates a port from this range\n-- Must be open in firewall from source to target\nDYNAMICPORTLIST 7840-7914\n\n-- Purge old trail files automatically\n-- MINKEEPDAYS = keep trail files for at least 3 days\n-- MAXKEEPDAYS = delete trail files after 7 days\n-- This prevents trail files from filling up the filesystem\nPURGEOLDEXTRACTS .\/dirdat\/*, USECHECKPOINTS, MINKEEPDAYS 3, MAXKEEPDAYS 7\n\n-- Auto-restart processes if they abort\n-- WAITMINUTES = wait 2 minutes before restarting\n-- RESETMINUTES = reset the restart count after 60 minutes of stable operation\nAUTORESTART EXTRACT *, WAITMINUTES 2, RESETMINUTES 60\nAUTORESTART REPLICAT *, WAITMINUTES 2, RESETMINUTES 60\n\n-- Write Manager status messages to report file\nLAGREPORTMINUTES 30\nLAGREPORTONLYIFBEHIND\nLAGINFOMINUTES 10\nLAGCRITICALMINUTES 30<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.2 \u2014 Create Manager Parameter File on Target<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server\nsu - oracle\nvi $GG_HOME\/dirprm\/mgr.prm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add the following to mgr.prm on TARGET:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- -------------------------------------------------------\n-- GoldenGate Manager Parameter File \u2014 TARGET SERVER\n-- File: $GG_HOME\/dirprm\/mgr.prm\n-- -------------------------------------------------------\n\nPORT 7809\n\nDYNAMICPORTLIST 7840-7914\n\n-- Purge remote trail files on target\nPURGEOLDEXTRACTS .\/dirdat\/*, USECHECKPOINTS, MINKEEPDAYS 3, MAXKEEPDAYS 7\n\nAUTORESTART REPLICAT *, WAITMINUTES 2, RESETMINUTES 60\n\nLAGREPORTMINUTES 30\nLAGREPORTONLYIFBEHIND\nLAGINFOMINUTES 10\nLAGCRITICALMINUTES 30<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.3 \u2014 Start Manager on Both Servers<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server \u2014 start Manager\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Add Manager to GoldenGate registry\nGGSCI&gt; ADD MANAGER\n\n-- Start Manager\nGGSCI&gt; START MANAGER\n\n-- Verify Manager is running\nGGSCI&gt; INFO MANAGER<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manager is running (IP port dbserver01.7809, Process ID 12345).<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server \u2014 start Manager\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; ADD MANAGER\nGGSCI&gt; START MANAGER\nGGSCI&gt; INFO MANAGER<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.4 \u2014 Create Checkpoint Table on Both Databases<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why do this now?<\/strong> Manager must be running before you can create the checkpoint table. GGSCI connects to the database (using the credentials we set up) and creates the table automatically.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server \u2014 create checkpoint table in source DB\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Login to source database from GGSCI\nGGSCI&gt; DBLOGIN USERIDALIAS SOURCEDB\n\n-- Create checkpoint table (name must match GLOBALS file)\nGGSCI&gt; ADD CHECKPOINTTABLE ggadmin.ggchkpt\n\n-- Verify\nGGSCI&gt; INFO CHECKPOINTTABLE ggadmin.ggchkpt<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server \u2014 create checkpoint table in target DB\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; DBLOGIN USERIDALIAS TARGETDB\nGGSCI&gt; ADD CHECKPOINTTABLE ggadmin.ggchkpt\nGGSCI&gt; INFO CHECKPOINTTABLE ggadmin.ggchkpt\nGGSCI&gt; EXIT<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. Extract Configuration (Source Server)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What does Extract do?<\/strong> Extract is the GoldenGate capture process. It attaches to the Oracle redo log mining infrastructure (LogMiner or its own internal log reader) and reads every committed transaction from the redo logs. It writes these changes to local trail files in a GoldenGate binary format.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.1 \u2014 Create Extract Parameter File<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server\nsu - oracle\nvi $GG_HOME\/dirprm\/extora.prm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add the following content:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- -------------------------------------------------------\n-- GoldenGate Extract Parameter File\n-- Process Name: EXTORA\n-- File: $GG_HOME\/dirprm\/extora.prm\n-- Purpose: Capture changes from SOURCEDB and write to local trail files\n-- -------------------------------------------------------\n\n-- Extract process name (must match what you use in ADD EXTRACT command)\nEXTRACT extora\n\n-- Use credential alias instead of plaintext password\nUSERIDALIAS SOURCEDB\n\n-- Set the Oracle home for this extract\n-- Required when running GoldenGate against Oracle database\nTRANLOGOPTIONS DBLOGREADER\n\n-- Report file \u2014 Extract writes status messages here\nREPORT AT 01:00\nREPORTCOUNT EVERY 60 MINUTES, RATE\n\n-- Discard file \u2014 records that Extract cannot process go here for review\nDISCARDFILE .\/dirrpt\/extora.dsc, APPEND, MEGABYTES 1000\n\n-- Maximum size of each discard file before rollover\nDISCARDROLLOVER AT 02:00\n\n-- Write to local trail files\n-- lt = local trail prefix, up to 2 characters\n-- GoldenGate creates files like lt000000, lt000001 etc.\nEXTTRAIL .\/dirdat\/lt\n\n-- Table list \u2014 specify which tables to capture\n-- Use wildcards for entire schemas or list individual tables\n-- Format: schema.table\nTABLE hr.employees;\nTABLE hr.departments;\nTABLE hr.jobs;\nTABLE hr.locations;\nTABLE hr.countries;\nTABLE hr.regions;\n\n-- To replicate an entire schema use wildcard:\n-- TABLE hr.*;\n\n-- To replicate multiple schemas:\n-- TABLE hr.*;\n-- TABLE sales.*;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.2 \u2014 Register Extract with Database (Required for 12c+)<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why register?<\/strong> In Oracle 12c and above, GoldenGate Extract must be registered with the database&#8217;s LogMiner infrastructure. This tells Oracle that GoldenGate is mining the redo logs and Oracle should retain archivelogs until GoldenGate has processed them (prevents Extract from losing data if archivelogs are deleted before Extract reads them).<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Login to source database\nGGSCI&gt; DBLOGIN USERIDALIAS SOURCEDB\n\n-- Register the Extract with the database\n-- This creates a LogMiner registration\nGGSCI&gt; REGISTER EXTRACT extora DATABASE\n\n-- Verify registration\nGGSCI&gt; INFO EXTRACT extora, SHOWCH<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.3 \u2014 Add Extract Process<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why <code>TRANLOG<\/code>?<\/strong> <code>TRANLOG<\/code> tells GoldenGate this Extract captures directly from Oracle transaction logs (redo logs). The alternative <code>SOURCEISTABLE<\/code> is used for initial loads.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why <code>BEGIN NOW<\/code>?<\/strong> This tells Extract to start capturing from the current time \u2014 not from the beginning of the redo logs. For initial setup, <code>BEGIN NOW<\/code> means we will do an initial load separately to synchronize existing data, then the Extract captures only new changes going forward.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server \u2014 launch GGSCI\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Login to database\nGGSCI&gt; DBLOGIN USERIDALIAS SOURCEDB\n\n-- Add Extract process\n-- TRANLOG = capture from transaction logs\n-- BEGIN NOW = start capturing from current SCN (not historical)\nGGSCI&gt; ADD EXTRACT extora, TRANLOG, BEGIN NOW\n\n-- Add local trail file\n-- EXTTRAIL = local trail, lt = prefix, MEGABYTES 500 = rotate when 500MB\nGGSCI&gt; ADD EXTTRAIL .\/dirdat\/lt, EXTRACT extora, MEGABYTES 500\n\n-- Verify Extract was added\nGGSCI&gt; INFO EXTRACT extora<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">10. Data Pump Configuration (Source Server)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is Data Pump in GoldenGate?<\/strong> GoldenGate&#8217;s Data Pump (not to be confused with Oracle Data Pump expdp\/impdp) is a secondary Extract process that reads the local trail files written by the primary Extract and sends them over the network to the target server. It writes to remote trail files on the target.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.1 \u2014 Create Data Pump Parameter File<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server\nsu - oracle\nvi $GG_HOME\/dirprm\/pmpgora.prm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add the following content:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- -------------------------------------------------------\n-- GoldenGate Data Pump Parameter File\n-- Process Name: PMPGORA\n-- File: $GG_HOME\/dirprm\/pmpgora.prm\n-- Purpose: Read local trail files and send to target server\n-- -------------------------------------------------------\n\n-- This is a PUMP (secondary Extract) process\nEXTRACT pmpgora\n\n-- Use credential alias for source database\n-- Data Pump needs DB connection for DDL and metadata operations\nUSERIDALIAS SOURCEDB\n\n-- Pass-through mode \u2014 Data Pump just forwards data without transformation\n-- If you need transformation, remove PASSTHRU and add mapping rules\nPASSTHRU\n\n-- Read from local trail files (written by primary Extract)\nRMTHOST dbserver02.company.com, MGRPORT 7809, COMPRESS\n\n-- Write to remote trail files on target server\n-- rt = remote trail prefix\nRMTTRAIL .\/dirdat\/rt, MEGABYTES 500\n\n-- Discard file\nDISCARDFILE .\/dirrpt\/pmpgora.dsc, APPEND, MEGABYTES 500\n\n-- Table list must match or be a subset of Extract's table list\nTABLE hr.employees;\nTABLE hr.departments;\nTABLE hr.jobs;\nTABLE hr.locations;\nTABLE hr.countries;\nTABLE hr.regions;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What does <code>COMPRESS<\/code> do?<\/strong> Compresses the redo data before sending over the network. Reduces bandwidth usage significantly \u2014 typically 60-70% compression on text-heavy data. Has minor CPU cost on source. Recommended for WAN connections.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is <code>PASSTHRU<\/code>?<\/strong> Tells the Data Pump to simply forward records as-is without any processing or transformation. Remove this if you want the Data Pump to perform filtering or column mapping.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.2 \u2014 Add Data Pump Process<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server \u2014 launch GGSCI\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Login to database\nGGSCI&gt; DBLOGIN USERIDALIAS SOURCEDB\n\n-- Add Data Pump process\n-- EXTTRAILSOURCE = reads from local trail files (not directly from redo)\nGGSCI&gt; ADD EXTRACT pmpgora, EXTTRAILSOURCE .\/dirdat\/lt\n\n-- Add remote trail file on target\nGGSCI&gt; ADD RMTTRAIL .\/dirdat\/rt, EXTRACT pmpgora, MEGABYTES 500\n\n-- Verify Data Pump was added\nGGSCI&gt; INFO EXTRACT pmpgora<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">11. Replicat Configuration (Target Server)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What does Replicat do?<\/strong> Replicat reads the remote trail files on the target server and applies each captured change to the target database using SQL DML statements (INSERT, UPDATE, DELETE). It maintains transaction order and atomicity.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">11.1 \u2014 Create Replicat Parameter File<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server\nsu - oracle\nvi $GG_HOME\/dirprm\/repgora.prm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add the following content:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- -------------------------------------------------------\n-- GoldenGate Replicat Parameter File\n-- Process Name: REPGORA\n-- File: $GG_HOME\/dirprm\/repgora.prm\n-- Purpose: Apply changes from remote trail files to TARGETDB\n-- -------------------------------------------------------\n\n-- Replicat process name\nREPLICAT repgora\n\n-- Use credential alias for target database\nUSERIDALIAS TARGETDB\n\n-- Assume target rows already exist for UPDATE\/DELETE without checking source\n-- Improves performance \u2014 disable if you need strict row checking\nASSUMETARGETDEFS\n\n-- Handle errors \u2014 discard records that fail to apply (log them, do not stop)\n-- Change to ABEND if you want Replicat to stop on any error\nREPERROR DEFAULT, DISCARD\n\n-- Discard file \u2014 failed records written here\nDISCARDFILE .\/dirrpt\/repgora.dsc, APPEND, MEGABYTES 1000\n\n-- Report status every 60 minutes\nREPORT AT 01:00\nREPORTCOUNT EVERY 60 MINUTES, RATE\n\n-- Map source tables to target tables\n-- Format: MAP source_schema.table, TARGET target_schema.table\n-- Use identical names here since source and target schema names are same\nMAP hr.employees,   TARGET hr.employees;\nMAP hr.departments, TARGET hr.departments;\nMAP hr.jobs,        TARGET hr.jobs;\nMAP hr.locations,   TARGET hr.locations;\nMAP hr.countries,   TARGET hr.countries;\nMAP hr.regions,     TARGET hr.regions;\n\n-- To map entire schema (wildcard):\n-- MAP hr.*, TARGET hr.*;\n\n-- Example of column transformation (rename column):\n-- MAP hr.employees, TARGET hr.employees,\n--   COLMAP (\n--     employee_id = employee_id,\n--     full_name   = CONCAT(first_name, ' ', last_name)\n--   );<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is <code>ASSUMETARGETDEFS<\/code>?<\/strong> This tells Replicat that source and target table definitions are identical \u2014 same column names, same data types, same order. This avoids the overhead of comparing definitions on every record. Remove this parameter and create a <code>defgen<\/code> definitions file if source and target structures differ.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">11.2 \u2014 Add Replicat Process<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server \u2014 launch GGSCI\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Login to target database\nGGSCI&gt; DBLOGIN USERIDALIAS TARGETDB\n\n-- Add Replicat process\n-- EXTTRAIL = read from remote trail files (written by Data Pump)\n-- CHECKPOINTTABLE = use checkpoint table to track position\nGGSCI&gt; ADD REPLICAT repgora, EXTTRAIL .\/dirdat\/rt, CHECKPOINTTABLE ggadmin.ggchkpt\n\n-- Verify Replicat was added\nGGSCI&gt; INFO REPLICAT repgora<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">12. Initial Load \u2014 Synchronize Existing Data<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why initial load?<\/strong> The Extract we configured in Section 9 captures only NEW changes going forward from the point it was added. But the source tables already have existing data that needs to be copied to the target. The initial load copies all existing data from source to target so that Replicat starts with a consistent baseline.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Initial load must happen AFTER Extract is added and running<\/strong> so that any changes during the initial load are captured by Extract and delivered to the target by Replicat after the initial load completes.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.1 \u2014 Method 1: Initial Load Using Oracle Data Pump (Recommended)<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why Data Pump for initial load?<\/strong> It is the fastest method for large databases. It exports data directly from source to target without going through GoldenGate trail files.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># STEP 1 \u2014 On SOURCE: Note the current SCN before starting export\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Note this SCN \u2014 you will need it to configure Replicat start position\nSELECT current_scn FROM v$database;\n-- Example output: 1234567<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># STEP 2 \u2014 Export data from source using Data Pump\nexpdp system\/Oracle_123@SOURCEDB \\\n    SCHEMAS=HR \\\n    CONTENT=DATA_ONLY \\\n    DUMPFILE=hr_data.dmp \\\n    LOGFILE=hr_data_exp.log \\\n    DIRECTORY=DATA_PUMP_DIR \\\n    FLASHBACK_SCN=1234567\n\n# STEP 3 \u2014 Copy dump to target\nscp \/oracle\/admin\/SOURCEDB\/dpdump\/hr_data.dmp \\\n    oracle@dbserver02:\/oracle\/admin\/TARGETDB\/dpdump\/\n\n# STEP 4 \u2014 Import data into target\nimpdp system\/Oracle_123@TARGETDB \\\n    SCHEMAS=HR \\\n    CONTENT=DATA_ONLY \\\n    DUMPFILE=hr_data.dmp \\\n    LOGFILE=hr_data_imp.log \\\n    DIRECTORY=DATA_PUMP_DIR \\\n    TABLE_EXISTS_ACTION=REPLACE<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># STEP 5 \u2014 After import completes\n# Start Replicat at the SCN noted in Step 1\n# This ensures Replicat applies only changes that happened AFTER the export\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; DBLOGIN USERIDALIAS TARGETDB\n\n-- Start Replicat from the SCN captured before the export\nGGSCI&gt; ADD REPLICAT repgora, EXTTRAIL .\/dirdat\/rt, \\\n         CHECKPOINTTABLE ggadmin.ggchkpt, BEGIN 2024-01-15 10:30:00\n-- OR use SCN:\nGGSCI&gt; ALTER REPLICAT repgora, SCN 1234567<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.2 \u2014 Verify Row Counts Match After Initial Load<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\nsqlplus hr\/Hr_123@SOURCEDB\n\nset linesize 150\nset pagesize 50\n\nSELECT 'EMPLOYEES'   table_name, COUNT(*) row_count FROM hr.employees   UNION ALL\nSELECT 'DEPARTMENTS' table_name, COUNT(*) row_count FROM hr.departments UNION ALL\nSELECT 'JOBS'        table_name, COUNT(*) row_count FROM hr.jobs        UNION ALL\nSELECT 'LOCATIONS'   table_name, COUNT(*) row_count FROM hr.locations\nORDER BY 1;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET \u2014 same query\nsqlplus hr\/Hr_123@TARGETDB\n\nSELECT 'EMPLOYEES'   table_name, COUNT(*) row_count FROM hr.employees   UNION ALL\nSELECT 'DEPARTMENTS' table_name, COUNT(*) row_count FROM hr.departments UNION ALL\nSELECT 'JOBS'        table_name, COUNT(*) row_count FROM hr.jobs        UNION ALL\nSELECT 'LOCATIONS'   table_name, COUNT(*) row_count FROM hr.locations\nORDER BY 1;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Row counts must match on source and target before starting Replicat. If they do not match, investigate the import log for errors and fix before proceeding.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">13. Start GoldenGate Processes and Verify<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Startup sequence matters:<\/strong> Always start processes in this order:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Manager (already running from Section 8)<\/li>\n\n\n\n<li>Extract (on source)<\/li>\n\n\n\n<li>Data Pump (on source)<\/li>\n\n\n\n<li>Replicat (on target)<\/li>\n<\/ol>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">13.1 \u2014 Start Extract on Source<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify Manager is running first\nGGSCI&gt; INFO MANAGER\n\n-- Start Extract\nGGSCI&gt; START EXTRACT extora\n\n-- Verify Extract started\nGGSCI&gt; INFO EXTRACT extora<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXTRACT    EXTORA    Last Started 2024-01-15 10:45   Status RUNNING\nCheckpoint Lag       00:00:00 (updated 00:00:02 ago)\nLog Read Checkpoint  Oracle Redo Logs\n                     2024-01-15 10:45:00  Seqno 100, RBA 1234<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">13.2 \u2014 Start Data Pump on Source<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Still in GGSCI on SOURCE\nGGSCI&gt; START EXTRACT pmpgora\n\n-- Verify Data Pump started\nGGSCI&gt; INFO EXTRACT pmpgora<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXTRACT    PMPGORA   Last Started 2024-01-15 10:46   Status RUNNING\nCheckpoint Lag       00:00:00 (updated 00:00:01 ago)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">13.3 \u2014 Start Replicat on Target<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET server\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify Manager is running\nGGSCI&gt; INFO MANAGER\n\n-- Start Replicat\nGGSCI&gt; START REPLICAT repgora\n\n-- Verify Replicat started\nGGSCI&gt; INFO REPLICAT repgora<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPLICAT   REPGORA   Last Started 2024-01-15 10:47   Status RUNNING\nCheckpoint Lag       00:00:00 (updated 00:00:03 ago)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">13.4 \u2014 View All Processes Status Together<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE \u2014 view all processes\nGGSCI&gt; INFO ALL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output on SOURCE:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Program     Status      Group       Lag at Chkpt  Time Since Chkpt\nMANAGER     RUNNING\nEXTRACT     RUNNING     EXTORA      00:00:00      00:00:05\nEXTRACT     RUNNING     PMPGORA     00:00:00      00:00:05<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET \u2014 view all processes\nGGSCI&gt; INFO ALL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output on TARGET:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Program     Status      Group       Lag at Chkpt  Time Since Chkpt\nMANAGER     RUNNING\nREPLICAT    RUNNING     REPGORA     00:00:00      00:00:05<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">14. End-to-End Replication Test<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why test?<\/strong> This is the ultimate proof that GoldenGate is working end-to-end. Insert a row on source, verify it appears on target within seconds.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">14.1 \u2014 Insert Test Row on Source<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE database\nsqlplus hr\/Hr_123@SOURCEDB\n\n-- Insert a test record\nINSERT INTO hr.employees VALUES (\n    999,\n    'GoldenGate',\n    'Test',\n    'GGTEST',\n    '555-0199',\n    SYSDATE,\n    'IT_PROG',\n    5000,\n    NULL,\n    100,\n    60\n);\nCOMMIT;\n\n-- Confirm the row is in source\nSELECT employee_id, first_name, last_name\nFROM   hr.employees\nWHERE  employee_id = 999;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">14.2 \u2014 Verify Row Appears on Target<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET database \u2014 wait 5-10 seconds then check\nsqlplus hr\/Hr_123@TARGETDB\n\n-- Check if row replicated\nSELECT employee_id, first_name, last_name\nFROM   hr.employees\nWHERE  employee_id = 999;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> The exact same row must appear on target within seconds.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">14.3 \u2014 Test UPDATE Replication<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\nUPDATE hr.employees\nSET    salary = 6000\nWHERE  employee_id = 999;\nCOMMIT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET \u2014 verify update replicated\nSELECT employee_id, first_name, salary\nFROM   hr.employees\nWHERE  employee_id = 999;\n-- salary must show 6000<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">14.4 \u2014 Test DELETE Replication<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\nDELETE FROM hr.employees WHERE employee_id = 999;\nCOMMIT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET \u2014 verify delete replicated\nSELECT COUNT(*) FROM hr.employees WHERE employee_id = 999;\n-- Must return 0<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">15. DDL Replication Configuration<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is DDL replication?<\/strong> DDL (Data Definition Language) replication captures and replicates structural changes \u2014 CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX etc. \u2014 from source to target. Without DDL replication, if someone adds a column to a table on source, you must manually add it on target too or Replicat will fail.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>DDL replication requires Oracle Enterprise Edition and specific GoldenGate setup.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">15.1 \u2014 Install DDL Replication Objects on Source<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE server \u2014 run DDL setup scripts as SYSDBA\nsu - oracle\ncd $GG_HOME\n\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Run GoldenGate DDL setup script\n-- This creates internal GoldenGate objects for DDL capture\n@marker_setup.sql\n-- When prompted: enter ggadmin as the GoldenGate schema\n\n@ddl_setup.sql\n-- When prompted: enter ggadmin and confirm\n\n@role_setup.sql\n-- Creates GGS_GGSUSER_ROLE\n\n-- Grant DDL role to ggadmin\nGRANT GGS_GGSUSER_ROLE TO ggadmin;\n\n@ddl_enable.sql\n-- Enables DDL triggers for capture<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">15.2 \u2014 Add DDL Parameter to Extract<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE \u2014 edit Extract parameter file to add DDL capture\nvi $GG_HOME\/dirprm\/extora.prm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add DDL section after existing content:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Add DDL replication\n-- Capture all DDL on the replicated schemas\nDDL INCLUDE MAPPED\n\n-- Optional: exclude specific DDL operations\n-- DDL INCLUDE MAPPED EXCLUDE OBJNAME hr.temp_*<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">15.3 \u2014 Add DDL Parameter to Replicat<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET \u2014 edit Replicat parameter file to add DDL apply\nvi $GG_HOME\/dirprm\/repgora.prm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add DDL section:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Apply DDL received from source\nDDL\n\n-- Optional error handling for DDL\nDDLERROR DEFAULT IGNORE RETRYOP MAXRETRIES 3 RETRYDELAY 5<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">15.4 \u2014 Restart Extract and Replicat After DDL Changes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; STOP EXTRACT extora\nGGSCI&gt; STOP EXTRACT pmpgora\nGGSCI&gt; START EXTRACT extora\nGGSCI&gt; START EXTRACT pmpgora\nGGSCI&gt; INFO ALL<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># On TARGET\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; STOP REPLICAT repgora\nGGSCI&gt; START REPLICAT repgora\nGGSCI&gt; INFO ALL<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">16. Monitoring GoldenGate<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why monitor?<\/strong> GoldenGate processes can lag, stop, or encounter errors silently. Regular monitoring ensures replication is current and any issues are caught early before they become a problem.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">16.1 \u2014 Check All Process Status<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Quick status of all processes\nGGSCI&gt; INFO ALL\n\n-- Detailed status of specific process\nGGSCI&gt; INFO EXTRACT extora, DETAIL\nGGSCI&gt; INFO EXTRACT pmpgora, DETAIL\nGGSCI&gt; INFO REPLICAT repgora, DETAIL<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">16.2 \u2014 Check Lag<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is lag?<\/strong> Lag is the time difference between when a transaction was committed on the source and when it was applied on the target. A lag of 0 means the target is fully current. Lag of 5 minutes means the target is 5 minutes behind the source.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Check lag on Extract (how far behind source DB)\nGGSCI&gt; LAG EXTRACT extora\n\n-- Check lag on Replicat (how far behind received trail files)\nGGSCI&gt; LAG REPLICAT repgora\n\n-- Check lag with statistics\nGGSCI&gt; STATS EXTRACT extora, TOTAL\nGGSCI&gt; STATS REPLICAT repgora, TOTAL<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">16.3 \u2014 View Process Report Files<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Report files contain detailed information about what each GoldenGate process is doing, any warnings, and statistics. They are the first place to look when troubleshooting.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- View Extract report file\nGGSCI&gt; VIEW REPORT extora\n\n-- View Data Pump report file\nGGSCI&gt; VIEW REPORT pmpgora\n\n-- View Replicat report file\nGGSCI&gt; VIEW REPORT repgora<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">16.4 \u2014 View Discard Files<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Discard files contain records that GoldenGate could not process or apply. These indicate data integrity issues that must be investigated.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check if discard files have content\nls -lh $GG_HOME\/dirrpt\/*.dsc\n\n# View discard file contents\ncat $GG_HOME\/dirrpt\/repgora.dsc\n\n# Check Extract discard file\ncat $GG_HOME\/dirrpt\/extora.dsc<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">16.5 \u2014 Check GoldenGate Trail Files<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- List all trail files and their status\nGGSCI&gt; INFO EXTTRAIL .\/dirdat\/lt*\nGGSCI&gt; INFO RMTTRAIL .\/dirdat\/rt*\n\n-- Check trail file details\nGGSCI&gt; INFO EXTTRAIL .\/dirdat\/lt, DETAIL<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Check trail file sizes on filesystem\nls -lh $GG_HOME\/dirdat\/lt*   # Source local trails\nls -lh $GG_HOME\/dirdat\/rt*   # Target remote trails\n\n# Check total size\ndu -sh $GG_HOME\/dirdat\/<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">16.6 \u2014 Monitor via SQL \u2014 GoldenGate Statistics<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE \u2014 check GoldenGate heartbeat table if configured\n-- Check GoldenGate supplemental logging is still active\nSELECT supplemental_log_data_min FROM v$database;\n\n-- Check LogMiner registration for Extract\nSELECT capture_name, status, captured_scn, applied_scn\nFROM   dba_capture\nORDER BY capture_name;\n\n-- Check archive destination errors\nSELECT dest_id, status, error\nFROM   v$archive_dest\nWHERE  status != 'INACTIVE';<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">17. Post-Installation Checks<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Complete all post-installation checks before handing over the GoldenGate configuration to the application team or declaring the setup complete.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.1 \u2014 Verify All Processes Are Running<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On SOURCE\nsu - oracle\ncd $GG_HOME\n.\/ggsci<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; INFO ALL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>All processes must show RUNNING. Any ABENDED process means there is an error.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.2 \u2014 Verify Lag is Zero or Near Zero<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>GGSCI&gt; LAG EXTRACT extora\nGGSCI&gt; LAG REPLICAT repgora<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.3 \u2014 Verify No Records in Discard Files<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Discard files should be empty or not exist\nls -lh $GG_HOME\/dirrpt\/*.dsc\nwc -l $GG_HOME\/dirrpt\/repgora.dsc<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.4 \u2014 Verify Checkpoint Table Has Entries<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE database\nsqlplus ggadmin\/GGadmin_123@SOURCEDB\n\nset linesize 200\nset pagesize 100\ncol group_name  for a15\ncol log_cmplt   for a25\ncol log_read    for a25\n\nSELECT group_name, log_cmplt, log_read\nFROM   ggadmin.ggchkpt\nORDER BY group_name;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET database\nsqlplus ggadmin\/GGadmin_123@TARGETDB\n\nSELECT group_name, log_cmplt, log_read\nFROM   ggadmin.ggchkpt\nORDER BY group_name;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.5 \u2014 Verify Supplemental Logging is Active<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\nsqlplus \/ as sysdba\n\n-- Database level\nSELECT supplemental_log_data_min FROM v$database;\n\n-- Table level \u2014 verify for all replicated tables\nset linesize 200\nset pagesize 100\ncol owner          for a15\ncol log_group_name for a30\ncol table_name     for a25\ncol log_group_type for a30\n\nSELECT owner, log_group_name, table_name, log_group_type\nFROM   dba_log_groups\nWHERE  owner = 'HR'\nORDER BY table_name;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.6 \u2014 Check GoldenGate Alert Logs<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># GoldenGate writes errors to ggserr.log (main error log)\n# This is one of the first places to check for any issues\ntail -200 $GG_HOME\/ggserr.log\n\n# Check for errors or warnings\ngrep -E \"ERROR|WARNING|ABEND\" $GG_HOME\/ggserr.log | tail -50<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.7 \u2014 Verify ENABLE_GOLDENGATE_REPLICATION on Both DBs<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE and TARGET\nsqlplus \/ as sysdba\n\nSHOW PARAMETER enable_goldengate_replication;\n-- Must show: TRUE<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">17.8 \u2014 Final Row Count Comparison<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On SOURCE\nsqlplus hr\/Hr_123@SOURCEDB\n\nset linesize 150\nset pagesize 50\ncol table_name for a20\ncol row_count  for 9999999\n\nSELECT 'EMPLOYEES'   table_name, COUNT(*) row_count FROM hr.employees   UNION ALL\nSELECT 'DEPARTMENTS' table_name, COUNT(*) row_count FROM hr.departments UNION ALL\nSELECT 'JOBS'        table_name, COUNT(*) row_count FROM hr.jobs        UNION ALL\nSELECT 'LOCATIONS'   table_name, COUNT(*) row_count FROM hr.locations   UNION ALL\nSELECT 'COUNTRIES'   table_name, COUNT(*) row_count FROM hr.countries   UNION ALL\nSELECT 'REGIONS'     table_name, COUNT(*) row_count FROM hr.regions\nORDER BY 1;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On TARGET \u2014 same query \u2014 all counts must match\nsqlplus hr\/Hr_123@TARGETDB\n\nSELECT 'EMPLOYEES'   table_name, COUNT(*) row_count FROM hr.employees   UNION ALL\nSELECT 'DEPARTMENTS' table_name, COUNT(*) row_count FROM hr.departments UNION ALL\nSELECT 'JOBS'        table_name, COUNT(*) row_count FROM hr.jobs        UNION ALL\nSELECT 'LOCATIONS'   table_name, COUNT(*) row_count FROM hr.locations   UNION ALL\nSELECT 'COUNTRIES'   table_name, COUNT(*) row_count FROM hr.countries   UNION ALL\nSELECT 'REGIONS'     table_name, COUNT(*) row_count FROM hr.regions\nORDER BY 1;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">18. Quick Reference Card<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Task<\/th><th>Command<\/th><\/tr><\/thead><tbody><tr><td>Launch GGSCI<\/td><td><code>cd $GG_HOME &amp;&amp; .\/ggsci<\/code><\/td><\/tr><tr><td>Status all processes<\/td><td><code>GGSCI&gt; INFO ALL<\/code><\/td><\/tr><tr><td>Start Manager<\/td><td><code>GGSCI&gt; START MANAGER<\/code><\/td><\/tr><tr><td>Stop Manager<\/td><td><code>GGSCI&gt; STOP MANAGER<\/code><\/td><\/tr><tr><td>Info Manager<\/td><td><code>GGSCI&gt; INFO MANAGER<\/code><\/td><\/tr><tr><td>Start Extract<\/td><td><code>GGSCI&gt; START EXTRACT extora<\/code><\/td><\/tr><tr><td>Stop Extract<\/td><td><code>GGSCI&gt; STOP EXTRACT extora<\/code><\/td><\/tr><tr><td>Info Extract<\/td><td><code>GGSCI&gt; INFO EXTRACT extora, DETAIL<\/code><\/td><\/tr><tr><td>Start Data Pump<\/td><td><code>GGSCI&gt; START EXTRACT pmpgora<\/code><\/td><\/tr><tr><td>Stop Data Pump<\/td><td><code>GGSCI&gt; STOP EXTRACT pmpgora<\/code><\/td><\/tr><tr><td>Start Replicat<\/td><td><code>GGSCI&gt; START REPLICAT repgora<\/code><\/td><\/tr><tr><td>Stop Replicat<\/td><td><code>GGSCI&gt; STOP REPLICAT repgora<\/code><\/td><\/tr><tr><td>Info Replicat<\/td><td><code>GGSCI&gt; INFO REPLICAT repgora, DETAIL<\/code><\/td><\/tr><tr><td>Check lag Extract<\/td><td><code>GGSCI&gt; LAG EXTRACT extora<\/code><\/td><\/tr><tr><td>Check lag Replicat<\/td><td><code>GGSCI&gt; LAG REPLICAT repgora<\/code><\/td><\/tr><tr><td>Statistics Extract<\/td><td><code>GGSCI&gt; STATS EXTRACT extora, TOTAL<\/code><\/td><\/tr><tr><td>Statistics Replicat<\/td><td><code>GGSCI&gt; STATS REPLICAT repgora, TOTAL<\/code><\/td><\/tr><tr><td>View Extract report<\/td><td><code>GGSCI&gt; VIEW REPORT extora<\/code><\/td><\/tr><tr><td>View Replicat report<\/td><td><code>GGSCI&gt; VIEW REPORT repgora<\/code><\/td><\/tr><tr><td>Add credentialstore<\/td><td><code>GGSCI&gt; ALTER CREDENTIALSTORE ADD USER ggadmin PASSWORD pwd ALIAS SOURCEDB<\/code><\/td><\/tr><tr><td>DB login (GGSCI)<\/td><td><code>GGSCI&gt; DBLOGIN USERIDALIAS SOURCEDB<\/code><\/td><\/tr><tr><td>Add checkpoint table<\/td><td><code>GGSCI&gt; ADD CHECKPOINTTABLE ggadmin.ggchkpt<\/code><\/td><\/tr><tr><td>Register Extract<\/td><td><code>GGSCI&gt; REGISTER EXTRACT extora DATABASE<\/code><\/td><\/tr><tr><td>Add Extract<\/td><td><code>GGSCI&gt; ADD EXTRACT extora, TRANLOG, BEGIN NOW<\/code><\/td><\/tr><tr><td>Add trail<\/td><td><code>GGSCI&gt; ADD EXTTRAIL .\/dirdat\/lt, EXTRACT extora, MEGABYTES 500<\/code><\/td><\/tr><tr><td>Add Data Pump<\/td><td><code>GGSCI&gt; ADD EXTRACT pmpgora, EXTTRAILSOURCE .\/dirdat\/lt<\/code><\/td><\/tr><tr><td>Add remote trail<\/td><td><code>GGSCI&gt; ADD RMTTRAIL .\/dirdat\/rt, EXTRACT pmpgora, MEGABYTES 500<\/code><\/td><\/tr><tr><td>Add Replicat<\/td><td><code>GGSCI&gt; ADD REPLICAT repgora, EXTTRAIL .\/dirdat\/rt, CHECKPOINTTABLE ggadmin.ggchkpt<\/code><\/td><\/tr><tr><td>List trail files<\/td><td><code>GGSCI&gt; INFO EXTTRAIL .\/dirdat\/lt*<\/code><\/td><\/tr><tr><td>View error log<\/td><td><code>tail -200 $GG_HOME\/ggserr.log<\/code><\/td><\/tr><tr><td>Check discard file<\/td><td><code>cat $GG_HOME\/dirrpt\/repgora.dsc<\/code><\/td><\/tr><tr><td>Enable suplog DB<\/td><td><code>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;<\/code><\/td><\/tr><tr><td>Enable suplog table<\/td><td><code>ALTER TABLE hr.employees ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;<\/code><\/td><\/tr><tr><td>Check suplog<\/td><td><code>SELECT supplemental_log_data_min FROM v$database;<\/code><\/td><\/tr><tr><td>Enable GG param<\/td><td><code>ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;<\/code><\/td><\/tr><tr><td>Create subdirs<\/td><td><code>GGSCI&gt; CREATE SUBDIRS<\/code><\/td><\/tr><tr><td>MOS GG Install Guide<\/td><td>Doc ID 1411356.1<\/td><\/tr><tr><td>MOS GG Best Practices<\/td><td>Doc ID 1298817.1<\/td><\/tr><tr><td>MOS GG Certification<\/td><td>Doc ID 2193391.1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">This SOP covers everything you need to install and configure Oracle GoldenGate 19c on Linux from scratch without referring to any other source. Always enable supplemental logging before starting Extract, always use credential store instead of plain text passwords in parameter files, always perform an end-to-end DML test before declaring the configuration ready, and always monitor the ggserr.log and discard files regularly to catch any replication issues early.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A complete production-ready SOP for installing and configuring Oracle GoldenGate 19c on Linux from scratch. Covers GoldenGate architecture, source and target preparation, Manager configuration, Extract setup, Data Pump configuration, Replicat setup, initial load, DDL replication, monitoring, and full validation \u2014 with real commands, expected outputs, and consultant-level notes for both classic and Microservices architecture. 1. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5787,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowu461DA:productID":"","footnotes":""},"categories":[1534],"tags":[],"class_list":["post-5770","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle-sop"],"_links":{"self":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/comments?post=5770"}],"version-history":[{"count":2,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5770\/revisions"}],"predecessor-version":[{"id":5813,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5770\/revisions\/5813"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media\/5787"}],"wp:attachment":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media?parent=5770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/categories?post=5770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/tags?post=5770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}