写在前面
最近在研究如何实现Oracle数据库之间的数据同步,网上的资料确实比较少。最好用的Oracle数据库同步工具是:GoldenGate ,而GoldenGate是要收费的。那么还有什么好的办法来同步Oracle的数据吗?没错,就是使用LogMiner来实现Oracle数据同步迁移。
实现过程
1.创建目录
在服务器上创建/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR目录来存储数据库的字典信息,如下所示。
1
|
mkdir -p /home/oracle/tools/oracle11g/oradata/orcl/LOGMNR |
2.配置LogMiner
以oracle用户身份登录服务器,并以DBA身份登录Oracle数据库,如下所示。
1
2
|
sqlplus /nolog conn / as sysdba |
接下来,创建字典文件夹配置,如下所示。
1
2
|
CREATE DIRECTORY utlfile AS '/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR' ; alter system set utl_file_dir= '/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR' scope=spfile; |
注意:由于utl_file_dir只存在于文件当中,所以scope是以文件方式"spfile"写入,而不是both。
3.开启日志追加模式
1
|
alter database add supplemental log data; |
4.重启数据库
1
2
|
SHUTDOWN IMMEDIATE; STARTUP; |
5.创建数据同步用户
创建数据同步用户,如果已经有可以跳过,直接赋予权限。
1
2
|
create user SYNC identified by SYNC; #如果存在用户,则不需要再次创建,直接授权即可 GRANT CONNECT ,RESOURCE,DBA,EXECUTE_CATALOG_ROLE TO SYNC; |
6.创建数据字典
切换到要同步数据的用户,以DBA身份登录,创建数据字典文件,如下所示。
1
2
|
conn SYNC/SYNC@orcl as sysdba; EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora' , dictionary_location => '/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR' ); |
创建数据字典的命令也可以通过Java代码来实现,如果使用Java代码实现的话,首先可以通过JDBC连接到Oracle数据库,然后执行如下命令。
1
2
3
|
BEGIN dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora' , dictionary_location => '/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR' ); END ; |
7.加入需要分析的日志文件
此步骤可以在Oracle命令行执行,也可以使用Java代码实现。
使用SQL语句实现如下所示。
1
2
3
|
EXECUTE dbms_logmnr.add_logfile(logfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/REDO01.LOG' ,options=>dbms_logmnr.NEW); EXECUTE dbms_logmnr.add_logfile(logfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/REDO02.LOG' ,options=>dbms_logmnr.ADDFILE); EXECUTE dbms_logmnr.add_logfile(logfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/REDO03.LOG' ,options=>dbms_logmnr.ADDFILE); |
使用Java代码分析时,使用的SQL语句如下所示。
1
2
3
4
5
|
BEGIN dbms_logmnr.add_logfile(logfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/REDO01.LOG' ,options=>dbms_logmnr.NEW); dbms_logmnr.add_logfile(logfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/REDO02.LOG' ,options=>dbms_logmnr.ADDFILE); dbms_logmnr.add_logfile(logfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/REDO03.LOG' ,options=>dbms_logmnr.ADDFILE); END ; |
8.查看正在使用的日志文件
1
|
SELECT group #, sequence #, status, first_change#, first_time FROM V$log ORDER BY first_change#; |
status为CURRENT的为当前正在使用的日志文件
9.使用Lominer分析日志
1
|
EXECUTE dbms_logmnr.start_logmnr(dictfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR/dictionary.ora' ); |
使用Java代码分析时,使用的SQL语句如下所示。
1
2
3
|
BEGIN dbms_logmnr.start_logmnr(dictfilename=> '/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR/dictionary.ora' ); END ; |
10.查看分析结果
1
|
SELECT sql_redo, sql_undo, seg_owner FROM v$logmnr_contents WHERE seg_name= 'EMP' AND seg_owner= 'SYNC' ; |
注意:视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在,如果要查看新的日志,需要再重新加入分析日志文件、使用LogMiner分析。
11.常见问题
(1)如果出现“必须声明标识符 'SYS.DBMS_LOGMNR'”异常,则需要在创建用户后,为用户赋予EXECUTE_CATALOG_ROLE权限,如下所示。
1
|
GRANT CONNECT ,RESOURCE,DBA,EXECUTE_CATALOG_ROLE TO SYNC; |
(2)当在查询v$logmnr_logs时提示“表或视图不存在”,是因为没有查询v$logmnr_logs的权限。此时在查询语句中需要为seg_owner指定相应的用户,例如,我这里使用SYNC用户通过LogMiner进行分析,则需要将seg_owner指定为SYNC用户,如下所示。
1
|
SELECT sql_redo, sql_undo, seg_owner FROM v$logmnr_contents WHERE seg_name= 'EMP' AND seg_owner= 'SYNC' ; |
以上就是Oracle通过LogMiner实现数据同步迁移的详细内容,更多关于Oracle数据同步迁移的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/binghe001/p/12953600.html