当前位置: 移动技术网 > IT编程>数据库>Oracle > Oracle通过LogMiner实现数据同步迁移

Oracle通过LogMiner实现数据同步迁移

2020年07月23日  | 移动技术网IT编程  | 我要评论

写在前面

最近在研究如何实现oracle数据库之间的数据同步,网上的资料确实比较少。最好用的oracle数据库同步工具是:goldengate ,而goldengate是要收费的。那么还有什么好的办法来同步oracle的数据吗?没错,就是使用logminer来实现oracle数据同步迁移。

实现过程

1.创建目录

在服务器上创建/home/oracle/tools/oracle11g/oradata/orcl/logmnr目录来存储数据库的字典信息,如下所示。

mkdir -p /home/oracle/tools/oracle11g/oradata/orcl/logmnr

2.配置logminer

以oracle用户身份登录服务器,并以dba身份登录oracle数据库,如下所示。

sqlplus /nolog
conn / as sysdba

接下来,创建字典文件夹配置,如下所示。

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.开启日志追加模式

alter database add supplemental log data; 

4.重启数据库

shutdown immediate; 
startup; 

5.创建数据同步用户

创建数据同步用户,如果已经有可以跳过,直接赋予权限。

create user sync identified by sync; #如果存在用户,则不需要再次创建,直接授权即可
grant connect,resource,dba,execute_catalog_role to sync; 

6.创建数据字典

切换到要同步数据的用户,以dba身份登录,创建数据字典文件,如下所示。

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数据库,然后执行如下命令。

begin
dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'/home/oracle/tools/oracle11g/oradata/orcl/logmnr'); 
end;

7.加入需要分析的日志文件

此步骤可以在oracle命令行执行,也可以使用java代码实现。

使用sql语句实现如下所示。

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语句如下所示。

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.查看正在使用的日志文件

select group#, sequence#, status, first_change#, first_time from v$log order by first_change#;

status为current的为当前正在使用的日志文件

9.使用lominer分析日志

execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/logmnr/dictionary.ora'); 

使用java代码分析时,使用的sql语句如下所示。

begin
dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/logmnr/dictionary.ora'); 
end;

10.查看分析结果

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权限,如下所示。

grant connect,resource,dba,execute_catalog_role to sync; 

(2)当在查询v$logmnr_logs时提示“表或视图不存在”,是因为没有查询v$logmnr_logs的权限。此时在查询语句中需要为seg_owner指定相应的用户,例如,我这里使用sync用户通过logminer进行分析,则需要将seg_owner指定为sync用户,如下所示。

select sql_redo, sql_undo, seg_owner from v$logmnr_contents where seg_name='emp' and seg_owner='sync'; 

以上就是oracle通过logminer实现数据同步迁移的详细内容,更多关于oracle数据同步迁移的资料请关注移动技术网其它相关文章!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网