In this blog we will see how Oracle Golden 21.3 Microservice supports DDL replication
Verify with our current Golden Gate replication setup, if DDL operations are replicated.
Source parameters:
Type: INTEGRATED
EXTRACT exts
USERIDALIAS cggadmin DOMAIN OracleGoldenGate
EXTTRAIL src/es
SOURCECATALOG OPDB1
DDL INCLUDE MAPPED
TABLE OPDB1_PUBLIC_USER.*;
Receiver parameters:
Type: Parallel Nonintegerated
REPLICAT rept
USERIDALIAS ggadmin_DBCASLNT DOMAIN OracleGoldenGate
--DDL EXCLUDE ALL
DDLERROR default discard
REPERROR (default,discard)
DDLOPTIONS REPORT
SOURCECATALOG OPDB1
MAP OPDB1_PUBLIC_USER.*, TARGET OPDB1_PUBLIC_USER.*;
Operation 1: Create table
Source PDB:SQL> create table ggreptst_21jun23 as select 1 as id from dual;
Table created.
SQL> desc ggreptst_21jun23
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
SQL> select * from ggreptst_21jun23;
ID
----------
1
SQL>
ID
----------
1
SQL>
SQL> select table_name,num_rows,last_analyzed from user_Tables order by 1;
TABLE_NAME NUM_ROWS LAST_ANALYZED
------------------------------ ---------- --------------------
GGREPTST_21JUN23 1 21/JUN/2023 07:31:25 <<<< this one is the true complete GG flyby
JT1 25000000 14/MAY/2023 20:25:13 <<<< until here expdp/impdp (bottom up), remember we inserted 1 record to test the replication initially
JT2 25000000 14/MAY/2023 20:25:47
T1 2 14/MAY/2023 16:17:44
TESTIDXBLOAT 960004 14/MAY/2023 16:18:10
TESTIDXBLOAT_TMP 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP2 9999 10/MAY/2023 23:34:58
TESTIDXBLOAT_TMP3 9999 10/MAY/2023 23:41:42
TESTIDXBLOAT_TMP4 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP5 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP6 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP7 9999 11/MAY/2023 00:09:52
12 rows selected.
TABLE_NAME NUM_ROWS LAST_ANALYZED
------------------------------ ---------- --------------------
GGREPTST_21JUN23 1 21/JUN/2023 07:31:25 <<<< this one is the true complete GG flyby
JT1 25000000 14/MAY/2023 20:25:13 <<<< until here expdp/impdp (bottom up), remember we inserted 1 record to test the replication initially
JT2 25000000 14/MAY/2023 20:25:47
T1 2 14/MAY/2023 16:17:44
TESTIDXBLOAT 960004 14/MAY/2023 16:18:10
TESTIDXBLOAT_TMP 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP2 9999 10/MAY/2023 23:34:58
TESTIDXBLOAT_TMP3 9999 10/MAY/2023 23:41:42
TESTIDXBLOAT_TMP4 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP5 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP6 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP7 9999 11/MAY/2023 00:09:52
12 rows selected.
SQL> select object_name,object_type,created,last_ddl_time from user_objects order by 1;
OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME
------------------------------ ------------------------------ -------------------- --------------------
GETSEQFLUSH PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
GGREPTST_21JUN23 TABLE 21/JUN/2023 07:31:25 21/JUN/2023 07:31:25 <<< our table,created to test ddl
JT1 TABLE 14/MAY/2023 16:46:30 14/MAY/2023 16:46:30
JT2 TABLE 14/MAY/2023 17:05:24 14/MAY/2023 17:05:24
MOVETARGETHWM PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
REPLICATESEQUENCE PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
SEQTRACE PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
T1 TABLE 24/APR/2023 19:49:25 24/APR/2023 19:49:25
TESTIDXBLOAT TABLE 10/MAY/2023 23:06:40 10/MAY/2023 23:10:44
TESTIDXBLOAT_IN INDEX 10/MAY/2023 23:10:42 10/MAY/2023 23:10:42
TESTIDXBLOAT_PK INDEX 10/MAY/2023 23:07:58 10/MAY/2023 23:07:58
TESTIDXBLOAT_TMP TABLE 10/MAY/2023 23:28:25 10/MAY/2023 23:28:25
TESTIDXBLOAT_TMP2 TABLE 10/MAY/2023 23:34:58 10/MAY/2023 23:34:58
TESTIDXBLOAT_TMP3 TABLE 10/MAY/2023 23:41:42 10/MAY/2023 23:41:42
TESTIDXBLOAT_TMP4 TABLE 10/MAY/2023 23:49:06 10/MAY/2023 23:49:06
TESTIDXBLOAT_TMP5 TABLE 10/MAY/2023 23:53:15 10/MAY/2023 23:53:15
TESTIDXBLOAT_TMP6 TABLE 11/MAY/2023 00:06:26 11/MAY/2023 00:06:26
TESTIDXBLOAT_TMP7 TABLE 11/MAY/2023 00:09:52 11/MAY/2023 00:09:52
UPDATESEQUENCE PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
19 rows selected.
OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME
------------------------------ ------------------------------ -------------------- --------------------
GETSEQFLUSH PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
GGREPTST_21JUN23 TABLE 21/JUN/2023 07:31:25 21/JUN/2023 07:31:25 <<< our table,created to test ddl
JT1 TABLE 14/MAY/2023 16:46:30 14/MAY/2023 16:46:30
JT2 TABLE 14/MAY/2023 17:05:24 14/MAY/2023 17:05:24
MOVETARGETHWM PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
REPLICATESEQUENCE PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
SEQTRACE PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
T1 TABLE 24/APR/2023 19:49:25 24/APR/2023 19:49:25
TESTIDXBLOAT TABLE 10/MAY/2023 23:06:40 10/MAY/2023 23:10:44
TESTIDXBLOAT_IN INDEX 10/MAY/2023 23:10:42 10/MAY/2023 23:10:42
TESTIDXBLOAT_PK INDEX 10/MAY/2023 23:07:58 10/MAY/2023 23:07:58
TESTIDXBLOAT_TMP TABLE 10/MAY/2023 23:28:25 10/MAY/2023 23:28:25
TESTIDXBLOAT_TMP2 TABLE 10/MAY/2023 23:34:58 10/MAY/2023 23:34:58
TESTIDXBLOAT_TMP3 TABLE 10/MAY/2023 23:41:42 10/MAY/2023 23:41:42
TESTIDXBLOAT_TMP4 TABLE 10/MAY/2023 23:49:06 10/MAY/2023 23:49:06
TESTIDXBLOAT_TMP5 TABLE 10/MAY/2023 23:53:15 10/MAY/2023 23:53:15
TESTIDXBLOAT_TMP6 TABLE 11/MAY/2023 00:06:26 11/MAY/2023 00:06:26
TESTIDXBLOAT_TMP7 TABLE 11/MAY/2023 00:09:52 11/MAY/2023 00:09:52
UPDATESEQUENCE PROCEDURE 18/JUN/2023 12:21:32 18/JUN/2023 12:21:32 <<< not sure why this object is created here, I have ggadmin schema
19 rows selected.
SQL>
Target NonCDB:
SQL> desc GGREPTST_21JUN23
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
SQL>
SQL> select * from GGREPTST_21JUN23;
ID
----------
1
ID
----------
1
SQL> select table_name,num_rows,last_analyzed from user_Tables order by 1;
TABLE_NAME NUM_ROWS LAST_ANALYZED
------------------------------ ---------- --------------------
GGREPTST_21JUN23 1 21/JUN/2023 07:31:54 <<<< this one is the true complete GG flyby, see the last analyzed timestamps difference
JT1 25000000 14/MAY/2023 20:25:13
JT2 25000000 14/MAY/2023 20:25:47
T1 2 14/MAY/2023 16:17:44
TESTIDXBLOAT 960004 14/MAY/2023 16:18:10
TESTIDXBLOAT_TMP 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP2 9999 10/MAY/2023 23:34:58
TESTIDXBLOAT_TMP3 9999 10/MAY/2023 23:41:42
TESTIDXBLOAT_TMP4 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP5 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP6 9999 14/MAY/2023 16:18:22
TESTIDXBLOAT_TMP7 9999 11/MAY/2023 00:09:52
12 rows selected.
SQL> select object_name,object_type,created,last_ddl_time from user_objects order by 1;
OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME
------------------------------ ------------------------------ -------------------- --------------------
GETSEQFLUSH PROCEDURE 18/JUN/2023 21:17:43 18/JUN/2023 21:17:43 <<< not sure why this object is created here, I have ggadmin schema
GGREPTST_21JUN23 TABLE 21/JUN/2023 07:31:28 21/JUN/2023 07:31:28 <<< our DDL test table
JT1 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
JT2 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
MOVETARGETHWM PROCEDURE 18/JUN/2023 21:17:43 18/JUN/2023 21:17:43 <<< not sure why this object is created here, I have ggadmin schema
REPLICATESEQUENCE PROCEDURE 18/JUN/2023 21:17:43 18/JUN/2023 21:17:43 <<< not sure why this object is created here, I have ggadmin schema
SEQTRACE PROCEDURE 18/JUN/2023 21:17:43 18/JUN/2023 21:17:43 <<< not sure why this object is created here, I have ggadmin schema
T1 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
TESTIDXBLOAT TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:17:48
TESTIDXBLOAT_IN INDEX 18/JUN/2023 21:17:44 18/JUN/2023 21:17:47
TESTIDXBLOAT_PK INDEX 18/JUN/2023 21:17:48 18/JUN/2023 21:17:48
TESTIDXBLOAT_TMP TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
TESTIDXBLOAT_TMP2 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
TESTIDXBLOAT_TMP3 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
TESTIDXBLOAT_TMP4 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
TESTIDXBLOAT_TMP5 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
TESTIDXBLOAT_TMP6 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
TESTIDXBLOAT_TMP7 TABLE 18/JUN/2023 21:04:36 18/JUN/2023 21:04:36
UPDATESEQUENCE PROCEDURE 18/JUN/2023 21:17:43 18/JUN/2023 21:17:44 <<< not sure why this object is created here, I have ggadmin schema
19 rows selected.
Operation 2: Add a column to GGREPTST_21JUN23 table
Source table:SQL> alter table GGREPTST_21JUN23 add (name varchar2(100));
Table altered.
SQL>
07:52:54 SQL> desc GGREPTST_21JUN23
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
ID NUMBER
NAME VARCHAR2(100)
07:52:58 SQL> select * from GGREPTST_21JUN23;
ID NAME
---------- --------------------
1
Elapsed: 00:00:00.01
07:54:09 SQL>
07:55:46 SQL> select object_name,object_type,created,last_ddl_time from user_objects order by 1;
OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME
------------------------------ ------------------------------ -------------------- --------------------
..
GGREPTST_21JUN23 TABLE 21/JUN/2023 07:31:25 21/JUN/2023 07:51:43 <<< so this is the DDL time
Target table:
07:53:04 SQL> desc GGREPTST_21JUN23
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
ID NUMBER
NAME VARCHAR2(100)
07:55:07 SQL> select * from GGREPTST_21JUN23;
ID NAME
---------- ----------------------------------------
1
Elapsed: 00:00:00.00
07:55:11 SQL>
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
ID NUMBER
NAME VARCHAR2(100)
07:55:07 SQL> select * from GGREPTST_21JUN23;
ID NAME
---------- ----------------------------------------
1
Elapsed: 00:00:00.00
07:55:11 SQL>
07:55:36 SQL> select object_name,object_type,created,last_ddl_time from user_objects order by 1;
OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME
------------------------------ ------------------------------ -------------------- --------------------
..
GGREPTST_21JUN23 TABLE 21/JUN/2023 07:31:28 21/JUN/2023 07:51:47 <<< so this is the DDL time
It looks like we have a 4sec lag; which is quite good.
Operation 3: Truncate the table
Source:07:57:18 SQL> truncate table GGREPTST_21JUN23;
Table truncated.
Elapsed: 00:00:00.20
07:57:25 SQL> select * from GGREPTST_21JUN23;
no rows selected
Elapsed: 00:00:00.03
07:57:39 SQL>
07:57:39 SQL> select object_name,object_type,created,last_ddl_time from user_objects order by 1;
OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME
------------------------------ ------------------------------ -------------------- --------------------
..
GGREPTST_21JUN23 TABLE 21/JUN/2023 07:31:25 21/JUN/2023 07:57:25 <<< last ddl time
Target:
07:55:41 SQL> select * from GGREPTST_21JUN23;
no rows selected
Elapsed: 00:00:00.00
07:57:32 SQL>
07:57:32 SQL> select object_name,object_type,created,last_ddl_time from user_objects order by 1;
OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME
------------------------------ ------------------------------ -------------------- --------------------
..
GGREPTST_21JUN23 TABLE 21/JUN/2023 07:31:28 21/JUN/2023 07:57:28 <<< last ddl time
this time 3secs lag. Note my machines are in sync in terms of time :)
Operation 4: Drop the table
Source:07:59:02 SQL> drop table GGREPTST_21JUN23 purge;
Table dropped.
Elapsed: 00:00:00.78
08:00:11 SQL>
08:00:32 SQL> select * from GGREPTST_21JUN23;
select * from GGREPTST_21JUN23
*
ERROR at line 1:
ORA-00942: table or view does not exist
Elapsed: 00:00:00.06
08:00:41 SQL> select count(1) from user_objects where upper(object_name)='GGREPTST_21JUN23';
COUNT(1)
----------
0
Elapsed: 00:00:00.69
08:01:18 SQL>
Target:
08:00:27 SQL> select * from GGREPTST_21JUN23;
select * from GGREPTST_21JUN23
*
ERROR at line 1:
ORA-00942: table or view does not exist
Elapsed: 00:00:00.00
08:00:46 SQL> select count(1) from user_objects where upper(object_name)='GGREPTST_21JUN23';
COUNT(1)
----------
0
Elapsed: 00:00:00.14
08:01:10 SQL>
How does it look in ADMIN console:
Extract:
So this looks fine, we created a table, modified it, truncated it, dropped it.
All of them reflected fine with our current replication setting.
Next Step: We perform some stress test on GG Replication.
No comments:
Post a Comment