{"id":44906,"date":"2026-06-16T17:13:07","date_gmt":"2026-06-16T15:13:07","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=44906"},"modified":"2026-06-16T17:16:16","modified_gmt":"2026-06-16T15:16:16","slug":"lob-replication-with-goldengate-and-importance-of-primary-keys","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/","title":{"rendered":"LOB Replication With GoldenGate and Importance of Primary Keys"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Every time I work on database migrations with GoldenGate, I have the same talks with application teams about missing primary keys. Especially when it comes to LOB replication with GoldenGate. In a <a href=\"https:\/\/www.dbi-services.com\/blog\/goldengate-row-identification-misconceptions-and-solutions\/\" target=\"_blank\" rel=\"noreferrer noopener\">previous blog<\/a>, I wrote about how to interpret the <code><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/26\/refrn\/DBA_GOLDENGATE_NOT_UNIQUE.html\" target=\"_blank\" rel=\"noreferrer noopener\">DBA_GOLDENGATE_NOT_UNIQUE<\/a><\/code> view, which lists tables with <strong>no primary key or non-null unique indexes<\/strong>. There are two main groups of tables listed here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tables where all columns can be used to identify uniqueness (<code>bad_column='N'<\/code>)<\/li>\n\n\n\n<li>Tables where not all columns can be used (<code>bad_column='Y'<\/code>)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To show what happens when primary keys are missing in GoldenGate replication, let&#8217;s see a few examples. In all the examples, I will extract data from <code>APP_SOURCE<\/code> schema and replicate it into an <code>APP_TARGET<\/code> schema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The parameters of the replication do not really matter here, but to be precise, here is the extract parameter file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXTRACT EXT1\nUSERIDALIAS source_cdb DOMAIN OracleGoldenGate\nEXTTRAIL pdb1\/aa\nSOURCECATALOG PDB1\nDDL INCLUDE MAPPED\nTABLE APP_SOURCE.*;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And here is the replicat parameter file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPLICAT REP2\nUSERIDALIAS target_pdb DOMAIN OracleGoldenGate\nDDL INCLUDE MAPPED\nMAP PDB1.APP_SOURCE.*, TARGET PDB2.APP_TARGET.*;<\/code><\/pre>\n\n\n\n<h2 id=\"h-first-test-simple-table-with-primary-key\" class=\"wp-block-heading\">First test : simple table with primary key<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First, let&#8217;s try the most common example, with a table <code>APP_SOURCE.TEST_PK<\/code> created <strong>with a primary key<\/strong>. You can skip this part if you know how GoldenGate works, but I just wanted to include this for comparison.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE APP_SOURCE.TEST_PK\n(\n    id   NUMBER PRIMARY KEY,\n    data VARCHAR2(100)\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s <strong>insert a few rows<\/strong> in this table and look at the content of the table in both the source and the target.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO APP_SOURCE.TEST_PK VALUES (1,'A');\nINSERT INTO APP_SOURCE.TEST_PK VALUES (2,'B');\nCOMMIT;\n\n-- Verify source\/target\nSELECT * FROM APP_SOURCE.TEST_PK ORDER BY id;\nSELECT * FROM APP_TARGET.TEST_PK ORDER BY id;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You will see the same content in both tables.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; SELECT * FROM APP_SOURCE.TEST_PK ORDER BY id;\n\n        ID DATA\n---------- --------------------\n         1 A\n         2 B<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now, if you update the row with <code>id=1<\/code>, it will be updated in both tables as well.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE APP_SOURCE.TEST_PK SET data='A_UPDATED' WHERE id=1;\nCOMMIT;\n\n-- Verify\nSELECT * FROM APP_SOURCE.TEST_PK ORDER BY id;\nSELECT * FROM APP_TARGET.TEST_PK ORDER BY id;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Checking the tables will give you the updated data.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; SELECT * FROM APP_TARGET.TEST_PK ORDER BY id;\n\n        ID DATA\n---------- --------------------\n         1 A_UPDATED\n         2 B<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Until then, nothing really interesting, but let&#8217;s look at the <strong>report file of the extract<\/strong> on the source. You will see the following information:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-06-06 07:00:52&nbsp; INFO&nbsp;&nbsp;&nbsp; OGG-06509&nbsp; Using the following key columns for source table PDB1.APP_SOURCE.TEST_PK: ID.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because the <strong>table has a primary key<\/strong>, GoldenGate knows that it should <strong>only use this column<\/strong> to identify unique rows.<\/p>\n\n\n\n<h2 id=\"h-second-test-table-with-no-primary-key-and-no-lob-columns\" class=\"wp-block-heading\">Second test : table with no primary key and no LOB columns<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this second test, I will create a table without a primary key, but using only types that GoldenGate can use to identify uniqueness.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE APP_SOURCE.TEST_NOPK\n(\n    id   NUMBER,\n    data VARCHAR2(100)\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We can already query the <code>DBA_GOLDENGATE_NOT_UNIQUE<\/code> view to find this new table listed with <code>bad_column='N'<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM dba_goldengate_not_unique\nWHERE owner='APP_SOURCE'\nORDER BY owner, table_name;\n\nOWNER                          TABLE_NAME                     BAD_COLUMN\n------------------------------ ------------------------------ ----------\nAPP_SOURCE                     TEST_NOPK                      N<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s do the same steps as before, inserting data and updating the content.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO APP_SOURCE.TEST_NOPK VALUES (1,'A');\nINSERT INTO APP_SOURCE.TEST_NOPK VALUES (2,'B');\nCOMMIT;\n\nSELECT * FROM APP_SOURCE.TEST_NOPK ORDER BY id;\nSELECT * FROM APP_TARGET.TEST_NOPK ORDER BY id;\n\nUPDATE APP_SOURCE.TEST_NOPK SET data='A_UPDATED' WHERE id=1;\nCOMMIT;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The content of the table is the same on source and target, as expected.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; SELECT * FROM APP_TARGET.TEST_NOPK ORDER BY id;\n\n        ID DATA\n---------- --------------------\n         1 A_UPDATED\n         2 B<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And looking at the <strong>extract report file<\/strong>, we can see that <strong>all viable columns were used<\/strong>. In that case, it meant taking <code>ID<\/code> and <code>DATA<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-06-06 07:08:13  INFO    OGG-06508  Wildcard MAP (TABLE) resolved (entry PDB1.APP_SOURCE.*): TABLE \"PDB1\".\"APP_SOURCE\".\"TEST_NOPK\".\n\n2026-06-06 07:08:13  WARNING OGG-06439  No unique key is defined for table TEST_NOPK. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key. If using KEYCOLS, make sure that you create an INDEX in the target database for those column(s) as well.\n\n2026-06-06 07:08:13  INFO    OGG-06509  Using the following key columns for source table PDB1.APP_SOURCE.TEST_NOPK: ID, DATA.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">As mentioned in the other blog about primary keys in GoldenGate, this will work, but you will of course have <strong>performance issues<\/strong> when replicating data.<\/p>\n\n\n\n<h2 id=\"h-third-test-table-with-no-pk-and-a-clob-column\" class=\"wp-block-heading\">Third test : Table with no PK and a <code>CLOB<\/code> column<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now, let me show you the bad use case, where you don&#8217;t have a primary key and the <strong>table contains a non-viable column for uniqueness identification<\/strong>. In this example, I will use a <code>CLOB<\/code> column, but it could be another unbounded data type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE APP_SOURCE.TEST_CLOB\n(\n    id   NUMBER,\n    code VARCHAR2(10),\n    txt  CLOB\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If we check the <code>DBA_GOLDENGATE_NOT_UNIQUE<\/code> view, we see the new table listed with <code>bad_column='Y'<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM dba_goldengate_not_unique\nWHERE owner='APP_SOURCE'\nORDER BY owner, table_name;\n\nOWNER                          TABLE_NAME                     BAD_COLUMN\n------------------------------ ------------------------------ ----------\nAPP_SOURCE                     TEST_CLOB                      Y\nAPP_SOURCE                     TEST_NOPK                      N<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s insert some data. But this time, I will add <strong>two more rows that are unique<\/strong>, but for which only the <strong><code>TXT<\/code> content differs<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO app_source.test_clob VALUES (1,'A',TO_CLOB('LOB_1'));\nINSERT INTO app_source.test_clob VALUES (2,'B',TO_CLOB('LOB_2'));\nINSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_1'));\nINSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_2'));\nCOMMIT;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The data was correctly inserted, and the content is the same on the source and target.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; SELECT id,code,DBMS_LOB.SUBSTR(txt,40,1) txt FROM app_target.test_clob ORDER BY id;\n\n        ID CODE       TXT\n---------- ---------- ----------------------------------------\n         1 A\t      LOB_1\n         2 B\t      LOB_2\n       100 DUP\t      LOB_1\n       100 DUP\t      LOB_2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In the <strong>report file<\/strong>, we do not see any difference between this example and the one before. GoldenGate mentions using <strong>two columns for uniqueness identification<\/strong> : <code>ID<\/code> and <code>CODE<\/code>. <strong>GoldenGate never mentions that a third column existed and was not used<\/strong>. The warning displayed is the same as before.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-06-06 07:10:13  INFO    OGG-06508  Wildcard MAP (TABLE) resolved (entry PDB1.APP_SOURCE.*): TABLE \"PDB1\".\"APP_SOURCE\".\"TEST_CLOB\".\n\n2026-06-06 07:10:13  WARNING OGG-06439  No unique key is defined for table TEST_CLOB. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key. If using KEYCOLS, make sure that you create an INDEX in the target database for those column(s) as well.\n\n2026-06-06 07:10:13  INFO    OGG-06509  Using the following key columns for source table PDB1.APP_SOURCE.TEST_CLOB: ID, CODE.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And now, the main problem I wanted to discuss regarding LOB replication with GoldenGate. If you <strong>try to delete one row by specifying all three columns<\/strong>, it will <strong>not always work<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DELETE FROM app_source.test_clob\nWHERE id = 100\nAND code = 'DUP'\nAND DBMS_LOB.COMPARE(txt,TO_CLOB('LOB_1')) = 0;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes, the line with <code>LOB_1<\/code> will be deleted:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        ID CODE       TXT\n---------- ---------- ----------------------------------------\n         1 A\t      LOB_1\n         2 B\t      LOB_2\n       100 DUP\t      LOB_2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">But sometimes, the line with <code>LOB_2<\/code> will be deleted:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        ID CODE       TXT\n---------- ---------- ----------------------------------------\n         1 A\t      LOB_1\n         2 B\t      LOB_2\n       100 DUP\t      LOB_1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">More precisely, it will just <strong>delete the first line that was inserted<\/strong>. You then have two cases. If you insert <code>LOB_1<\/code> first, it will be deleted correctly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DROP TABLE app_source.test_clob PURGE;\n\nCREATE TABLE app_source.test_clob (id NUMBER, code VARCHAR2(10), txt CLOB);\n\nINSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_1'));\nINSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_2'));\nCOMMIT;\n\nDELETE FROM app_source.test_clob\nWHERE id = 100\nAND code = 'DUP'\nAND DBMS_LOB.COMPARE(txt,TO_CLOB('LOB_1')) = 0;\nCOMMIT;\n\nSQL&gt; SELECT id,code,DBMS_LOB.SUBSTR(txt,40,1) txt\nFROM app_target.test_clob\nWHERE code='DUP';\n\n        ID CODE       TXT\n---------- ---------- ----------------------------------------\n       100 DUP\t      LOB_2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And if you insert <code>LOB_2<\/code> first, the incorrect line will be deleted:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DROP TABLE app_source.test_clob PURGE;\n\nCREATE TABLE app_source.test_clob (id NUMBER, code VARCHAR2(10), txt CLOB);\n\nINSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_2'));\nINSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_1'));\nCOMMIT;\n\nDELETE FROM app_source.test_clob\nWHERE id = 100\nAND code = 'DUP'\nAND DBMS_LOB.COMPARE(txt,TO_CLOB('LOB_1')) = 0;\nCOMMIT;\n\nSQL&gt; SELECT id,code,DBMS_LOB.SUBSTR(txt,40,1) txt\nFROM app_target.test_clob\nWHERE code='DUP';\n\n        ID CODE       TXT\n---------- ---------- ----------------------------------------\n       100 DUP\t      LOB_1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You now know why <strong>you should always pay attention<\/strong> to tables in the <code><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/26\/refrn\/DBA_GOLDENGATE_NOT_UNIQUE.html\" target=\"_blank\" rel=\"noreferrer noopener\">DBA_GOLDENGATE_NOT_UNIQUE<\/a><\/code> view with <code>bad_column='Y'<\/code>. If you have such tables, there are several scenarios that I presented in the <a href=\"https:\/\/www.dbi-services.com\/blog\/goldengate-row-identification-misconceptions-and-solutions\/\" target=\"_blank\" rel=\"noreferrer noopener\">last blog on the topic<\/a>. But <strong>ignoring them is not one of them<\/strong>. This way, you will avoid issues regarding LOB replication with GoldenGate.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every time I work on database migrations with GoldenGate, I have the same talks with application teams about missing primary keys. Especially when it comes to LOB replication with GoldenGate. In a previous blog, I wrote about how to interpret the DBA_GOLDENGATE_NOT_UNIQUE view, which lists tables with no primary key or non-null unique indexes. There [&hellip;]<\/p>\n","protected":false},"author":152,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3787,59],"tags":[3804,4088,4083,463,4086,328,4092,206,2562,3730,4077,301,1770,1951,4112],"type_dbi":[3823,4089,4087,4082,4090,3740,4093,4085,3786,3881,4078,3329,4110,4091,4111],"class_list":["post-44906","post","type-post","status-publish","format-standard","hentry","category-goldengate","category-oracle","tag-26ai","tag-bad_column","tag-blob","tag-clob","tag-dba_goldengate_not_unique","tag-goldengate","tag-keycols","tag-lob","tag-migration-2","tag-ogg","tag-primary-key","tag-replication","tag-support","tag-table","tag-unsupported","type-26ai","type-bad_column","type-blob","type-clob","type-dba_goldengate_not_unique","type-goldengate","type-keycols","type-lob","type-migration","type-ogg","type-primary-key","type-replication","type-support","type-table","type-unsupported"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>LOB Replication With GoldenGate and Importance of Primary Keys - dbi Blog<\/title>\n<meta name=\"description\" content=\"Why primary keys are important for LOB replication with GoldenGate, and how to monitor your tables to avoid migration issues\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LOB Replication With GoldenGate and Importance of Primary Keys\" \/>\n<meta property=\"og:description\" content=\"Why primary keys are important for LOB replication with GoldenGate, and how to monitor your tables to avoid migration issues\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-16T15:13:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-16T15:16:16+00:00\" \/>\n<meta name=\"author\" content=\"Julien Delattre\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julien Delattre\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/\"},\"author\":{\"name\":\"Julien Delattre\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"headline\":\"LOB Replication With GoldenGate and Importance of Primary Keys\",\"datePublished\":\"2026-06-16T15:13:07+00:00\",\"dateModified\":\"2026-06-16T15:16:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/\"},\"wordCount\":706,\"commentCount\":0,\"keywords\":[\"26ai\",\"bad_column\",\"blob\",\"CLOB\",\"dba_goldengate_not_unique\",\"GoldenGate\",\"keycols\",\"LOB\",\"migration\",\"ogg\",\"primary key\",\"Replication\",\"support\",\"table\",\"unsupported\"],\"articleSection\":[\"GoldenGate\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/\",\"name\":\"LOB Replication With GoldenGate and Importance of Primary Keys - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-06-16T15:13:07+00:00\",\"dateModified\":\"2026-06-16T15:16:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"description\":\"Why primary keys are important for LOB replication with GoldenGate, and how to monitor your tables to avoid migration issues\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/lob-replication-with-goldengate-and-importance-of-primary-keys\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LOB Replication With GoldenGate and Importance of Primary Keys\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\",\"name\":\"Julien Delattre\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"caption\":\"Julien Delattre\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/juliendelattre\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"LOB Replication With GoldenGate and Importance of Primary Keys - dbi Blog","description":"Why primary keys are important for LOB replication with GoldenGate, and how to monitor your tables to avoid migration issues","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/","og_locale":"en_US","og_type":"article","og_title":"LOB Replication With GoldenGate and Importance of Primary Keys","og_description":"Why primary keys are important for LOB replication with GoldenGate, and how to monitor your tables to avoid migration issues","og_url":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/","og_site_name":"dbi Blog","article_published_time":"2026-06-16T15:13:07+00:00","article_modified_time":"2026-06-16T15:16:16+00:00","author":"Julien Delattre","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Julien Delattre","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/"},"author":{"name":"Julien Delattre","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"headline":"LOB Replication With GoldenGate and Importance of Primary Keys","datePublished":"2026-06-16T15:13:07+00:00","dateModified":"2026-06-16T15:16:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/"},"wordCount":706,"commentCount":0,"keywords":["26ai","bad_column","blob","CLOB","dba_goldengate_not_unique","GoldenGate","keycols","LOB","migration","ogg","primary key","Replication","support","table","unsupported"],"articleSection":["GoldenGate","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/","url":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/","name":"LOB Replication With GoldenGate and Importance of Primary Keys - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-06-16T15:13:07+00:00","dateModified":"2026-06-16T15:16:16+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"description":"Why primary keys are important for LOB replication with GoldenGate, and how to monitor your tables to avoid migration issues","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/lob-replication-with-goldengate-and-importance-of-primary-keys\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"LOB Replication With GoldenGate and Importance of Primary Keys"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e","name":"Julien Delattre","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","caption":"Julien Delattre"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/juliendelattre\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/152"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=44906"}],"version-history":[{"count":9,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44906\/revisions"}],"predecessor-version":[{"id":45107,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44906\/revisions\/45107"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=44906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=44906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=44906"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=44906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}