{"id":7576,"date":"2016-04-16T21:12:01","date_gmt":"2016-04-16T19:12:01","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/"},"modified":"2016-04-16T21:12:01","modified_gmt":"2016-04-16T19:12:01","slug":"a-short-glance-at-attunity-replicate","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/","title":{"rendered":"A short glance at Attunity replicate"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nIf you follow my blog, you should know that I really like Dbvisit replicate because it&#8217;s simple, robust, has good features and excellent support. But that&#8217;s not a reason to ignore other alternatives (and this is the reason of <a href=\"https:\/\/www.dbi-services.com\/news-en\/replication-event-2\/\" title=\"our replication event in May\">https:\/\/www.dbi-services.com\/news-en\/replication-event-2\/<\/a>). When you have heterogeneous sources (not only Oracle) there is Oracle Golden Gate with very powerful possibilities, but maybe not an easy learning curve because of lack of simple GUI and setup wizard. You may need something more simple but still able to connect to heterogeneous sources. In this post, I am testing another logical replication software, Attunity replicate which has a very easy GUI to start and has connectors (called &#8216;endpoints&#8217;) for lot all databases.<br \/>\n<!--more--><br \/>\nI&#8217;m trying the free trial version, installed on my laptop (Windows 10) and accessed through web browser. Here is how the Attunity Replicate architecture looks like:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0000.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0000.png\" alt=\"CaptureAttunity0000\" width=\"770\" height=\"438\" class=\"alignnone size-full wp-image-8139\" \/><\/a><br \/>\nBulk reader\/loader are for initialization, CDC is the redo mining process and Stream Loader the one that applies to destination. Those are connectors to RDBMS (and other source\/destinations). A common engine does the filtering and transformation.<\/p>\n<h3>Replication profile<\/h3>\n<p>I define a new replication task where my goal is to replicate one simple table, EMP2, a copy of SCOTT.EMP:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0101.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0101.png\" alt=\"CaptureAttunity0101\" width=\"952\" height=\"706\" class=\"alignnone size-full wp-image-8130\" \/><\/a><br \/>\nThis task will do the first initialization and run real-time replication.<\/p>\n<h3>Source database<\/h3>\n<p>I need to define the databases. Interestingly, there is nothing to install on source and destination. The replication server connects only through SQL*Net:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0102.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0102.png\" alt=\"CaptureAttunity0102\" width=\"911\" height=\"712\" class=\"alignnone size-full wp-image-8129\" \/><\/a><br \/>\nI use SYSTEM here for simplicity. You need a user that can access some system tables and views, be able to create a directory,read files, etc.<\/p>\n<p>That&#8217;s probably defined in the documentation, but I like to do my first trial just by exploring. In case you missed one, don&#8217;t worry, the &#8216;test&#8217; button will check for everything. Here is an example when you try to use SCOTT:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0115.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0115.png\" alt=\"CaptureAttunity0115\" width=\"557\" height=\"298\" class=\"alignnone size-full wp-image-8135\" \/><\/a><br \/>\nV$LOGMNR_LOGS&#8230; That&#8217;s interesting. LogMiner may not be the most efficient, and may not support all datatypes, but it&#8217;s the only Oracle supported way to read redo logs.<\/p>\n<p>Advanced tab is very interesting about it as it shows that there are two possibilities to mine Oracle redo stream: use LogMiner or read binary files (archived + online from source, or only archived logs shipped to another location). It supports ASM (and RAC) and it supports encryption (TDE).<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0103.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0103.png\" alt=\"CaptureAttunity0103\" width=\"794\" height=\"702\" class=\"alignnone size-full wp-image-8128\" \/><\/a><\/p>\n<p>I&#8217;ve unchecked &#8216;automatically add supplemental logging&#8217; here because it&#8217;s something I want to do manually because it requires an exclusive lock on the source tables. You can let it do automatically if you have no application running on the source when you will start, but that&#8217;s probably not the case. Doing it manually let me do this preparation off business hours.<br \/>\nThe problem is that you have then to run it for all the tables:<\/p>\n<ul>\n<li>ADD SUPPLEMENTAL LOG DATA at database level<\/li>\n<li>ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS for all tables that have primary keys<\/li>\n<li>ADD SUPPLEMENTAL LOG DATA ADD SUPPLEMENTAL LOG DATA (&#8230;) COLUMNS naming unique columns as well as columns that are used to filter redo records<\/li>\n<li>ADD SUPPLEMENTAL LOG DATA ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS for tables that have no unique columns<\/li>\n<\/ul>\n<p>Something is missing here for me: I would like to run the DDL manually, but have the script generated automatically.<\/p>\n<h3>Target database<\/h3>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0104.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0104.png\" alt=\"CaptureAttunity0104\" width=\"905\" height=\"707\" class=\"alignnone size-full wp-image-8127\" \/><\/a><\/p>\n<p>Direct-path insert is something that we want for the bulk load, except if we have tables or indexes that do not support OCI direct-path inserts. Then it will use conventional array insert. But it seems that this setting is per-task and not per-table.<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0105.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0105.png\" alt=\"CaptureAttunity0105\" width=\"901\" height=\"709\" class=\"alignnone size-full wp-image-8126\" \/><\/a><\/p>\n<h3>Task design<\/h3>\n<p>I&#8217;ve selected my table with the &#8216;Table Selection&#8217; wizard:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0106.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0106.png\" alt=\"CaptureAttunity0106\" width=\"1075\" height=\"686\" class=\"alignnone size-full wp-image-8125\" \/><\/a><\/p>\n<p>With &#8216;Table Settings&#8217; you can customize columns, filter rows:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0107.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0107.png\" alt=\"CaptureAttunity0107\" width=\"1069\" height=\"702\" class=\"alignnone size-full wp-image-8124\" \/><\/a><br \/>\nWith &#8216;Global Transformation&#8217; you can add rules to transform tables or columns that follow a pattern.<\/p>\n<h3>Bulk Load<\/h3>\n<p>There is a &#8216;Run&#8217; button that will bulk load the tables and start real-time replication, but let&#8217;s look at the &#8216;advanced&#8217; options:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0108.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0108.png\" alt=\"CaptureAttunity0108\" width=\"381\" height=\"309\" class=\"alignnone size-full wp-image-8123\" \/><\/a><br \/>\nYou can managed the initial load yourself, which is good (for example to initialize with a RMAN duplicate or an activated standby) but I would like to set an SCN there instead of a timestamp.<br \/>\nAbility to reload is good, but that&#8217;s something we may want to do not for all tables but, for example, for one table that we reorganized at the source.<\/p>\n<p>Those are the cases where simple GUI wizard have their limits. It&#8217;s good to start but you may quickly have to do things a little more complex.<\/p>\n<p>If I click on the simple run button, everything is smooth: it will do the initial load and then run replication.<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0109.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0109.png\" alt=\"CaptureAttunity0109\" width=\"352\" height=\"353\" class=\"alignnone size-full wp-image-8122\" \/><\/a><\/p>\n<p>I started a transaction on my table that I&#8217;ve not commited yet:<\/p>\n<pre><code>\n03:15:50 SQL&gt; update emp2 set sal=sal+100;\n14 rows updated.\n<\/code><\/pre>\n<p>And the behaviour looks ok: wait the end of current transactions:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0110.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0110.png\" alt=\"CaptureAttunity0110\" width=\"404\" height=\"303\" class=\"alignnone size-full wp-image-8121\" \/><\/a><\/p>\n<p>My good surprise is that there is no lock waits, which would have blocked DML activity.<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0111.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0111.png\" alt=\"CaptureAttunity0111\" width=\"1491\" height=\"645\" class=\"alignnone size-full wp-image-8120\" \/><\/a><\/p>\n<p>From trace files (yes this is my first trial and I&#8217;ve already set trace for all session coming from repctl.exe and anyway, I cannot post a blog with only screenshots&#8230;) it reads V$TRANSACTION every few seconds:<\/p>\n<pre><code>\n=====================\nPARSING IN CURSOR #140631075113120 len=49 dep=0 uid=5 oct=3 lid=5 tim=1460820357503567 hv=3003898522 ad='86236a30' sqlid='6ffgmn2thrqnu'\nSELECT XIDUSN, XIDSLOT, XIDSQN FROM V$TRANSACTION\nEND OF STMT\nPARSE #140631075113120:c=3999,e=4414,p=0,cr=2,cu=0,mis=1,r=0,dep=0,og=1,plh=3305425530,tim=1460820357503547\nEXEC #140631075113120:c=0,e=62,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=3305425530,tim=1460820357503922\nWAIT #140631075113120: nam='SQL*Net message to client' ela= 22 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460820357504052\nFETCH #140631075113120:c=0,e=392,p=0,cr=0,cu=2,mis=0,r=2,dep=0,og=1,plh=3305425530,tim=1460820357504540\nWAIT #140631075113120: nam='SQL*Net message from client' ela= 1033 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460820357505766\n...\n*** 2016-04-17 03:26:52.265\nWAIT #140631074940472: nam='SQL*Net message from client' ela= 5216008 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460820412265018\nEXEC #140631074940472:c=0,e=25,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=735420252,tim=1460820412265099\nWAIT #140631074940472: nam='control file sequential read' ela= 8 file#=0 block#=1 blocks=1 obj#=-1 tim=1460820412265137\nWAIT #140631074940472: nam='control file sequential read' ela= 3 file#=0 block#=16 blocks=1 obj#=-1 tim=1460820412265152\nWAIT #140631074940472: nam='control file sequential read' ela= 3 file#=0 block#=18 blocks=1 obj#=-1 tim=1460820412265163\nWAIT #140631074940472: nam='control file sequential read' ela= 3 file#=0 block#=1 blocks=1 obj#=-1 tim=1460820412265205\nWAIT #140631074940472: nam='control file sequential read' ela= 2 file#=0 block#=16 blocks=1 obj#=-1 tim=1460820412265215\nWAIT #140631074940472: nam='control file sequential read' ela= 3 file#=0 block#=18 blocks=1 obj#=-1 tim=1460820412265225\nWAIT #140631074940472: nam='control file sequential read' ela= 3 file#=0 block#=281 blocks=1 obj#=-1 tim=1460820412265235\nWAIT #140631074940472: nam='SQL*Net message to client' ela= 2 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460820412265257\nFETCH #140631074940472:c=0,e=168,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=735420252,tim=1460820412265278\n&nbsp;\n*** 2016-04-17 03:26:57.498\nWAIT #140631074940472: nam='SQL*Net message from client' ela= 5233510 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460820417498816\nEXEC #140631074940472:c=0,e=125,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=735420252,tim=1460820417499357\nWAIT #140631074940472: nam='control file sequential read' ela= 42 file#=0 block#=1 blocks=1 obj#=-1 tim=1460820417499592\nWAIT #140631074940472: nam='control file sequential read' ela= 26 file#=0 block#=16 blocks=1 obj#=-1 tim=1460820417499819\nWAIT #140631074940472: nam='control file sequential read' ela= 16 file#=0 block#=18 blocks=1 obj#=-1 tim=1460820417499890\nWAIT #140631074940472: nam='control file sequential read' ela= 14 file#=0 block#=1 blocks=1 obj#=-1 tim=1460820417500081\nWAIT #140631074940472: nam='control file sequential read' ela= 17 file#=0 block#=16 blocks=1 obj#=-1 tim=1460820417500177\nWAIT #140631074940472: nam='control file sequential read' ela= 11 file#=0 block#=18 blocks=1 obj#=-1 tim=1460820417500237\nWAIT #140631074940472: nam='control file sequential read' ela= 47 file#=0 block#=281 blocks=1 obj#=-1 tim=1460820417500324\nWAIT #140631074940472: nam='SQL*Net message to client' ela= 7 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460820417500470\nFETCH #140631074940472:c=2000,e=1109,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=735420252,tim=1460820417500550\n<\/code><\/pre>\n<p>So it seems that it waits for a point where there is no current transaction, which is the right thing to do because it cannot replicate transactions that start before redo mining.<br \/>\nHowever, be careful, there is a &#8216;transaction consistency timeout&#8217; that defaults to 10 minutes and it seems that the load just starts after this &#8216;timeout&#8217;. The risk is that if those transactions finally change the tables you replicate, you will get a lot of replication conflicts.<\/p>\n<p>So I commit my transaction and the bulk load starts.<\/p>\n<pre><code>\n03:15:45 SQL&gt; commit;\n<\/code><\/pre>\n<p>Here is what we can see from the trace:<\/p>\n<pre><code>\nPARSING IN CURSOR #139886395075952 len=206 dep=0 uid=5 oct=3 lid=5 tim=1460819745436746 hv=3641549327 ad='8624b838' sqlid='g2vhbszchv8hg'\nselect directory_name from all_directories where directory_path = '\/u01\/app\/oracle\/fast_recovery_area\/XE\/onlinelog' and (directory_name = 'ATTUREP_27C9EEFCEMP2' or 'ATTUREP_' != substr(directory_name,1,8) )\nEND OF STMT\n<\/code><\/pre>\n<p>This is a clue that Attunity Replicate creates a directory object (It&#8217;s actually created in SYS and I would prefer to be informed of that kind of things&#8230;)<br \/>\nAnd here is how redo is read &#8211; through SQL*Net:<\/p>\n<pre><code>\nWAIT #0: nam='BFILE get length' ela= 18  =0  =0  =0 obj#=-1 tim=1460819745437732\nLOBGETLEN: c=0,e=84,p=0,cr=0,cu=0,tim=1460819745437768\nWAIT #0: nam='SQL*Net message to client' ela= 3 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745437787\nWAIT #0: nam='SQL*Net message from client' ela= 225 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745438025\nWAIT #0: nam='BFILE open' ela= 53  =0  =0  =0 obj#=-1 tim=1460819745438113\nLOBFILOPN: c=0,e=78,p=0,cr=0,cu=0,tim=1460819745438125\nWAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745438137\nWAIT #0: nam='SQL*Net message from client' ela= 196 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745438341\nWAIT #0: nam='BFILE internal seek' ela= 15  =0  =0  =0 obj#=-1 tim=1460819745438379\nWAIT #0: nam='BFILE read' ela= 13  =0  =0  =0 obj#=-1 tim=1460819745438401\nWAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745438410\nLOBREAD: c=0,e=56,p=0,cr=0,cu=0,tim=1460819745438416\nWAIT #0: nam='SQL*Net message from client' ela= 208 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745438636\nWAIT #0: nam='BFILE internal seek' ela= 4  =0  =0  =0 obj#=-1 tim=1460819745438672\nWAIT #0: nam='BFILE read' ela= 14  =0  =0  =0 obj#=-1 tim=1460819745438695\nWAIT #0: nam='SQL*Net message to client' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745438706\nLOBREAD: c=0,e=48,p=0,cr=0,cu=0,tim=1460819745438713\nWAIT #0: nam='SQL*Net message from client' ela= 361 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745439086\nWAIT #0: nam='BFILE internal seek' ela= 4  =0  =0  =0 obj#=-1 tim=1460819745439124\nWAIT #0: nam='BFILE read' ela= 4  =0  =0  =0 obj#=-1 tim=1460819745439135\nWAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1460819745439144\nWAIT #0: nam='BFILE internal seek' ela= 2  =0  =0  =0 obj#=-1 tim=1460819745439156\nWAIT #0: nam='BFILE read' ela= 2  =0  =0  =0 obj#=-1 tim=1460819745439167\nWAIT #0: nam='BFILE internal seek' ela= 2  =0  =0  =0 obj#=-1 tim=1460819745439178\nWAIT #0: nam='BFILE read' ela= 2  =0  =0  =0 obj#=-1 tim=1460819745439188\n<\/code><\/pre>\n<p>So it probably reads the redo through utl_file and transfer it as a BLOB. This is good for simplicity when we want to install nothing on the source, but on the other hand, this means that filtering cannot be done upstream.<\/p>\n<h3>Change Data Capture<\/h3>\n<p>The GUI show the overall monitoring. Here are my transactions that are captured and buffered until they are commited:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0112.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0112.png\" alt=\"CaptureAttunity0112\" width=\"1275\" height=\"762\" class=\"alignnone size-full wp-image-8119\" \/><\/a><\/p>\n<p>and once they are commited they are applied:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0113.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0113.png\" alt=\"CaptureAttunity0113\" width=\"1352\" height=\"563\" class=\"alignnone size-full wp-image-8118\" \/><\/a><\/p>\n<h3>Conflict resolution<\/h3>\n<p>I did some DML to create some replication conflict, which is something we have to deal with logical replication (because of constraints, triggers, 2-way replication, etc) and the default management is a bit loose in my opinion: log it and continue:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114.png\" alt=\"CaptureAttunity0114\" width=\"501\" height=\"401\" class=\"alignnone size-full wp-image-8117\" \/><\/a><br \/>\nIgnoring a problem and continuing makes the target unreliable until the issue is manually solved.<\/p>\n<p>This behavior can be customizable for the whole replication task. This is the default:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0116.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0116.png\" alt=\"CaptureAttunity0116\" width=\"928\" height=\"533\" class=\"alignnone size-full wp-image-8147\" \/><\/a><br \/>\nbut we can customize it: either evict a table from the replication or stop the whole replication.<br \/>\nI prefer the latest because only the latest keeps full consistency on target. But then we have to be sure that no conflicts exists, or are resolved automatically.<\/p>\n<p>I&#8217;ve not seen a table-level way to define automatic conflict resolution. I real life, it&#8217;s better to stop whenever any unexpected situation occurs (i.e when one redo record do not change exactly one row) but we may have to accept specific settings for few tables where the situation is expected (because of triggers, cascade constraints, etc).<\/p>\n<h3>Conclusion<\/h3>\n<p>Attunity Replicate buffers the transactions and apply them when commit is encountered, which is better in case of many rollbacks, but may lead to a replication gap in case of long transactions.<br \/>\nFrom the traces I&#8217;ve seen, the dictionary information is read from the source database each time it is needed. This is probably higher overhead on source when compared with solutions that get dictionary changes from the redo stream. And this probably raise more limitation on DDL (replication is not possible on changes occurring after ADD, DROP, EXCHANGE and TRUNCATE partition are not ). <\/p>\n<p>Attunity GUI is very nice for simple setups and for graphical monitoring, and I understand why it is well known in SQL Server area for this reason.<\/p>\n<p>The number of supported databases (or rather &#8216;endpoints&#8217; because it goes beyond databases) is huge:<\/p>\n<ul>\n<li>Source can be: Oracle Database, Microsoft SQL Server, Sybase ASE, MySQL, Hadoop, ODBC, Teradata, Salesforce Database, HP NonStop SQL\/MX<\/li>\n<li>Destination can be: Oracle Database, Microsoft SQL Server, Sybase, MySQL, Hadoop, ODBC, Teradata, Pivotal Greenplum, Actian Vector Database, Amazon Redshift, HP Vertica, Sybase IQ, Netezza, and text files<\/li>\n<\/ul>\n<p>There are several logical replication solutions, with different prices, different design, different philosophy. I always recommend a Proof of Concept in order to see which one fits your context. Test everything: the setup and configuration alternatives, the mining of production workload, with DDL, special datatypes, high redo rate, etc. Don&#8217;t give up on first issue, it&#8217;s also a good way to consider documentation quality and support efficiency. And think about all the cases where you will need it: real-time BI, auditing, load balancing, offloading, migrations, data movement to and from the Cloud.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . If you follow my blog, you should know that I really like Dbvisit replicate because it&#8217;s simple, robust, has good features and excellent support. But that&#8217;s not a reason to ignore other alternatives (and this is the reason of https:\/\/www.dbi-services.com\/news-en\/replication-event-2\/). When you have heterogeneous sources (not only Oracle) there is Oracle [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":7594,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[810,96,301],"type_dbi":[],"class_list":["post-7576","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","tag-attunity","tag-oracle","tag-replication"],"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>A short glance at Attunity replicate - 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\/a-short-glance-at-attunity-replicate\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A short glance at Attunity replicate\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . If you follow my blog, you should know that I really like Dbvisit replicate because it&#8217;s simple, robust, has good features and excellent support. But that&#8217;s not a reason to ignore other alternatives (and this is the reason of https:\/\/www.dbi-services.com\/news-en\/replication-event-2\/). When you have heterogeneous sources (not only Oracle) there is Oracle [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-16T19:12:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"501\" \/>\n\t<meta property=\"og:image:height\" content=\"401\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Oracle Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oracle Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 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\/a-short-glance-at-attunity-replicate\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"A short glance at Attunity replicate\",\"datePublished\":\"2016-04-16T19:12:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/\"},\"wordCount\":1528,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png\",\"keywords\":[\"Attunity\",\"Oracle\",\"Replication\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/\",\"name\":\"A short glance at Attunity replicate - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png\",\"datePublished\":\"2016-04-16T19:12:01+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png\",\"width\":501,\"height\":401},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A short glance at Attunity replicate\"}]},{\"@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\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A short glance at Attunity replicate - 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\/a-short-glance-at-attunity-replicate\/","og_locale":"en_US","og_type":"article","og_title":"A short glance at Attunity replicate","og_description":"By Franck Pachot . If you follow my blog, you should know that I really like Dbvisit replicate because it&#8217;s simple, robust, has good features and excellent support. But that&#8217;s not a reason to ignore other alternatives (and this is the reason of https:\/\/www.dbi-services.com\/news-en\/replication-event-2\/). When you have heterogeneous sources (not only Oracle) there is Oracle [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/","og_site_name":"dbi Blog","article_published_time":"2016-04-16T19:12:01+00:00","og_image":[{"width":501,"height":401,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png","type":"image\/png"}],"author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"A short glance at Attunity replicate","datePublished":"2016-04-16T19:12:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/"},"wordCount":1528,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png","keywords":["Attunity","Oracle","Replication"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/","url":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/","name":"A short glance at Attunity replicate - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png","datePublished":"2016-04-16T19:12:01+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureAttunity0114-1.png","width":501,"height":401},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/a-short-glance-at-attunity-replicate\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A short glance at Attunity replicate"}]},{"@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\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/7576","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\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=7576"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/7576\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/7594"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=7576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=7576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=7576"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=7576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}