欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-29 10:33:43
写在前面最近在研究如何实现oracle数据库之间的数据同步,网上的资料确实比较少。最好用的oracle数据库同步工具是:goldengate ,而goldengate是要收费的。那么还有什么好的办法来...

写在前面

最近在研究如何实现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数据同步迁移的资料请关注其它相关文章!