Oracle通过LogMiner实现数据同步迁移
写在前面
最近在研究如何实现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数据同步迁移的资料请关注其它相关文章!
上一篇: Oracle 11g收集多列统计信息详解
下一篇: maven配置
推荐阅读
-
Oracle利用外部表实现数据的迁移
-
利用dblink实现Oracle对Oracle数据库的同步
-
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
-
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
-
使用GoldenGate 实现Oracle for Oracle 单向数据同步
-
vue 使用 async 和 await 实现异步 axios 同步化(实战案例:数据异步校验通过后,再执行保存)
-
通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
-
通过SQL Server 2008数据库复制实现数据库同步备份
-
直接拷贝数据文件实现Oracle数据迁移
-
Linux 通过Rsync+Inotify实现本、异地远程数据实时同步功能