For those of you who haven’t been working with on-line data replication; in short, it is a way to copy data from a source database to a target database and do this on-line (both databases are active) and do it near-real-time.
This means that when you enter data in you source database, you can immediately query it from your target database. This makes on-line data replication ideal for numerous tasks, like moving and / or upgrading your database while it is being used, with almost no downtime at all.
This tale is of an actual project that I conducted. I used Dbvisit Replicate as my tool of choice.
Dbvisit Replicate can use a so-called FETCHER process to act as the “long-arm” for the MINE process. Mining extracts the information from the redo-log files, but, in specific situations, this can be too much of an overhead for the source database server. By moving the MINE to a proxy server, this overhead can be significantly reduced.
In some cases it can be useful to manually transfer redo-log files to the mining stage directory of Dbvisit.
I came across this requirement when catching up a lot of redo from a RAC database. In this case, the RAC cluster creates two streams of redo. When starting the replication processes, the first thread is transferred by FETCHER from the source server to the proxy, before the second thread is transferred. This means mining will pause until the second thread successful delivers the first redo-log file of the second thread. The redo-log information from the second stream is necessary to create consistent and chronologically ordered SQL-statements for the target database. In effect, the SCN’s from first redo-log information of the first stream need to line up with the SCN’s of the second redo-log information.
In this case, this meant having to wait a day or more before mining can start. This is why I decided to copy a number of redo-log files from the source server to the proxy server, where the MINE process is running, manually.
After the copy, the files need to be registered with in the dbvrep-repository. Without this information, the MINE process has no knowledge of the files that are present and about what their contents are.
The update is an easy insert statement, but it should be handled with care, as this needs to be quite precise and it needs a bit of specific information about the redo-log files being added.
You can use the following insert statement to register the files:
insert into dbvrp.dbrsmine_redo_log_history
(
ddc_id
, mine_process_name
, sequence
, thread
, resetlogs_id
, first_scn
, next_scn
, online_name
, arch_name
, read_count
, from_fetcher
, last_mine_start
, last_mine_end
, create_date
, last_change_date
)
values
(
1
, ‘MINE’
, 128779 -- sequence number of the copied file;
, 2 -- assuming you are updating this thread.
, 804864915 -- the reset-logs id from the redo-log file
, 199910296688 -- the first scn from the redo-log file
, 199911476897 -- the next scn from the redo-log file
, null
, ‘/u01/app/oracle/some-big-storage/dbvrep-mine/mine-stage/thread_2_seq_128719.1485.804864915’
-- full path and name of the file
, 0
, ‘Y'
, null
, null
, sysdate
, sysdate
)
;
And you can get the information you need about the files here:
select lh.sequence#
, di.resetlogs_id
, lh.first_change#
, lh.next_change#
from v$log_history lh
inner join v$database_incarnation di
using (resetlogs_change#)
where sequence# = 128779
;
After registering the first file for the second thread, in the Replicate-console, you can watch the MINE process kick off. This process will then again halt after the first file of the second stream is processed in parallel with the first file of the first stream.
I kept adding files until the FETCHER process was able to take over, or you could do this until you test-case or PoC is over.