{"id":13752,"date":"2020-03-23T10:41:44","date_gmt":"2020-03-23T09:41:44","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/"},"modified":"2020-03-23T10:41:44","modified_gmt":"2020-03-23T09:41:44","slug":"migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/","title":{"rendered":"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC)"},"content":{"rendered":"<p>This is the last post in this little series about migrating on Oracle instance to AWS Aurora with PostgreSQL compatibility. For the previous one you can check <a href=\"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-1-setting-up-the-base-infrastructure\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>, <a href=\"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-2-the-aws-schema-conversion-tool-sct\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a> and <a href=\"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-3-data-replication-with-aws-dms\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>. In this post we&#8217;ll look at how you can configure change data capture so that changes on the source Oracle instance are automatically replicated to the target Aurora instance. In a real life migration this is what you probably need as long down times are usually not acceptable. We&#8217;ll be starting from exactly the same state we left of in the previous post.<\/p>\n<p><!--more--><\/p>\n<p>We&#8217;ve initially loaded the source &#8220;SH&#8221; schema from Oracle to AWS Aurora and now we want to replicate all the changes that are happening on the source to the target as well. Remember that AWS DMS sits between the source and the target and the we need a source end point and a target end point:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png\" alt=\"\" width=\"975\" height=\"485\" class=\"aligncenter size-full wp-image-38427\" \/><\/a><\/p>\n<p>We can use exactly the same end points as in the previous post (nothing to add or modify here):<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_2.jpg\" alt=\"\" width=\"1000\" height=\"171\" class=\"aligncenter size-full wp-image-38430\" \/><\/a><\/p>\n<p>What we need to configure is a new database migration task. We still have the task we used to do the initial loading which could be modified but I prefer to keep it separated and will go ahead with a new task:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_3.jpg\" alt=\"\" width=\"1000\" height=\"137\" class=\"aligncenter size-full wp-image-38431\" \/><\/a><\/p>\n<p>We&#8217;ll be using the same replication instance and the same end points but &#8220;Migration type&#8221; will be &#8220;Replicate data changes only&#8221;. We already enabled &#8220;supplemental logging&#8221; in the last post so the warning can be ignored:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_4.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_4.jpg\" alt=\"\" width=\"800\" height=\"723\" class=\"aligncenter size-full wp-image-38432\" \/><\/a><\/p>\n<p>We&#8217;ll go with the default task settings:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_5.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_5.jpg\" alt=\"\" width=\"800\" height=\"775\" class=\"aligncenter size-full wp-image-38434\" \/><\/a><\/p>\n<p>As I know that nothing happened on the source I do not need to specify a specific start point for the replication. The same is true for the tables on the target: I already know that the tables are there and that the content of the tables on the target is the same as on the source. For the LOB stuff I&#8217;ll go with the defaults as well.<\/p>\n<p>The table mappings section is configured the same as we did it for the initial load previously. We want to replicate all tables in the &#8220;SH&#8221; schema:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_6.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_6.jpg\" alt=\"\" width=\"800\" height=\"666\" class=\"aligncenter size-full wp-image-38435\" \/><\/a><\/p>\n<p>Finally all the defaults for the remaining parameters of the task:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_7.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_7.jpg\" alt=\"\" width=\"800\" height=\"215\" class=\"aligncenter size-full wp-image-38437\" \/><\/a><\/p>\n<p>While the task is creating:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_8.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_8.jpg\" alt=\"\" width=\"1000\" height=\"244\" class=\"aligncenter size-full wp-image-38438\" \/><\/a><\/p>\n<p>&#8230; you&#8217;ll see that LogMiner is starting on the source Oracle instance:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n2020-03-23T08:44:08.261039+01:00\nThread 1 advanced to log sequence 39 (LGWR switch)\n  Current log# 3 seq# 39 mem# 0: \/u03\/oradata\/DB19\/redog3m1DB19.dbf\n  Current log# 3 seq# 39 mem# 1: \/u04\/oradata\/DB19\/redog3m2DB19.dbf\n2020-03-23T08:44:08.398220+01:00\nARC2 (PID:4670): Archived Log entry 15 added for T-1.S-38 ID 0x2c7a7c94 LAD:1\n2020-03-23T08:54:41.598409+01:00\nLOGMINER: summary for session# = 2147484673\nLOGMINER: StartScn: 1084978 (0x0000000000108e32)\nLOGMINER: EndScn: 1085221 (0x0000000000108f25)\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\n2020-03-23T08:54:41.627157+01:00\nLOGMINER: Begin mining logfile for session -2147482623 thread 1 sequence 39, \/u03\/oradata\/DB19\/redog3m1DB19.dbf\n2020-03-23T08:54:46.780204+01:00\nLOGMINER: summary for session# = 2147485697\nLOGMINER: StartScn: 1085020 (0x0000000000108e5c)\nLOGMINER: EndScn: 1085288 (0x0000000000108f68)\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\n2020-03-23T08:54:46.788212+01:00\nLOGMINER: Begin mining logfile for session -2147481599 thread 1 sequence 39, \/u03\/oradata\/DB19\/redog3m1DB19.dbf\n2020-03-23T08:54:51.861617+01:00\nLOGMINER: summary for session# = 2147486721\nLOGMINER: StartScn: 1085087 (0x0000000000108e9f)\nLOGMINER: EndScn: 1085362 (0x0000000000108fb2)\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\n2020-03-23T08:54:51.868450+01:00\nLOGMINER: Begin mining logfile for session -2147480575 thread 1 sequence 39, \/u03\/oradata\/DB19\/redog3m1DB19.dbf\n<\/pre>\n<p>The task itself will report it&#8217;s status as &#8220;Replication ongoing&#8221; a few moments later:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_9.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_9.jpg\" alt=\"\" width=\"1000\" height=\"234\" class=\"aligncenter size-full wp-image-38440\" \/><\/a><\/p>\n<p>Having a look at the table statistics section of the tasks of course all is reported as zero at the moment:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_10.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_10.jpg\" alt=\"\" width=\"1000\" height=\"398\" class=\"aligncenter size-full wp-image-38441\" \/><\/a><\/p>\n<p>Time to do some changes in Oracle and check if these changes will be properly replicated to the Aurora target instance. Let&#8217;s create a new table on the Oracle side:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; create table sh.test ( a number );\n\nTable created.\n<\/pre>\n<p>This table will show up in the AWS DMS console quite fast:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_11.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_11.jpg\" alt=\"\" width=\"1000\" height=\"439\" class=\"aligncenter size-full wp-image-38442\" \/><\/a><\/p>\n<p>&#8230; and is also available on the target Aurora side:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; \\d \"SH\".\"TEST\"\n           Table \"SH.TEST\"\n Column |      Type      | Modifiers \n--------+----------------+-----------\n A      | numeric(38,10) | \n\npostgres=&gt; select * from \"SH\".\"TEST\";\n A \n---\n(0 rows)\n<\/pre>\n<p>Inserting data on the source:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; insert into sh.test values(1);\n\n1 row created.\n\nSQL&gt; commit;\n\nCommit complete.\n<\/pre>\n<p>&#8230; and nothing happens on the target side. Why does DDL succeed but DML not? Well, first of all it takes some time for the changes to show up in the console. Doing some more inserts on the source and waiting some time:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; insert into sh.test values(2);\n\n1 row created.\n\nSQL&gt; commit;    \n\nCommit complete.\n\nSQL&gt; insert into sh.test values(3);\n\n1 row created.\n\nSQL&gt; commit;\n\nCommit complete.\n<\/pre>\n<p>&#8230; the changes are actually recorded:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_12.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_12.jpg\" alt=\"\" width=\"1000\" height=\"451\" class=\"aligncenter size-full wp-image-38445\" \/><\/a><\/p>\n<p>&#8230; but nothing arrives on the target:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; select * from \"SH\".\"TEST\";\n A \n---\n(0 rows)\n<\/pre>\n<p>Why that? Let&#8217;s do some more inserts:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; insert into sh.test select -1 from dba_objects;\n\n23522 rows created.\n\nSQL&gt; commit;\n\nCommit complete.\n<\/pre>\n<p>This is reported as &#8220;1&#8221; insert in the console as the number of inserts switched from 6 to 7:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_13.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_13.jpg\" alt=\"\" width=\"1000\" height=\"445\" class=\"aligncenter size-full wp-image-38447\" \/><\/a><\/p>\n<p>Some picture, nothing there on the target. The issues was, that supplemental logging needs to be enabled for each table or on the database level, and this is what I did:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;\n<\/pre>\n<p>Re-creating the table on Oracle side:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nSQL&gt; drop table sh.test;\n\nTable dropped.\n\nSQL&gt; create table sh.test ( a number primary key );\n\nTable created.\n\nSQL&gt; insert into sh.test values(1);\n\n1 row created.\n\nSQL&gt; insert into sh.test values(2);\n\n1 row created.\n\nSQL&gt; commit;\n\nCommit complete.\n\nSQL&gt; \n<\/pre>\n<p>From now on new data is showing up in the target Aurora instance:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; select * from \"SH\".\"TEST\";\n      A       \n--------------\n 1.0000000000\n 2.0000000000\n(2 rows)\n\npostgres=&gt; \n<\/pre>\n<p>So, again, quite easy to setup. Of course the usual bits apply as for every logical replication: You should have primary keys or at least unique keys on the source tables for the replication to run performant and smooth. Another point to add here: When you check the settings of the replication task there is one important parameter that should be enabled (you need to stop the task, otherwise it can not be modified):<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_14.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_14.png\" alt=\"\" width=\"800\" height=\"520\" class=\"aligncenter size-full wp-image-38451\" \/><\/a><\/p>\n<p>Enabling this will create additional tables in the target Aurora instance and these give you more information on what is going on with the replication:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; select * from pg_tables where tablename like 'awsdms%';\n schemaname  |        tablename        | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity \n-------------+-------------------------+------------+------------+------------+----------+-------------+-------------\n public      | awsdms_apply_exceptions | postgres   |            | f          | f        | f           | f\n aws_postgis | awsdms_apply_exceptions | postgres   |            | f          | f        | f           | f\n public      | awsdms_history          | postgres   |            | t          | f        | f           | f\n public      | awsdms_status           | postgres   |            | t          | f        | f           | f\n public      | awsdms_suspended_tables | postgres   |            | t          | f        | f           | f\n(5 rows)\n<\/pre>\n<p>Here is an example of the replication history:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=&gt; select * from awsdms_history;\n      server_name      |         task_name          |   timeslot_type   |      timeslot       | timeslot_duration | timeslot_latency | timeslot_records | timeslot_volume \n-----------------------+----------------------------+-------------------+---------------------+-------------------+------------------+------------------+-----------------\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:42:29 |                 0 |                0 |                0 |               0\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:47:29 |                 5 |                0 |            70592 |              28\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:52:29 |                 5 |                0 |                6 |               0\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:57:30 |                 5 |                0 |                0 |               0\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:02:31 |                 5 |                0 |                0 |               0\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:07:31 |                 5 |                0 |                0 |               0\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:12:32 |                 5 |                0 |                0 |               0\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:17:32 |                 5 |                0 |                0 |               0\n localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:22:39 |                 0 |                0 |                0 |               0\n(9 rows)\n<\/pre>\n<p>These tables can be used to monitor the replication, especially the apply exceptions. <\/p>\n<p>To conclude this final post: The AWS Schema Conversion Tool is a great help for converting the schema and even comes with some Oracle compatibility. Use it, it saves a lot of manual work. AWS DMS on the other side is really easy to implement, the initial load is really easy to setup and change data capture works as expected. Of course this was only a playground and real issues will pop up when you do a real migration, especially when you have to migrate business logic inside the database.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the last post in this little series about migrating on Oracle instance to AWS Aurora with PostgreSQL compatibility. For the previous one you can check here, here and here. In this post we&#8217;ll look at how you can configure change data capture so that changes on the source Oracle instance are automatically replicated [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":13753,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[1871,133,15,77],"type_dbi":[],"class_list":["post-13752","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","tag-aurora","tag-aws","tag-migration","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC) - 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\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC)\" \/>\n<meta property=\"og:description\" content=\"This is the last post in this little series about migrating on Oracle instance to AWS Aurora with PostgreSQL compatibility. For the previous one you can check here, here and here. In this post we&#8217;ll look at how you can configure change data capture so that changes on the source Oracle instance are automatically replicated [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-23T09:41:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"975\" \/>\n\t<meta property=\"og:image:height\" content=\"485\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"7 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\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC)\",\"datePublished\":\"2020-03-23T09:41:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/\"},\"wordCount\":826,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/aws_dms_cdc_1.png\",\"keywords\":[\"Aurora\",\"AWS\",\"Migration\",\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/\",\"name\":\"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC) - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/aws_dms_cdc_1.png\",\"datePublished\":\"2020-03-23T09:41:44+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/aws_dms_cdc_1.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/aws_dms_cdc_1.png\",\"width\":975,\"height\":485},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC)\"}]},{\"@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":"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC) - 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\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/","og_locale":"en_US","og_type":"article","og_title":"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC)","og_description":"This is the last post in this little series about migrating on Oracle instance to AWS Aurora with PostgreSQL compatibility. For the previous one you can check here, here and here. In this post we&#8217;ll look at how you can configure change data capture so that changes on the source Oracle instance are automatically replicated [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/","og_site_name":"dbi Blog","article_published_time":"2020-03-23T09:41:44+00:00","og_image":[{"width":975,"height":485,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png","type":"image\/png"}],"author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC)","datePublished":"2020-03-23T09:41:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/"},"wordCount":826,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png","keywords":["Aurora","AWS","Migration","PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/","url":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/","name":"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC) - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png","datePublished":"2020-03-23T09:41:44+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/aws_dms_cdc_1.png","width":975,"height":485},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Migrating an Oracle instance to AWS Aurora \u2013 4 \u2013 AWS DMS Change Data Capture (CDC)"}]},{"@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\/13752","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=13752"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13752\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/13753"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=13752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=13752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=13752"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=13752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}