{"id":13048,"date":"2019-12-02T13:15:33","date_gmt":"2019-12-02T12:15:33","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/"},"modified":"2019-12-02T13:15:33","modified_gmt":"2019-12-02T12:15:33","slug":"real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/","title":{"rendered":"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS"},"content":{"rendered":"<p>I&#8217;ve done quite some real time logical replication projects in the past, either using <a href=\"https:\/\/www.oracle.com\/middleware\/technologies\/goldengate.html\" target=\"_blank\" rel=\"noopener noreferrer\">Oracle Golden Gate<\/a> or <a href=\"https:\/\/www.enterprisedb.com\/enterprise-postgres\/edb-postgres-replication-server\" target=\"_blank\" rel=\"noopener noreferrer\">EDB replication server<\/a>. <a href=\"https:\/\/www.postgresql.org\/docs\/12\/logical-replication.html\" target=\"_blank\" rel=\"noopener noreferrer\">Build in logical replication<\/a> in PostgreSQL (which is available since PostgreSQL 10) can be used as well when both, the source and the target are PostgreSQL instances. While being at the <a href=\"https:\/\/2019.doag.org\/en\/home\/\" target=\"_blank\" rel=\"noopener noreferrer\">DOAG conference and exhibition 2019<\/a> I got in contact with people from <a href=\"https:\/\/dbplus.tech\" target=\"_blank\" rel=\"noopener noreferrer\">DBPLUS<\/a> and they provide a product which is called &#8220;Data Replicator&#8221;. The interesting use case for me is the real time replication from Oracle to PostgreSQL as the next project for such a setup is already in the pipe so I thought I&#8217;ll give it try.<\/p>\n<p><!--more--><\/p>\n<p>The &#8220;Data Replicator&#8221; software needs to be installed on a Windows machine and all traffic will go through that machine. The following picture is stolen from the <a href=\"https:\/\/dbplus.tech\/wp-content\/uploads\/2018\/10\/DR_Users_Manual_EN.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">official &#8220;Data Replicator&#8221; documentation<\/a> and it pretty well describes the architecture when the source system is Oracle:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg\" alt=\"\" width=\"776\" height=\"810\" class=\"aligncenter size-full wp-image-35897\" \/><\/a><\/p>\n<p>As &#8220;Data Replicator&#8221; will use <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/sutil\/oracle-logminer-utility.html\" target=\"_blank\" rel=\"noopener noreferrer\">Oracle LogMiner<\/a>, no triggers need to be installed on the source system. Installing something on a validated system might become tricky so this already is a huge benefit compared to some other solutions, e.g. <a href=\"https:\/\/www.symmetricds.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">SymmetricDS<\/a>. When you know GoldenGate the overall architecture is not so much different: What GoldeGate calls the <a href=\"https:\/\/docs.oracle.com\/goldengate\/1212\/gg-winux\/GWURF\/non_ggsci_commands002.htm#GWURF1176\" target=\"_blank\" rel=\"noopener noreferrer\">extract<\/a> is the &#8220;Reader&#8221; in Data Replicator and the <a href=\"https:\/\/docs.oracle.com\/goldengate\/1212\/gg-winux\/GWURF\/ggsci_commands020.htm#GWURF183\" target=\"_blank\" rel=\"noopener noreferrer\">replicat<\/a> becomes the &#8220;Applier&#8221;.<\/p>\n<p>The installation on the Windows machine is so simple, that I&#8217;ll just be providing the screenshots without any further comments:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_020-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_020-3.png\" alt=\"\" width=\"500\" height=\"390\" class=\"aligncenter size-full wp-image-35898\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_021-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_021-3.png\" alt=\"\" width=\"499\" height=\"386\" class=\"aligncenter size-full wp-image-35899\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_022-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_022-5.png\" alt=\"\" width=\"498\" height=\"386\" class=\"aligncenter size-full wp-image-35900\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_023-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_023-4.png\" alt=\"\" width=\"498\" height=\"387\" class=\"aligncenter size-full wp-image-35901\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_024-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_024-3.png\" alt=\"\" width=\"492\" height=\"386\" class=\"aligncenter size-full wp-image-35902\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_025-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_025-6.png\" alt=\"\" width=\"495\" height=\"385\" class=\"aligncenter size-full wp-image-35903\" \/><\/a><\/p>\n<p>In the background three new services have been created and started by the installation program:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_026-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_026-6.png\" alt=\"\" width=\"1017\" height=\"88\" class=\"aligncenter size-full wp-image-35908\" \/><\/a><\/p>\n<p>There is the replication manager which is responsible for creating replication processes. And then there are two more services for reading from source and writing data to the target. In addition the graphical user interface was installed (which could also be running on another windows machine) which looks like this once you start it up:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_028-1-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_028-1-1.png\" alt=\"\" width=\"1425\" height=\"704\" class=\"aligncenter size-full wp-image-35909\" \/><\/a><\/p>\n<p>Before connecting with the GUI you should do the basic configuration by using the &#8220;DBPLUS Replication Manager Configuration&#8221; utility:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_029-1-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_029-1-1.png\" alt=\"\" width=\"812\" height=\"610\" class=\"aligncenter size-full wp-image-35911\" \/><\/a><\/p>\n<p>Once that is done you can go back to the client and connect:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_030-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_030-4.png\" alt=\"\" width=\"1425\" height=\"707\" class=\"aligncenter size-full wp-image-35912\" \/><\/a><\/p>\n<p>The initial screen has not much content, except for the possibility to create a new replication and I really like that: No overloaded, very hard to initially understand interface but easy and tidy. With only one choice it is easy to go forward so lets create a new replication:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_032-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_032-3.png\" alt=\"\" width=\"1427\" height=\"707\" class=\"aligncenter size-full wp-image-35913\" \/><\/a><\/p>\n<p>Some concept here: Very clean interface, only 5 steps to follow. My source system is Oracle 19.3 EE and all I have to do is to provide the connection parameters, admin user and a new user\/password combination I want to us for the logical replication:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_033-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_033-3.png\" alt=\"\" width=\"1426\" height=\"702\" class=\"aligncenter size-full wp-image-35914\" \/><\/a><\/p>\n<p>Asking &#8220;Data Replicator&#8221; to create the replication user, and all is fine:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_034-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_034-1.jpg\" alt=\"\" width=\"766\" height=\"518\" class=\"aligncenter size-full wp-image-35916\" \/><\/a><\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; r\n  1* select username,profile from dba_users where username = 'REPLUSR'\n\nUSERNAME                       PROFILE\n------------------------------ ------------------------------\nREPLUSR                        DEFAULT\n<\/pre>\n<p>Of course some system privileges have been granted to the user that got created:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; select privilege from dba_sys_privs where grantee = 'REPLUSR';\n\nPRIVILEGE\n----------------------------------------\nSELECT ANY TRANSACTION\nLOGMINING\nSELECT ANY DICTIONARY\nSELECT ANY TABLE\n<\/pre>\n<p>Proceeding with the target database, which is PostgreSQL 12.1 in my case:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_035-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_035-1.png\" alt=\"\" width=\"1422\" height=\"708\" class=\"aligncenter size-full wp-image-35919\" \/><\/a><\/p>\n<p>As you can see there is no option to create a user on the target. What I did is this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create user replusr with login password 'xxxxxxx';\nCREATE ROLE\npostgres=# create database offloadoracle with owner = 'replusr';\nCREATE DATABASE\npostgres=# \n<\/pre>\n<p>Once done, the connection succeeds and can be saved:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_036-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_036-1.jpg\" alt=\"\" width=\"751\" height=\"523\" class=\"aligncenter size-full wp-image-35921\" \/><\/a><\/p>\n<p>That&#8217;s all for the first step and we can proceed to step two:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_038-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_038-3.png\" alt=\"\" width=\"1426\" height=\"674\" class=\"aligncenter size-full wp-image-35923\" \/><\/a><\/p>\n<p>I have installed the <a href=\"https:\/\/github.com\/oracle\/db-sample-schemas\" target=\"_blank\" rel=\"noopener noreferrer\">Oracle sample schemas<\/a> for this little demo and as I only want to replicate these I&#8217;ve changed the selection to &#8220;REPLICATE ONLY SELECTED SCHEMAS AND TABLES&#8221;.<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_041-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_041-3.png\" alt=\"\" width=\"1426\" height=\"476\" class=\"aligncenter size-full wp-image-35924\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_040-1-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_040-1-1.png\" alt=\"\" width=\"1428\" height=\"672\" class=\"aligncenter size-full wp-image-35925\" \/><\/a><\/p>\n<p>Once more this is all that needs to be done and the next step would be to generate the report for getting an idea of possible issues:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_042-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_042-4.png\" alt=\"\" width=\"1423\" height=\"707\" class=\"aligncenter size-full wp-image-35927\" \/><\/a><\/p>\n<p>The reported issues totally make sense and you even get the commands to fix it, except for the complaints about the unique keys, of course (If you go for logical replication you should anyway make sure that each table either contains a primary key or at last a unique key). Once the Oracle database is in archive mode and supplemental log data was added the screen will look fine (I will ignore the two warnings as they are not important for this demo):<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_043-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_043-3.png\" alt=\"\" width=\"1423\" height=\"705\" class=\"aligncenter size-full wp-image-35930\" \/><\/a><\/p>\n<p>The next step is to define the &#8220;Start Options&#8221; and when you select &#8220;automatic&#8221; you&#8217;ll have to specify the options for the transfer server:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_044-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_044-1.jpg\" alt=\"\" width=\"1424\" height=\"701\" class=\"aligncenter size-full wp-image-35932\" \/><\/a><\/p>\n<p>There is a small configuration utility for that as well:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_045-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_045-4.png\" alt=\"\" width=\"432\" height=\"643\" class=\"aligncenter size-full wp-image-35933\" \/><\/a><\/p>\n<p>When you are happy with it, provide the details in the previous screen and complete the replication setup by providing a name in the last step:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_047-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_047-1.jpg\" alt=\"\" width=\"1422\" height=\"706\" class=\"aligncenter size-full wp-image-35934\" \/><\/a> <\/p>\n<p>That&#8217;s all you need to do and the replication is ready to be started:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_048-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_048-1.jpg\" alt=\"\" width=\"1422\" height=\"706\" class=\"aligncenter size-full wp-image-35936\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_049-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_049-1.jpg\" alt=\"\" width=\"1425\" height=\"461\" class=\"aligncenter size-full wp-image-35935\" \/><\/a><\/p>\n<p>&#8230; and then it immediately fails because we do not have a valid license. For getting a trial license you need to provide the computer ID which can be found in the information section:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_050-1-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_050-1-1.png\" alt=\"\" width=\"599\" height=\"611\" class=\"aligncenter size-full wp-image-35937\" \/><\/a><\/p>\n<p>Provide that to DBPLUS and request a trial license. Usually they are responding very fast:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_051-1-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_051-1-1.png\" alt=\"\" width=\"594\" height=\"615\" class=\"aligncenter size-full wp-image-35942\" \/><\/a><\/p>\n<p>Starting the replication once more:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_053-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_053-1.jpg\" alt=\"\" width=\"1427\" height=\"699\" class=\"aligncenter size-full wp-image-35943\" \/><\/a><\/p>\n<p>You&#8217;ll see new processes on the PostgreSQL side:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [14,15]\">\npostgres@centos8pg:\/home\/postgres\/ [121] ps -ef | grep postgres\nroot      1248   769  0 12:58 ?        00:00:00 sshd: postgres [priv]\npostgres  1252     1  0 12:58 ?        00:00:00 \/usr\/lib\/systemd\/systemd --user\npostgres  1256  1252  0 12:58 ?        00:00:00 (sd-pam)\npostgres  1262  1248  0 12:58 ?        00:00:00 sshd: postgres@pts\/0\npostgres  1263  1262  0 12:58 pts\/0    00:00:00 -bash\npostgres  1667     1  0 12:58 ?        00:00:00 \/u01\/app\/postgres\/product\/12\/db_0\/bin\/postgres -D \/u02\/pgdata\/12\npostgres  1669  1667  0 12:58 ?        00:00:00 postgres: checkpointer   \npostgres  1670  1667  0 12:58 ?        00:00:00 postgres: background writer   \npostgres  1671  1667  0 12:58 ?        00:00:00 postgres: walwriter   \npostgres  1672  1667  0 12:58 ?        00:00:00 postgres: autovacuum launcher   \npostgres  1673  1667  0 12:58 ?        00:00:00 postgres: stats collector   \npostgres  1674  1667  0 12:58 ?        00:00:00 postgres: logical replication launcher   \npostgres  2560  1667  0 14:40 ?        00:00:00 postgres: replusr offloadoracle 192.168.22.1(40790) idle\npostgres  2562  1667  0 14:40 ?        00:00:00 postgres: replusr offloadoracle 192.168.22.1(40800) idle\npostgres  2588  1263  0 14:40 pts\/0    00:00:00 ps -ef\npostgres  2589  1263  0 14:40 pts\/0    00:00:00 grep --color=auto postgres\n<\/pre>\n<p>&#8230; and you&#8217;ll see LogMiner proceses on the Oracle side:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nLOGMINER: summary for session# = 2147710977\nLOGMINER: StartScn: 2261972 (0x00000000002283d4)\nLOGMINER: EndScn: 18446744073709551615 (0xffffffffffffffff)\nLOGMINER: HighConsumedScn: 0\nLOGMINER: PSR flags: 0x0\nLOGMINER: Session Flags: 0x4000441\nLOGMINER: Session Flags2: 0x0\nLOGMINER: Read buffers: 4\nLOGMINER: Region Queue size: 256\nLOGMINER: Redo Queue size: 4096\nLOGMINER: Memory LWM: limit 10M, LWM 12M, 80%\nLOGMINER: Memory Release Limit: 0M\nLOGMINER: Max Decomp Region Memory: 1M\nLOGMINER: Transaction Queue Size: 1024\n2019-11-22T14:05:54.735533+01:00\nLOGMINER: Begin mining logfile for session -2147256319 thread 1 sequence 8, \/u01\/app\/oracle\/oradata\/DB1\/onlinelog\/o1_mf_2_gxh8fbhr_.log\n2019-11-22T14:05:54.759197+01:00\nLOGMINER: End   mining logfile for session -2147256319 thread 1 sequence 8, \/u01\/app\/oracle\/oradata\/DB1\/onlinelog\/o1_mf_2_gxh8fbhr_.log\n<\/pre>\n<p>In the details tab there is more information about what is currently going on:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_054-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_054-1.png\" alt=\"\" width=\"1415\" height=\"412\" class=\"aligncenter size-full wp-image-35944\" \/><\/a><\/p>\n<p>Although it looked quite good at the beginning there is the first issue:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nOracle data type is unknown: OE.CUST_ADDRESS_TYP\nStack trace:\nSystem.ArgumentException: Oracle data type is unknown: OE.CUST_ADDRESS_TYP\n   at DbPlus.DataTypes.Oracle.OracleDataTypes.Get(String name)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.c__DisplayClass22_0.g__MapSourceColumnType|1(TableColumn sourceColumn, String targetColumnName)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.c__DisplayClass25_0.g__GetColumnMapping|4(TableColumn sourceColumn)\n   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()\n   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()\n   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\n   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.c__DisplayClass25_0.b__5()\n   at DbPlus.Replicator.Alerts.AsyncTransientErrorHandler.Execute[T](Func`1 operation)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.GetTableCopyParameters(ReplicatedTable sourceTable)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.b__61_2(ReplicatedTable table)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.ExecuteOneWithTableLock(Func`1 source, Action`1 operation, Nullable`1 timeout)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.ExecuteAllWithTableLock(Func`1 source, Action`1 operation, Nullable`1 timeout)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.b__61_0()\n   at DbPlus.Replicator.Alerts.AsyncTransientErrorHandler.Block(Action action)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.StartDataTransfer()\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.ProcessRemoteOperations()\n   at DbPlus.Tasks.Patterns.TaskTemplates.c__DisplayClass0_0.&lt;g__Run|0&gt;d.MoveNext()\n--- End of stack trace from previous location where exception was thrown ---\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\n   at DbPlus.Tasks.Patterns.TaskGroup.Run(CancellationToken cancellationToken)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.Run()\n   at DbPlus.Replicator.ComponentModel.Component.RunInternal()\n<\/pre>\n<p>As with all logical replication solutions custom types are tricky and usually not supported. What I will be doing now is to replicate the &#8220;HR&#8221; and &#8220;SH&#8221; schemas only, which do not contain any custom type:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_045-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_045-5.png\" alt=\"\" width=\"1217\" height=\"495\" class=\"aligncenter size-full wp-image-36130\" \/><\/a><\/p>\n<p>Once again, starting the replication, next issue:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nOracle data type is unknown: ROWID\nStack trace:\nSystem.ArgumentException: Oracle data type is unknown: ROWID\n   at DbPlus.DataTypes.Oracle.OracleDataTypes.Get(String name)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.c__DisplayClass22_0.g__MapSourceColumnType|1(TableColumn sourceColumn, String targetColumnName)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.c__DisplayClass25_0.g__GetColumnMapping|4(TableColumn sourceColumn)\n   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()\n   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()\n   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\n   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.c__DisplayClass25_0.b__5()\n   at DbPlus.Replicator.Alerts.AsyncTransientErrorHandler.Execute[T](Func`1 operation)\n   at DbPlus.Replicator.Tracking.TableCopyParameterCreator.GetTableCopyParameters(ReplicatedTable sourceTable)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.b__61_2(ReplicatedTable table)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.ExecuteOneWithTableLock(Func`1 source, Action`1 operation, Nullable`1 timeout)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.ExecuteAllWithTableLock(Func`1 source, Action`1 operation, Nullable`1 timeout)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.b__61_0()\n   at DbPlus.Replicator.Alerts.AsyncTransientErrorHandler.Block(Action action)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.StartDataTransfer()\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.ProcessRemoteOperations()\n   at DbPlus.Tasks.Patterns.TaskTemplates.c__DisplayClass0_0.&lt;g__Run|0&gt;d.MoveNext()\n--- End of stack trace from previous location where exception was thrown ---\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\n   at DbPlus.Tasks.Patterns.TaskGroup.Run(CancellationToken cancellationToken)\n   at DbPlus.Replicator.Tracking.ReplicatedTablesTracker.Run()\n   at DbPlus.Replicator.ComponentModel.Component.RunInternal()\n<\/pre>\n<p>Lets check which column(s) and table(s) that is\/are:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; SELECT owner, table_name, column_name from dba_tab_columns where data_type = 'ROWID' and owner in ('HR','SH');\n\nOWNER                TABLE_NAME                     COLUMN_NAME\n-------------------- ------------------------------ ------------------------------\nSH                   DR$SUP_TEXT_IDX$U              RID\nSH                   DR$SUP_TEXT_IDX$K              TEXTKEY\n<\/pre>\n<p>Such columns can be easily excluded:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_046-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_046-5.png\" alt=\"\" width=\"1130\" height=\"742\" class=\"aligncenter size-full wp-image-36131\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_047-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_047-4.png\" alt=\"\" width=\"1224\" height=\"563\" class=\"aligncenter size-full wp-image-36132\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_048-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_048-3.png\" alt=\"\" width=\"1917\" height=\"919\" class=\"aligncenter size-full wp-image-36133\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_049-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_049-2.png\" alt=\"\" width=\"1917\" height=\"910\" class=\"aligncenter size-full wp-image-36134\" \/><\/a><\/p>\n<p>Starting over again, next issue:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_050-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_050-2.png\" alt=\"\" width=\"1900\" height=\"268\" class=\"aligncenter size-full wp-image-36136\" \/><\/a><\/p>\n<p>At least the schemas need to exist on the target, so:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# \\c offloadoracle postgres\nYou are now connected to database \"offloadoracle\" as user \"postgres\".\noffloadoracle=# create schema sh;\nCREATE SCHEMA\noffloadoracle=# create schema hr;\nCREATE SCHEMA\noffloadoracle=# \n<\/pre>\n<p>Next try:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_051-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_051-2.png\" alt=\"\" width=\"1458\" height=\"437\" class=\"aligncenter size-full wp-image-36137\" \/><\/a><\/p>\n<p>On the source side:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; grant flashback any table to REPLUSR;\n\nGrant succeeded.\n\nSQL&gt; \n<\/pre>\n<p>On the target side:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\noffloadoracle=# grant all on schema hr to replusr;\nGRANT\noffloadoracle=# grant all on schema sh to replusr;\nGRANT\n<\/pre>\n<p>Finally most of the tables are replicating fine now:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_052-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_052-1.png\" alt=\"\" width=\"1911\" height=\"572\" class=\"aligncenter size-full wp-image-36138\" \/><\/a><\/p>\n<p>There are a few warnings about missing unique keys and some tables can not be replicated at all:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_053-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_053-1.png\" alt=\"\" width=\"1668\" height=\"453\" class=\"aligncenter size-full wp-image-36139\" \/><\/a><\/p>\n<p>For now I am just going to exclude the failed tables as this is fine for the scope of this post:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_054-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_054-2.png\" alt=\"\" width=\"1666\" height=\"638\" class=\"aligncenter size-full wp-image-36140\" \/><\/a><\/p>\n<p>&#8230; an my replication is fine. A quick check on the target:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\noffloadoracle=# select * from sh.products limit 3;\n prod_id |           prod_name           |           prod_desc           | prod_subcategory | prod_subcategory_id | prod_subcategory_desc |        prod_category        | prod_category_id |     prod_category_desc      | prod_weight_class | prod_unit_of_measure | prod_pac&gt;\n---------+-------------------------------+-------------------------------+------------------+---------------------+-----------------------+-----------------------------+------------------+-----------------------------+-------------------+----------------------+---------&gt;\n      13 | 5MP Telephoto Digital Camera  | 5MP Telephoto Digital Camera  | Cameras          |     2044.0000000000 | Cameras               | Photo                       |   204.0000000000 | Photo                       |                 1 | U                    | P       &gt;\n      14 | 17\" LCD w\/built-in HDTV Tuner | 17\" LCD w\/built-in HDTV Tuner | Monitors         |     2035.0000000000 | Monitors              | Peripherals and Accessories |   203.0000000000 | Peripherals and Accessories |                 1 | U                    | P       &gt;\n      15 | Envoy 256MB - 40GB            | Envoy 256MB - 40Gb            | Desktop PCs      |     2021.0000000000 | Desktop PCs           | Hardware                    |   202.0000000000 | Hardware                    |                 1 | U                    | P       &gt;\n(3 rows)\n\nlines 1-7\/7 (END)\n<\/pre>\n<p>&#8230; confirms the data is there. As this post is already long enough here some final thoughts: The installation of &#8220;Data Replicator&#8221; is a no-brainer. I really like the simple interface and setting up a replication between Oracle and PostgreSQL is quite easy. Of course you need to know the issues you can run into with logical replication (missing unique or primary keys, not supported data types, &#8230;) but this is the same topic for all solutions. What I can say for sure is, that I never was as fast for setting up a demo replication as with &#8220;Data Replicator&#8221;. More testing to come &#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve done quite some real time logical replication projects in the past, either using Oracle Golden Gate or EDB replication server. Build in logical replication in PostgreSQL (which is available since PostgreSQL 10) can be used as well when both, the source and the target are PostgreSQL instances. While being at the DOAG conference and [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":13049,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[1751,1752,1074,96,77],"type_dbi":[],"class_list":["post-13048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","tag-data-replicator","tag-dbplus","tag-logical-replication","tag-oracle","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS - dbi Blog<\/title>\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\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS\" \/>\n<meta property=\"og:description\" content=\"I&#8217;ve done quite some real time logical replication projects in the past, either using Oracle Golden Gate or EDB replication server. Build in logical replication in PostgreSQL (which is available since PostgreSQL 10) can be used as well when both, the source and the target are PostgreSQL instances. While being at the DOAG conference and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-02T12:15:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"776\" \/>\n\t<meta property=\"og:image:height\" content=\"810\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 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\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS\",\"datePublished\":\"2019-12-02T12:15:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/\"},\"wordCount\":1095,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg\",\"keywords\":[\"Data Replicator\",\"DBPlus\",\"Logical Replication\",\"Oracle\",\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/\",\"name\":\"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg\",\"datePublished\":\"2019-12-02T12:15:33+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg\",\"width\":776,\"height\":810},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS\"}]},{\"@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\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS - dbi Blog","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\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/","og_locale":"en_US","og_type":"article","og_title":"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS","og_description":"I&#8217;ve done quite some real time logical replication projects in the past, either using Oracle Golden Gate or EDB replication server. Build in logical replication in PostgreSQL (which is available since PostgreSQL 10) can be used as well when both, the source and the target are PostgreSQL instances. While being at the DOAG conference and [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/","og_site_name":"dbi Blog","article_published_time":"2019-12-02T12:15:33+00:00","og_image":[{"width":776,"height":810,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg","type":"image\/jpeg"}],"author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS","datePublished":"2019-12-02T12:15:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/"},"wordCount":1095,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg","keywords":["Data Replicator","DBPlus","Logical Replication","Oracle","PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/","url":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/","name":"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg","datePublished":"2019-12-02T12:15:33+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Selection_019-1.jpg","width":776,"height":810},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/real-time-replication-from-oracle-to-postgresql-using-data-replicator-from-dbplus\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Real time replication from Oracle to PostgreSQL using Data Replicator from DBPLUS"}]},{"@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\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13048","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\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=13048"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/13049"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=13048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=13048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=13048"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=13048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}