Tuesday, July 1, 2025

Standby Database set up using Primary Service || Oracle Data Guard (ODG)

  • Introduction: Oracle Data Guard (ODG) is a high-availability, disaster recovery, and data protection feature or solution provided by Oracle Database. It ensures the availability of critical data by maintaining one or more synchronized standby databases as replicas of a primary database. These standby databases can be used for disaster recovery, reporting, or backups, minimizing downtime and data loss in the event of unexpected failures. So here we will do Standby database set up in an easy and step by step manner. We will use RESTORE from PRIMARY SERVICE method here which is suitable for small database size. Also for this a good network bandwith is required between Primary & Standby.

  • Prerequisites:

  • o Primary server with Oracle database Software installed and running database.
    o Standby server with Oracle database Software installed.
    o Connectivity between Primary and Standby server.

  • Environment:
  • Server Primary Standby
    Hostname Source Target
    IP 192.168.80.51 192.168.80.111
    OS OEL 9 OEL 9
    SID ORCLDC ORCLDR
    Service Name ORCLDC ORCLDR

  • Now start configuring the ODG:

1. Connectivity Test

==> From Source to Target:

[oracle@source ~]$ ping -c 3 target.localdomain PING target.localdomain (192.168.80.111) 56(84) bytes of data. 64 bytes from target.localdomain (192.168.80.111): icmp_seq=1 ttl=64 time=0.678 ms 64 bytes from target.localdomain (192.168.80.111): icmp_seq=2 ttl=64 time=0.456 ms 64 bytes from target.localdomain (192.168.80.111): icmp_seq=3 ttl=64 time=0.924 ms --- target.localdomain ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2107ms rtt min/avg/max/mdev = 0.456/0.686/0.924/0.191 ms

==> From Target to Source:

[oracle@target ~]$ ping -c 3 source.localdomain PING source.localdomain (192.168.80.51) 56(84) bytes of data. 64 bytes from source.localdomain (192.168.80.51): icmp_seq=1 ttl=64 time=0.690 ms 64 bytes from source.localdomain (192.168.80.51): icmp_seq=2 ttl=64 time=6.61 ms 64 bytes from source.localdomain (192.168.80.51): icmp_seq=3 ttl=64 time=0.315 ms --- source.localdomain ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 0.315/2.536/6.605/2.880 ms
2. Primary Database setup
First fetch some details about Primary Database:

[oracle@source ~]$ sqlplus / as sysdba

SQL> def
DEFINE _DATE              = "18-JAN-25" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "orcldc" (CHAR)
DEFINE _USER              = "SYS" (CHAR)
DEFINE _PRIVILEGE         = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE   = "1924000000" (CHAR)
DEFINE _EDITOR            = "vi" (CHAR)
DEFINE _O_VERSION         = "Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.24.0.0.0" (CHAR)
DEFINE _O_RELEASE         = "1924000000" (CHAR)

SQL> set lines 200 pages 1000
col open_mode for a15
col HOST_NAME for a15

NAME      DATABASE_ROLE    OPEN_MODE       LOG_MODE
--------  ---------------- --------------- ------------
ORCL      PRIMARY          READ WRITE      ARCHIVELOG

SQL> select banner, banner_full from v$version;

BANNER
--------------------------------------------------------------------------------
BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.24.0.0.0

SQL> col name for a70
SQL> select file#, name from v$datafile;

FILE# NAME
----- ----------------------------------------------------------------------
1     /u01/app/oracle/oradata/ORCL/system01.dbf
3     /u01/app/oracle/oradata/ORCL/sysaux01.dbf
4     /u01/app/oracle/oradata/ORCL/undotbs01.dbf
5     /u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf
6     /u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf
7     /u01/app/oracle/oradata/ORCL/users01.dbf
8     /u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf
9     /u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf
10    /u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf
11    /u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf
12    /u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf

11 rows selected.

SQL> select name from v$controlfile;

NAME
----------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/control01.ctl
/u01/app/oracle/fast_recovery_area/ORCL/control02.ctl

SQL> col MEMBER for a40
SQL> select group#, type, MEMBER from v$logfile order by group#;

GROUP# TYPE    MEMBER
------ ------- ----------------------------------------
1      ONLINE  /u01/app/oracle/oradata/ORCL/redo01.log
2      ONLINE  /u01/app/oracle/oradata/ORCL/redo02.log
3      ONLINE  /u01/app/oracle/oradata/ORCL/redo03.log

** If database is in NOARCHIVELOG mode then do below steps:

ALTER SYSTEM SET db_recovery_file_dest='/u01/app/oracle/fast_recovery_area' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest_size=50G SCOPE=BOTH;
SHUT IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

Now let's do changes in Primary Database for ODG:

SQL> SELECT name, force_logging, log_mode FROM v$database;
NAME    FORCE_LOGGING  LOG_MODE
------- -------------- ------------
ORCL    NO             ARCHIVELOG

SQL> ALTER DATABASE FORCE LOGGING;
Database altered.

SQL> SELECT name, force_logging, log_mode FROM v$database;
NAME    FORCE_LOGGING  LOG_MODE
------- -------------- ------------
ORCL    YES            ARCHIVELOG

SQL> SHOW PARAMETER db_name;
NAME        TYPE    VALUE
----------- ------- ------------------------------
db_name     string  orcl

SQL> SHOW PARAMETER db_unique_name;
NAME             TYPE    VALUE
---------------- ------- ------------------------------
db_unique_name   string  ORCLDC

SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORCLDC,ORCLDR)';
System altered.

SQL> SHOW PARAMETER LOG_ARCHIVE_CONFIG;
NAME                TYPE    VALUE
------------------- ------- ------------------------------
log_archive_config  string  DG_CONFIG=(ORCLDC,ORCLDR)

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=ORCLDR NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCLDR';
System altered.

SQL> SHOW PARAMETER LOG_ARCHIVE_DEST_2;
NAME                  TYPE    VALUE
--------------------- ------- -------------------------------------------------------
log_archive_dest_2    string  SERVICE=ORCLDR NOAFFIRM ASYNC
                               VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
                               DB_UNIQUE_NAME=ORCLDR

log_archive_dest_20   string
log_archive_dest_21   string
log_archive_dest_22   string
log_archive_dest_23   string
log_archive_dest_24   string
log_archive_dest_25   string
log_archive_dest_26   string
log_archive_dest_27   string
log_archive_dest_28   string
log_archive_dest_29   string

SQL> SHOW PARAMETER LOG_ARCHIVE_FORMAT;
NAME                  TYPE    VALUE
--------------------- ------- ------------------------------
log_archive_format    string  %t_%s_%r.dbf

SQL> ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE;
System altered.

SQL> SHOW PARAMETER LOG_ARCHIVE_FORMAT;
NAME                  TYPE    VALUE
--------------------- ------- ------------------------------
log_archive_format    string  %t_%s_%r.dbf

SQL> ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=30 SCOPE=SPFILE;
System altered.

SQL> ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
System altered.

SQL> ALTER SYSTEM SET FAL_SERVER=ORCLDR;
System altered.

SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
System altered.

SQL> ALTER SYSTEM SET archive_lag_target=900;
System altered.

Now we need to set DB_FILE_NAME_CONVERT & LOG_FILE_NAME_CONVERT parameter so that datafile and logfile locations will be converted automatically from Primary to Standby and vice-versa.

SQL> ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/ORCLDR','/u01/app/oracle/oradata/ORCL' SCOPE=SPFILE;
System altered.

SQL> ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/ORCLDR','/u01/app/oracle/oradata/ORCL' SCOPE=SPFILE;
System altered.

Now just take a bounce of Database so that all parameter will get reflects.

SQL> SHUT IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> STARTUP;
ORACLE instance started.
Total System Global Area     1459616616 bytes
Fixed Size                      9177960 bytes
Variable Size                 905969664 bytes
Database Buffers              536870912 bytes
Redo Buffers                    7598080 bytes
Database mounted.
Database opened.

SQL> SHOW PDBS;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO

SQL> SHOW PARAMETER LOG_ARCHIVE_FORMAT;
NAME                  TYPE     VALUE
--------------------- -------- ------------------------------
log_archive_format    string   %t_%s_%r.arc

SQL> SHOW PARAMETER LOG_ARCHIVE_MAX_PROCESSES;
NAME                       TYPE     VALUE
-------------------------- -------- ------------------------------
log_archive_max_processes  integer  30

SQL> SHOW PARAMETER REMOTE_LOGIN_PASSWORDFILE;
NAME                        TYPE     VALUE
--------------------------- -------- ------------------------------
remote_login_passwordfile   string   EXCLUSIVE

Now add standby redo logfiles which will be used to apply the changes whenever primary becomes standby. Number of Standby logs should be one more than the number of Online logs.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo01.log') SIZE 200M;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo02.log') SIZE 200M;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo03.log') SIZE 200M;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ORCL/standby_redo04.log') SIZE 200M;
Database altered.

SQL> SELECT group#, type, member FROM v$logfile ORDER BY group#;
GROUP#  TYPE     MEMBER
------  -------  -------------------------------------------------------------------------------
1       ONLINE   /u01/app/oracle/oradata/ORCL/redo01.log
2       ONLINE   /u01/app/oracle/oradata/ORCL/redo02.log
3       ONLINE   /u01/app/oracle/oradata/ORCL/redo03.log
4       STANDBY  /u01/app/oracle/oradata/ORCL/standby_redo01.log
5       STANDBY  /u01/app/oracle/oradata/ORCL/standby_redo02.log
6       STANDBY  /u01/app/oracle/oradata/ORCL/standby_redo03.log
7       STANDBY  /u01/app/oracle/oradata/ORCL/standby_redo04.log

7 rows selected.

3. Primary Service setup

[oracle@source ~]$ cd $ORACLE_HOME/network/admin
[oracle@source admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

ORCLDC =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = source.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcldc)
    )
  )

ORCLDR =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = target.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcldr)
    )
  )

4.Primary Database and files backup
Create pfile:

SQL> create pfile='/u01/app/oracle/rmandc/initorcldc.ora' from spfile;
  
Copy password file:

[oracle@source rmandc]$ cd $ORACLE_HOME/dbs
[oracle@source dbs]$ cp orapworcldc /u01/app/oracle/rmandc/
 
  
5.Transfer password & pfile from Primary to Standby

[oracle@source dbs]$ cd /u01/app/oracle/rmandc/
[oracle@source rmandc]$ ls -lrth
total 1.3G
-rw-r--r--. 1 oracle oinstall 1.6K Jan 18 11:28 initorcldc.ora
-rw-r-----. 1 oracle oinstall 2.0K Jan 18 11:39 orapworcldc
[oracle@source rmandc]$ scp * oracle@target:/u01/app/oracle/rmandr
The authenticity of host 'target (192.168.80.111)' can't be established.
ED25519 key fingerprint is SHA256:u1O6svnS8kY1i6Mv88TDIlYsvqDyISi2Uz3ZBc8kKfY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'target' (ED25519) to the list of known hosts.
oracle@target's password:
initorcldc.ora                                100%   1632    52.9KB/s   00:00
orapworcldc                                   100%   2048   105.3KB/s   00:00
   
6.Standby Database setup
Do the changes in Primary pfile and create pfile initorcldr.ora for Standby. Below parameters have been modified. Sample file is shown further below:

*.audit_file_dest='/u01/app/oracle/admin/orcldr/adump'
*.control_files='/u01/app/oracle/oradata/ORCLDR/control01.ctl','/u01/app/oracle/fast_recovery_area/ORCLDR/control02.ctl'
*.db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDR'
*.db_unique_name='ORCLDR'
*.log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDR'
*.fal_server='ORCLDC'
*.log_archive_dest_2='SERVICE=ORCLDC NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCLDC'



orcldr.__data_transfer_cache_size=0
orcldr.__db_cache_size=486539264
orcldr.__inmemory_ext_roarea=0
orcldr.__inmemory_ext_rwarea=0
orcldr.__java_pool_size=16777216
orcldr.__large_pool_size=16777216
orcldr.__oracle_base='/u01/app/oracle'  # ORACLE_BASE set from environment
orcldr.__pga_aggregate_target=587202560
orcldr.__sga_target=872415232
orcldr.__shared_io_pool_size=50331648
orcldr.__shared_pool_size=285212672
orcldr.__streams_pool_size=0
orcldr.__unified_pga_pool_size=0
*.archive_lag_target=900
*.audit_file_dest='/u01/app/oracle/admin/orcldr/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/u01/app/oracle/oradata/ORCLDR/control01.ctl','/u01/app/oracle/fast_recovery_area/ORCLDR/control02.ctl'
*.db_block_size=8192
*.db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDR'
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=8192m
*.db_unique_name='ORCLDR'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orcldcXDB)'
*.enable_pluggable_database=true
*.fal_server='ORCLDC'
*.log_archive_config='DG_CONFIG=(ORCLDC,ORCLDR)'
*.log_archive_dest_2='SERVICE=ORCLDC NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCLDC'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=30
*.log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDR'
*.memory_target=1384m
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'

Create required directories:

[oracle@target rmandr]$ mkdir -p /u01/app/oracle/admin/orcldr/adump
[oracle@target rmandr]$ mkdir -p /u01/app/oracle/oradata/ORCLDR/
[oracle@target rmandr]$ mkdir -p /u01/app/oracle/fast_recovery_area/ORCLDR/

Copy password file in $ORACLE_HOME/dbs :

[oracle@target rmandr]$ cp orapworcldc $ORACLE_HOME/dbs/orapworcldr
[oracle@target rmandr]$ ls -lrth $ORACLE_HOME/dbs/orapworcldr
-rw-r-----. 1 oracle oinstall 2.0K Jan 18 12:02 /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapworcldr

Create listener using NETCA. Start it. Also add TNS service entries for Primary & Standby in tnsnames.ora file.

Refer Create listener using NETCA


[oracle@target ~]$ 
[oracle@target ~]$ cd $ORACLE_HOME/network/admin
[oracle@target admin]$
[oracle@target admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = target.localdomain)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
   (SID_LIST =
      (SID_DESC = (GLOBAL_DBNAME =  orcldr)
                  (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
                  (SID_NAME =  orcldr)
       )
    )
[oracle@target admin]$
[oracle@target admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.


ORCLDC =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = source.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcldc)
    )
  )


ORCLDR =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = target.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcldr)
    )
  )

[oracle@target admin]$ lsnrctl start
Copyright (c) 1991, 2024, Oracle.  All rights reserved.
Starting /u01/app/oracle/product/19.0.0/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/target/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=target.localdomain)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=target.localdomain)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                18-JAN-2025 12:09:54
Uptime                    0 days 0 hr. 0 min. 2 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/target/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=target.localdomain)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  Services Summary...
Service "ORCLDR" has 1 instance(s).
  Instance "orcldr", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

7.Startup Standby instance.

[oracle@target ~]$ . oraenv
ORACLE_SID = [orcl] ? orcldr
ORACLE_HOME = [/home/oracle] ? /u01/app/oracle/product/19.0.0/dbhome_1
The Oracle base remains unchanged with value /u01/app/oracle

[oracle@target ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 18 12:13:03 2025
Version 19.24.0.0.0

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Connected to an idle instance.
SQL> startup nomount pfile='/u01/app/oracle/rmandr/initorcldr.ora';
ORACLE instance started.

Total System Global Area 1459616616 bytes
Fixed Size                  9177960 bytes
Variable Size             905969664 bytes
Database Buffers          536870912 bytes
Redo Buffers                7598080 bytes
SQL>

SQL> def
DEFINE _DATE           = "18-JAN-25" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "orcldr" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1924000000" (CHAR)
DEFINE _EDITOR         = "vi" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.24.0.0.0" (CHAR)
DEFINE _O_RELEASE      = "1924000000" (CHAR)
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.24.0.0.0
[oracle@target ~]$

8. Now connect with RMAN & restore the controlfile using Primary Sevice. Post that Mount the database.

[oracle@target ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sun Jan 18 11:28:39 2025
Version 19.24.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (not mounted)

RMAN>

RMAN> restore standby controlfile from service 'orcldc';
restore standby controlfile from service 'orcldc';
Starting restore at 18-JAN-25
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=21 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:04
output file name=/u01/app/oracle/oradata/ORCLDR/control01.ctl
output file name=/u01/app/oracle/fast_recovery_area/ORCLDR/control02.ctl
Finished restore at 18-JAN-25


RMAN>

RMAN> alter database mount;
alter database mount;
released channel: ORA_DISK_1
Statement processed

RMAN>

8. Now run the below RMAN script and restore Standby from Primary service.
run
{
restore database from service 'orcldc';
}


RMAN> run
{
restore database from service 'orcldc';
}run
2> {
3> restore database from service 'orcldc';
4>
}
Starting restore at 18-JAN-25
Starting implicit crosscheck backup at 18-JAN-25
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=21 device type=DISK
Crosschecked 27 objects
Finished implicit crosscheck backup at 18-JAN-25

Starting implicit crosscheck copy at 18-JAN-25
using channel ORA_DISK_1
Finished implicit crosscheck copy at 18-JAN-25

searching for all files in the recovery area
cataloging files...
no files cataloged

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/ORCLDR/system01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:55
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/ORCLDR/sysaux01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:46
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/ORCLDR/undotbs01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/ORCLDR/pdbseed/system01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:26
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00006 to /u01/app/oracle/oradata/ORCLDR/pdbseed/sysaux01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:16
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/ORCLDR/users01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00008 to /u01/app/oracle/oradata/ORCLDR/pdbseed/undotbs01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00009 to /u01/app/oracle/oradata/ORCLDR/orclpdb/system01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:36
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00010 to /u01/app/oracle/oradata/ORCLDR/orclpdb/sysaux01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00011 to /u01/app/oracle/oradata/ORCLDR/orclpdb/undotbs01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:08
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service orcldc
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00012 to /u01/app/oracle/oradata/ORCLDR/orclpdb/users01.dbf
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 18-JAN-25


RMAN>

RMAN> report schema;
report schema;
RMAN-06139: warning: control file is not current for REPORT SCHEMA
Report of database schema for database with db_unique_name ORCLDR

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    1320     SYSTEM               ***     /u01/app/oracle/oradata/ORCLDR/system01.dbf
3    950      SYSAUX               ***     /u01/app/oracle/oradata/ORCLDR/sysaux01.dbf
4    710      UNDOTBS1             ***     /u01/app/oracle/oradata/ORCLDR/undotbs01.dbf
5    650      PDB$SEED:SYSTEM      ***     /u01/app/oracle/oradata/ORCLDR/pdbseed/system01.dbf
6    450      PDB$SEED:SYSAUX      ***     /u01/app/oracle/oradata/ORCLDR/pdbseed/sysaux01.dbf
7    5        USERS                ***     /u01/app/oracle/oradata/ORCLDR/users01.dbf
8    230      PDB$SEED:UNDOTBS1    ***     /u01/app/oracle/oradata/ORCLDR/pdbseed/undotbs01.dbf
9    660      ORCLPDB:SYSTEM       ***     /u01/app/oracle/oradata/ORCLDR/orclpdb/system01.dbf
10   520      ORCLPDB:SYSAUX       ***     /u01/app/oracle/oradata/ORCLDR/orclpdb/sysaux01.dbf
11   230      ORCLPDB:UNDOTBS1     ***     /u01/app/oracle/oradata/ORCLDR/orclpdb/undotbs01.dbf
12   5        ORCLPDB:USERS        ***     /u01/app/oracle/oradata/ORCLDR/orclpdb/users01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    20       TEMP                 32767       /u01/app/oracle/oradata/ORCLDR/temp01.dbf
2    36       PDB$SEED:TEMP        32767       /u01/app/oracle/oradata/ORCLDR/pdbseed/temp012025-01-22_00-17-43-687-AM.dbf
3    174      ORCLPDB:TEMP         32767       /u01/app/oracle/oradata/ORCLDR/orclpdb/temp01.dbf


RMAN>


RMAN> exit

Recovery Manager complete.
[oracle@target ~]$
9. Now start real time apply
Start log shipment on Primary:

SQL> alter system set log_archive_dest_state_2= ENABLE scope=both;

SQL> show parameter log_archive_dest_state_2;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_state_2             string      ENABLE
log_archive_dest_state_20            string      enable
log_archive_dest_state_21            string      enable
log_archive_dest_state_22            string      enable
log_archive_dest_state_23            string      enable
log_archive_dest_state_24            string      enable
log_archive_dest_state_25            string      enable
log_archive_dest_state_26            string      enable
log_archive_dest_state_27            string      enable
log_archive_dest_state_28            string      enable
log_archive_dest_state_29            string      enable

SQL> set lines 200 pages 1000
SQL> col DEST_NAME for a20
SQL> col DESTINATION for a20
SQL> col error for a30

SQL> select DEST_ID, DEST_NAME, STATUS, ERROR from v$archive_dest where DEST_NAME='LOG_ARCHIVE_DEST_2';

DEST_ID DEST_NAME            STATUS    ERROR
------- -------------------- --------- ------------------------------
      2 LOG_ARCHIVE_DEST_2   VALID     

SQL> select DEST_ID, DEST_NAME, DESTINATION, STATUS, ERROR 
     from v$archive_dest_status where status not in ('INVALID','INACTIVE');

DEST_ID DEST_NAME            DESTINATION          STATUS    ERROR
------- -------------------- -------------------- --------- ------------------------------
      1 LOG_ARCHIVE_DEST_1   /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch VALID     
      2 LOG_ARCHIVE_DEST_2   ORCLDR               VALID     

Start Apply At Standby:

SQL> alter database recover managed standby database disconnect from session;
SQL> select process,status,thread#,sequence#,block# from v$managed_standby where process like '%MRP%';

PROCESS   STATUS          THREAD#  SEQUENCE#     BLOCK#
--------- ------------ ---------- ---------- ----------
MRP0      APPLYING_LOG          1         26        903

Now do some log switches on Primary and check the sync.

==> On Primary:

SQL> alter system switch logfile; System altered. SQL> / System altered. SQL> / System altered. SQL> set lines 200 pages 300 alter session set nls_date_format= 'DD-MON-YYYY HH24:MI:SS'; select d.db_unique_name, a.thread#, b.last_seq, a.applied_seq, a.last_app_timestamp, b.last_seq - a.applied_seq ARC_DIFF FROM (select thread#, MAX(sequence#) applied_seq, MAX(next_time) last_app_timestamp from gv$archived_log where applied='YES' group by thread#) a, (select thread#, MAX(sequence#) last_seq from gv$archived_log group by thread#) b, (select db_unique_name from v$database) d where a.thread#=b.thread#; Session altered. DB_UNIQUE_NAME THREAD# LAST_SEQ APPLIED_SEQ LAST_APP_TIMESTAMP ARC_DIFF ------------------------------ ---------- ---------- ----------- -------------------- ---------- ORCLDC 1 29 27 18-JAN-2025 12:57:12 2

==> On Standby:

SQL> select d.db_unique_name, a.thread#, b.last_seq, a.applied_seq, b.last_seq - a.applied_seq ARC_DIFF, a.last_app_timestamp, round((sysdate - a.last_app_timestamp)*24*60,2) Gap_in_Mins, round((sysdate - a.last_app_timestamp)*24*60*60,2) Gap_in_Seconds FROM (select thread#, MAX(sequence#) applied_seq, MAX(next_time) last_app_timestamp from v$archived_log where REGISTRAR='RFS' and applied='YES' group by thread#) a, (select thread#, MAX(sequence#) last_seq from gv$archived_log group by thread#) b, (select db_unique_name from v$database) d where a.thread#=b.thread#; DB_UNIQUE_NAME THREAD# LAST_SEQ APPLIED_SEQ ARC_DIFF LAST_APP_TIMESTAMP GAP_IN_MINS GAP_IN_SECONDS ------------------------------ ---------- ---------- ----------- ---------- -------------------- ----------- -------------- ORCLDR 1 29 29 0 18-JAN-2025 12:57:18 3.78 227
10. Create tablespace on Primary and check on Standby

==> On Primary:

SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO SQL> alter session set container=ORCLPDB; Session altered. SQL> create tablespace APPDATA datafile '/u01/app/oracle/oradata/ORCL/orclpdb/appdata01.dbf' size 1g; Tablespace created.

==> On Standby:

SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED MOUNTED 3 ORCLPDB MOUNTED SQL> alter session set container=ORCLPDB; Session altered. SQL> select name from v$datafile; NAME ---------------------------------------------------------------------- /u01/app/oracle/oradata/ORCLDR/orclpdb/system01.dbf /u01/app/oracle/oradata/ORCLDR/orclpdb/sysaux01.dbf /u01/app/oracle/oradata/ORCLDR/orclpdb/undotbs01.dbf /u01/app/oracle/oradata/ORCLDR/orclpdb/users01.dbf /u01/app/oracle/oradata/ORCLDR/orclpdb/appdata01.dbf SQL> select name from v$tablespace; NAME ---------------------------------------------------------------------- SYSTEM SYSAUX UNDOTBS1 TEMP USERS APPDATA 6 rows selected.


Thanks for visiting!!

Tuesday, June 24, 2025

Prepare Database for GoldenGate Replication

  • Introduction: In the previous posts, we had covered the step-by-step installation of Oracle GoldenGate (OGG) for both Oracle and MySQL environments. Please visit those, links are given below. Now for replication we are using Oracle database as source and MySQL database as target. In this article, we will go through the essential steps to prepare Oracle (source) and MySQL (target) databases for GoldenGate .

  • Oracle GoldenGate 23ai Installation for Oracle
    Oracle GoldenGate 23ai Installation for MySQL

  • Prerequisites: Below are the minimum requirements.
    • Oracle database should be installed on source server.
    • MySQL database should be installed on target server.
    • Connectivity between GoldenGate server and database servers.

  • Environment Used:
    Server Source (Oracle) Target (MySQL) OGG (Oracle) OGG (MySQL)
    Hostname orcl.oraeasy.com mysqlOGG.oraeasy.com ogg.oraeasy.com mysqlOGG.oraeasy.com
    OS OEL 9 OEL 9 OEL 9 OEL 9
    DB Name ORCL mysqldb NA NA

    Please note that we are using the same server for MySQL Database and for its GoldenGate.

  • Now first setup the Oracle Database for GoldenGate step by step:
1. Now enable SUPPLEMENTAL_LOG_DATA and set ENABLE_GOLDENGATE_REPLICATION to TRUE. Also make sure that Database should be in ARCHIVELOG mode, if not then make it.


SQL> def
DEFINE _DATE           = "02-JUN-25" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "orcldc" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1927000000" (CHAR)
DEFINE _EDITOR         = "vi" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.0.0" (CHAR)
DEFINE _O_RELEASE      = "1927000000" (CHAR)
SQL>
SQL> SELECT name,open_mode,database_role, log_mode,supplemental_log_data_min from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SUPPLEMENTAL_LOG_DAT
--------- -------------------- ---------------- ------------ --------------------
ORCL      READ WRITE           PRIMARY          ARCHIVELOG   NO

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

SQL> SELECT name,open_mode,database_role, log_mode,supplemental_log_data_min from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SUPPLEMENTAL_LOG_DAT
--------- -------------------- ---------------- ------------ --------------------
ORCL      READ WRITE           PRIMARY          ARCHIVELOG   YES

SQL>
SQL> show parameter ENABLE_GOLDENGATE_REPLICATION

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
enable_goldengate_replication        boolean     FALSE
SQL>
SQL> ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;

System altered.

SQL> show parameter ENABLE_GOLDENGATE_REPLICATION

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
enable_goldengate_replication        boolean     TRUE
SQL>
2. Now create the tablespace in CDB and PDB.


SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL>
SQL> select name from v$datafile;

NAME
-----------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/system01.dbf
/u01/app/oracle/oradata/ORCL/sysaux01.dbf
/u01/app/oracle/oradata/ORCL/undotbs01.dbf
/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf
/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/ORCL/users01.dbf
/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/test01.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/test02.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/users02.dbf
/u01/app/oracle/oradata/ORCL/orclpdb/test03.dbf

15 rows selected.

SQL>

SQL> create tablespace OGG datafile '/u01/app/oracle/oradata/ORCL/OGGCDB01.dbf' size 1g autoextend on;

Tablespace created.

SQL>
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL>
SQL> alter session set container=ORCLPDB;

Session altered.

SQL>  create tablespace OGG datafile '/u01/app/oracle/oradata/ORCL/orclpdb/OGGPDB01.dbf' size 1g autoextend on;

Tablespace created.
3. Now create the user for GoldenGate in CDB and PDB.

SQL> alter session set container=cdb$root;

Session altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL> create user c##ogg identified by C##Ogg$123 container=all default tablespace OGG temporary tablespace TEMP;

User created.

SQL> alter user c##ogg quota unlimited on OGG;

User altered.

SQL> grant set container to c##ogg container=all;

Grant succeeded.

SQL> grant alter system to c##ogg container=all;

Grant succeeded.

SQL> grant create session to c##ogg container=all;

Grant succeeded.

SQL> grant alter any table to c##ogg container=all;

Grant succeeded.

SQL> grant connect,resource to c##ogg container=all;

Grant succeeded.

SQL> exec dbms_goldengate_auth.grant_admin_privilege('c##ogg',container=>'all');


PL/SQL procedure successfully completed.

SQL>
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL>
SQL> alter session set container=ORCLPDB;

Session altered.


SQL> create user ogg identified by OgG##123 container=current default tablespace OGG temporary tablespace TEMP;

User created.

SQL> grant create session to ogg container=current;

Grant succeeded.

SQL> grant alter any table to ogg container=current;

Grant succeeded.

SQL> grant connect,resource to ogg container=current;

Grant succeeded.

SQL> exec dbms_goldengate_auth.grant_admin_privilege('ogg');

PL/SQL procedure successfully completed.

SQL>

4. Now login to GoldenGate Console and make database connection.

Click on DB Connection and then click + sign.

Provide the Credential Domain & Alias and user id & its password. Use TNS alias which is configured. Last click on Submit.

Now click on arrow to establish connection.

Now DB connection established successfully.
5. Now add trandata information.

Click on + at TRANDATA information section.

Now give the PDB, Schema and Table name. Then click Submit.

Now search the trandata information like below and verify.


We have successfully configured the source Oracle Database for GoldenGate Replication.

  • Now we will setup the MySQL Database for GoldenGate step by step:
  • 1. Create the database.
    
    [mysql@mysqlOGG ~]$ mysql --user=root --password
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 13
    Server version: 8.4.5 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.01 sec)
    
    mysql>
    mysql> create database mysqldb;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | mysqldb            |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> use mysqldb;
    Database changed
    mysql>
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | mysqldb            |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | mysqldb    |
    +------------+
    1 row in set (0.00 sec)
    
    
    2. Now do the required changes in /etc/my.cnf for GoldenGate.
    
    [root@mysqlOGG ~]# cat /etc/my.cnf
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/8.4/en/server-configuration-defaults.html
    
    [mysqld]
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove the leading "# " to disable binary logging
    # Binary logging captures changes between backups and is enabled by
    # default. It's default setting is log_bin=binlog
    # disable_log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    
    user=mysql
    log_bin=/u01/mysql/log_bin/myDB
    datadir=/u01/mysql/data
    tmpdir=/u01/mysql/tmpdir
    
    #datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    
    #### GG Changes####
    # Required for GoldenGate
    server-id = 2                    # Unique ID in replication topology
    binlog_format = ROW             # REQUIRED by GoldenGate
    binlog_row_image = FULL         # RECOMMENDED by GoldenGate
    
    # Disable GTID (GG for MySQL doesn’t support it)
    gtid_mode = OFF
    enforce_gtid_consistency = OFF
    
    # Optional but useful
    log_slave_updates = ON          # Only needed if this will relay changes
    [root@mysqlOGG ~]#
    
    

    Restart MySQL Database.

    [root@mysqlOGG ~]# systemctl restart mysqld [root@mysqlOGG ~]#
    3. Now create user for GoldenGate.
    
    
    [mysql@mysqlOGG ~]$ mysql --user=root --password
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 9
    Server version: 8.4.5 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>  use mysqldb;
    Database changed
    mysql> SHOW VARIABLES WHERE Variable_name IN (
        ->   'server_id', 'log_bin', 'binlog_format', 'binlog_row_image',
        ->   'gtid_mode', 'enforce_gtid_consistency', 'log_slave_updates');
    +--------------------------+-------+
    | Variable_name            | Value |
    +--------------------------+-------+
    | binlog_format            | ROW   |
    | binlog_row_image         | FULL  |
    | enforce_gtid_consistency | OFF   |
    | gtid_mode                | OFF   |
    | log_bin                  | ON    |
    | log_slave_updates        | ON    |
    | server_id                | 2     |
    +--------------------------+-------+
    7 rows in set (0.01 sec)
    
    mysql>
    mysql> SELECT CURRENT_USER();
    +----------------+
    | CURRENT_USER() |
    +----------------+
    | root@localhost |
    +----------------+
    1 row in set (0.01 sec)
    
    mysql> SELECT user, host FROM mysql.user;
    +------------------+-----------+
    | user             | host      |
    +------------------+-----------+
    | mysql.infoschema | localhost |
    | mysql.session    | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    +------------------+-----------+
    4 rows in set (0.00 sec)
    
    
    mysql> CREATE USER 'mysqlogg'@'%' IDENTIFIED BY 'India#123';
    Query OK, 0 rows affected (0.09 sec)
    
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'mysqlogg'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> SELECT user, host FROM mysql.user;
    +------------------+-----------+
    | user             | host      |
    +------------------+-----------+
    | mysqlogg         | %         |
    | mysql.infoschema | localhost |
    | mysql.session    | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    +------------------+-----------+
    5 rows in set (0.00 sec)
    
    mysql>exit
    
    [mysql@mysqlOGG ~]$ mysql --user=mysqlogg --password
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 8.4.5 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    mysql>  SELECT CURRENT_USER();
    +----------------+
    | CURRENT_USER() |
    +----------------+
    | mysqlogg@%     |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | mysqldb            |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql>
    
    
    4. Now create user to test replication.
    
    
    [mysql@mysqlOGG ~]$ mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 11
    Server version: 8.4.5 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | mysqldb            |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.06 sec)
    
    mysql>
    mysql> CREATE USER 'test'@'%' IDENTIFIED BY 'India#123';
    Query OK, 0 rows affected (0.12 sec)
    
    mysql> GRANT ALL PRIVILEGES ON mysqldb.* TO 'test'@'%';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> exit
    Bye
    [mysql@mysqlOGG ~]$
    [mysql@mysqlOGG ~]$ mysql -u test -p mysqldb
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 12
    Server version: 8.4.5 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    mysql> select user();
    +----------------+
    | user()         |
    +----------------+
    | test@localhost |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | mysqldb    |
    +------------+
    1 row in set (0.00 sec)
    
    mysql>
    
    

    5. Now login to GoldenGate Console and make database connection.

    Click on DB Connection and then click + sign.

    Provide the Credential Domain & Alias,Server hostname & Port and user id & its password.

    Now click on arrow to establish connection.

    Now DB connection established successfully.
    6. Now we need to add checkpoint table for replication.

    Click on Checkpoint and then click +

    Give the table name followed by the database name

    Now checkpoint table has been added.


    Thanks for visiting!!

    Tuesday, June 17, 2025

    Oracle GoldenGate 23ai Installation || MySQL

    • Introduction: Oracle GoldenGate (OGG) is a real-time data replication platform enabling seamless data integration between heterogeneous databases. It supports high throughput, minimal latency, and advanced deployment architectures. It is CDC (Change Data Capture) tool that captures committed changes from the source database transaction logs and replicates them to a target database. In this article we will be doing the installation of Oracle GoldenGate 23ai (version 23.4.1.24.05) for MySQL.

    • Prerequisites: Below are the minimum requirements for Linux environment.
      • CPU - 2core
      • RAM - 4GB
      • Disk space - 25GB
      • OS - Oracle Linux 8/9
      • MySQL ODBC Connector

    • Software Download:

    • Environment Used:
      • Hostname: mysqlOGG.oraeasy.com
      • IP: 192.168.101.6
      • OS: OL9

    • Directory Used:
      • OGG Home: /ogg/ogg23ai_ma
      • OGG Service Manager: /ogg/ogg23ai_sm
      • OGG Deployment Home: /ogg/ogg23ai_deploy

    • Now start installation step by step:
    1. Prepare OS for installation.
    
    

    Install Packages

    [root@mysqlOGG ~]# dnf install compat-openssl11 Last metadata expiration check: 0:26:18 ago on Thu 22 May 2025 12:33:52 AM IST. Dependencies resolved. ============================================================================================================================================================== Package Architecture Version Repository Size ============================================================================================================================================================== Installing: compat-openssl11 x86_64 1:1.1.1k-4.0.1.el9_0 ol9_appstream 1.5 M Transaction Summary ============================================================================================================================================================== Install 1 Package Total download size: 1.5 M Installed size: 3.7 M Is this ok [y/N]: y Downloading Packages: compat-openssl11-1.1.1k-4.0.1.el9_0.x86_64.rpm 1.6 MB/s | 1.5 MB 00:00 -------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 1.6 MB/s | 1.5 MB 00:00 Oracle Linux 9 Application Stream Packages (x86_64) 5.7 MB/s | 6.2 kB 00:00 Importing GPG key 0x8D8B756F: Userid : "Oracle Linux (release key 1) " Fingerprint: 3E6D 826D 3FBA B389 C2F3 8E34 BC4D 06A0 8D8B 756F From : /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle Is this ok [y/N]: y Key imported successfully Importing GPG key 0x8B4EFBE6: Userid : "Oracle Linux (backup key 1) " Fingerprint: 9822 3175 9C74 6706 5D0C E9B2 A7DD 0708 8B4E FBE6 From : /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle Is this ok [y/N]: y Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : compat-openssl11-1:1.1.1k-4.0.1.el9_0.x86_64 1/1 Running scriptlet: compat-openssl11-1:1.1.1k-4.0.1.el9_0.x86_64 1/1 Verifying : compat-openssl11-1:1.1.1k-4.0.1.el9_0.x86_64 1/1 Installed: compat-openssl11-1:1.1.1k-4.0.1.el9_0.x86_64 Complete! [root@mysqlOGG ~]# [root@mysqlOGG ~]# ls /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1 [root@mysqlOGG ~]#

    Create Oracle user & its Group

    [root@mysqlOGG ~]# groupadd -g 54321 oinstall [root@mysqlOGG ~]# groupadd -g 54322 dba [root@mysqlOGG ~]# useradd -u 54321 -g oinstall -G dba oracle [root@mysqlOGG ~]# [root@mysqlOGG ~]# passwd oracle Changing password for user oracle. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [root@mysqlOGG ~]#

    Directory Creation & Ownership change

    [root@mysqlOGG ~]# mkdir -p /ogg/ogg23ai_deploy [root@mysqlOGG ~]# mkdir -p /ogg/ogg23ai_ma [root@mysqlOGG ~]# mkdir -p /ogg/ogg23ai_sm [root@mysqlOGG ~]# chown -R oracle:oinstall /u01 [root@mysqlOGG ~]# chmod -R 775 /u01 [root@mysqlOGG ~]# chown -R oracle:oinstall /ogg [root@mysqlOGG ~]# chmod -R 775 /ogg

    selinux => permissive

    [root@mysqlOGG ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. # See also: # https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux/changing-selinux-states-and-modes_using-selinux#changing-selinux -modes-at-boot-time_changing-selinux-states-and-modes # # NOTE: Up to RHEL 8 release included, SELINUX=disabled would also # fully disable SELinux during boot. If you need a system with SELinux # fully disabled instead of SELinux running with no policy loaded, you # need to pass selinux=0 to the kernel command line. You can use grubby # to persistently set the bootloader to boot with selinux=0: # # grubby --update-kernel ALL --args selinux=0 # # To revert back to SELinux enabled: # # grubby --update-kernel ALL --remove-args selinux # SELINUX=permissive # SELINUXTYPE= can take one of these three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted

    Disable firewall

    [root@mysqlOGG ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled) Active: active (running) since Thu 2025-05-22 11:39:36 IST; 46min ago Docs: man:firewalld(1) Main PID: 750 (firewalld) Tasks: 2 (limit: 21748) Memory: 40.6M CPU: 1.209s CGroup: /system.slice/firewalld.service └─750 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid May 22 11:39:26 mysqlOGG.oraeasy.com systemd[1]: Starting firewalld - dynamic firewall daemon... May 22 11:39:36 mysqlOGG.oraeasy.com systemd[1]: Started firewalld - dynamic firewall daemon. [root@mysqlOGG ~]# [root@mysqlOGG ~]# systemctl stop firewalld [root@mysqlOGG ~]# [root@mysqlOGG ~]# systemctl disable firewalld Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service". Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
    2. Now install & configure MySQL ODBC Connector.
    
    

    Installed the requited packages and verify them

    [root@mysqlOGG ~]# dnf -y install unixODBC Last metadata expiration check: 0:01:55 ago on Mon 02 Jun 2025 04:18:41 PM IST. Package unixODBC-2.3.9-4.el9.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! [root@mysqlOGG ~]# dnf list installed | grep -i odbc python3-pyodbc.x86_64 4.0.30-4.el9 @AppStream unixODBC.x86_64 2.3.9-4.el9 @AppStream [root@mysqlOGG ~]# [root@mysqlOGG ~]# dnf install mysql-connector-odbc Last metadata expiration check: 0:04:49 ago on Mon 02 Jun 2025 04:18:41 PM IST. Dependencies resolved. ============================================================================================================================================================== Package Architecture Version Repository Size ============================================================================================================================================================== Installing: mysql-connector-odbc x86_64 9.3.0-1.el9 mysql-connectors-community 6.2 M Transaction Summary ============================================================================================================================================================== Install 1 Package Total download size: 6.2 M Installed size: 55 M Is this ok [y/N]: y Downloading Packages: mysql-connector-odbc-9.3.0-1.el9.x86_64.rpm 2.3 MB/s | 6.2 MB 00:02 -------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 2.2 MB/s | 6.2 MB 00:02 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : mysql-connector-odbc-9.3.0-1.el9.x86_64 1/1 Running scriptlet: mysql-connector-odbc-9.3.0-1.el9.x86_64 1/1 Success: Usage count is 1 Success: Usage count is 1 Verifying : mysql-connector-odbc-9.3.0-1.el9.x86_64 1/1 Installed: mysql-connector-odbc-9.3.0-1.el9.x86_64 Complete! [root@mysqlOGG ~]# [root@mysqlOGG ~]# odbcinst -q -d [PostgreSQL] [MySQL] [MySQL-5] [FreeTDS] [MariaDB] [MySQL ODBC 9.3 Unicode Driver] [MySQL ODBC 9.3 ANSI Driver] [root@mysqlOGG ~]#

    Configure odbc.ini file. Here we are using same server for MySQL DB.

    [root@mysqlOGG ~]# cat /etc/odbc.ini [mysqldb] Description=MySQL Local ODBC Connection Driver=MySQL ODBC 9.3 Unicode Driver Server=mysqlOGG.oraeasy.com Port=3306 User=mysqlogg Password=India#123 Database=mysqldb Option=3 [root@mysqlOGG ~]# ls -l /etc/odbc.ini -rw-r--r--. 1 root root 184 Jun 2 16:40 /etc/odbc.ini [oracle@mysqlOGG ~]$ isql -v mysqldb mysqlogg India#123 +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> show databases; +-----------------------------------------------------------------+ | Database | +-----------------------------------------------------------------+ | information_schema | | mysql | | mysqldb | | performance_schema | | sys | +-----------------------------------------------------------------+ SQLRowCount returns 5 5 rows fetched SQL> [oracle@mysqlOGG ~]$
    3. Now place & unzip the OGG software.
    
    [oracle@mysqlOGG oggsoft]$ pwd
    /u01/oggsoft
    [oracle@mysqlOGG oggsoft]$ ls -lrth
    total 490M
    -rw-r--r--. 1 oracle oinstall 490M May 22 00:09 OGG_MYSQL_V1043063-01.zip
    [oracle@mysqlOGG oggsoft]$
    [oracle@mysqlOGG oggsoft]$ unzip OGG_MYSQL_V1043063-01.zip
    
    [oracle@mysqlOGG oggsoft]$ ls
    ggs_Linux_x64_MySQL_services_shiphome  META-INF  OGG-23ai-README.txt  OGGCORE_Release_Notes_23.4.2.24.06.pdf  OGG_MYSQL_V1043063-01.zip
    
    4. Now start the OGG installation.
    
    [oracle@mysqlOGG oggsoft]$ cd ggs_Linux_x64_MySQL_services_shiphome/Disk1/
    [oracle@mysqlOGG Disk1]$ ls
    install  response  runInstaller  stage
    
    [oracle@mysqlOGG Disk1]$ ./runInstaller
    Starting Oracle Universal Installer...
    
    Checking Temp space: must be greater than 120 MB.   Actual 3693 MB    Passed
    Checking swap space: must be greater than 150 MB.   Actual 4095 MB    Passed
    Checking monitor: must be configured to display at least 256 colors.    Actual 16777216    Passed
    Preparing to launch Oracle Universal Installer from /tmp/OraInstall2025-05-22_12-12-37AM. Please wait ...[oracle@mysqlOGG Disk1]$
    
    
    Now a GUI window will appear. Follow the instructions:
    Click Next

    Provide OGG Home /ogg/ogg23ai_ma

    Click Next

    Click Install



    Login with root user and run the script. Then click OK
    
    [root@mysqlOGG ~]# /ogg/oraInventory/orainstRoot.sh
    Changing permissions of /ogg/oraInventory.
    Adding read,write permissions for group.
    Removing read,write,execute permissions for world.
    
    Changing groupname of /ogg/oraInventory to oinstall.
    The execution of the script is complete.
    [root@mysqlOGG ~]#
    

    Click Close

    5. Now post Installation of OGG, we will proceed to set up deployments and create a service manager using the OGGCA (Oracle GoldenGate Configuration Assistant) wizard.
    
    [oracle@mysqlOGG ogg23ai_ma]$ cd /ogg/ogg23ai_ma/
    [oracle@mysqlOGG ogg23ai_ma]$ ls
    bin  deinstall  diagnostics  include  install  inventory  jdk  jlib  lib  OPatch  oraInst.loc  oui  srvm
    [oracle@mysqlOGG ogg23ai_ma]$
    [oracle@mysqlOGG ogg23ai_ma]$ cd bin/
    [oracle@mysqlOGG ogg23ai_ma]$ ls
    adminclient  cachefiledump  chkptdump      convchk  defgen       distsrvr  extract  logdump   oggerr  pmsrvr    replicat  ServiceManager  XAGTask
    adminsrvr    checkprm       ConfigService  convprm  diagnostics  emsclnt   keygen   oggca.sh  orapki  recvsrvr  retrace   trailscan
    [oracle@mysqlOGG ogg23ai_ma]$ ./oggca.sh
    
    
    Now OGGCA GUI window will appear. Follow the instructions:

    Provide the Software Home, Service Manager Home, Hostname/IP and Port

    Provide the credential to access OGG console.

    Provide the Deployment Name, Deployment Home, Hostname/IP and Port

    Check the box and click Next

    Click Finish



    Click Ok

    Login with root user and run the script. Then click OK
    
    [root@mysqlOGG ~]# /ogg/ogg23ai_sm/bin/registerServiceManager.sh
    Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
    ----------------------------------------------------
         Oracle GoldenGate Install As Service Script
    ----------------------------------------------------
    OGG_HOME=/ogg/ogg23ai_ma
    OGG_CONF_HOME=/ogg/ogg23ai_sm/etc/conf
    OGG_VAR_HOME=/ogg/ogg23ai_sm/var
    OGG_USER=oracle
    Running OracleGoldenGateInstall.sh...
    Created symlink /etc/systemd/system/multi-user.target.wants/OracleGoldenGate.service → /etc/systemd/system/OracleGoldenGate.service.
    [root@mysqlOGG ~]#
    

    Click on Close

    6. Now check the OGG service status on server.
    
    [oracle@mysqlOGG ~]$ systemctl status OracleGoldenGate
    ● OracleGoldenGate.service - Oracle GoldenGate Service Manager
         Loaded: loaded (/etc/systemd/system/OracleGoldenGate.service; enabled; preset: disabled)
         Active: active (running) since Sun 2025-05-22 11:33:52 IST; 14min ago
       Main PID: 656 (ServiceManager)
          Tasks: 111 (limit: 15712)
         Memory: 160.2M
            CPU: 40.601s
         CGroup: /system.slice/OracleGoldenGate.service
                 ├─ 656 /ogg/ogg23ai_ma/bin/ServiceManager --inventory "'/ogg/ogg23ai_sm/etc/conf'"
                 ├─3586 /ogg/ogg23ai_ma/bin/adminsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-adminsrvr-config.dat
                 ├─3588 /ogg/ogg23ai_ma/bin/recvsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-recvsrvr-config.dat
                 ├─3590 /ogg/ogg23ai_ma/bin/distsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-distsrvr-config.dat
                 └─3592 /ogg/ogg23ai_ma/bin/pmsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-pmsrvr-config.dat
    [oracle@mysqlOGG ~]$
    [oracle@mysqlOGG ~]$ ps -ef|grep ogg23ai
    oracle       656       1  1 11:33 ?        00:00:09 /ogg/ogg23ai_ma/bin/ServiceManager --inventory '/ogg/ogg23ai_sm/etc/conf'
    oracle      3586     656  0 11:34 ?        00:00:03 /ogg/ogg23ai_ma/bin/adminsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-adminsrvr-config.dat
    oracle      3588     656  0 11:34 ?        00:00:03 /ogg/ogg23ai_ma/bin/recvsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-recvsrvr-config.dat
    oracle      3590     656  1 11:34 ?        00:00:12 /ogg/ogg23ai_ma/bin/distsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-distsrvr-config.dat
    oracle      3592     656  1 11:34 ?        00:00:12 /ogg/ogg23ai_ma/bin/pmsrvr --config /ogg/ogg23ai_sm/var/run/OggMySQL-pmsrvr-config.dat
    oracle      5274    5095  0 11:48 pts/1    00:00:00 grep --color=auto ogg23ai
    [oracle@mysqlOGG ~]$
    
    
    
    7. Now do the login on below URLs with configured credentials.
    http://192.168.101.6:7801 ==> Service Manager
    http://192.168.101.6:7803 ==> Deployment Services

    http://192.168.101.9:7801


    http://192.168.101.9:7803



    Thanks for visiting!!