写在前面

最近在研究如何实现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;

只有开启后才能看到DML操作记录,否则只能看见DML

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”关键字领取Oracle数据库安装包下载链接。

【Oracle】通过LogMiner实现Oracle数据同步迁移的更多相关文章

  1. ORACLE和SQL SERVER的数据同步常用方法

    ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...

  2. 基于TreeSoft实现mysql、oracle、sql server的数据同步

    一.为了解决数据同步汇聚,数据分发,数据转换,数据维护需求,TreeSoft推出了数据同步,数据处理等丰富功能 . TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之间架起沟通的桥 ...

  3. datax 数据同步迁移

    https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md https://github.com/aliba ...

  4. Oracle和Elasticsearch数据同步

    Python编写Oracle和Elasticsearch数据同步脚本 标签: elasticsearchoraclecx_Oraclepython数据同步    Python知识库 一.版本 Pyth ...

  5. SQLite与MySQL、SQLServer等异构数据库之间的数据同步

    SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎,实现了SQLite与SQLite数据库之间以及SQLite与异构数据库(Oracle.MySQL.SQLServer)之间的增量 ...

  6. 4、总结:基于Oracle Logminer数据同步

    最近开发Oracle数据同步功能,做了些调研和验证,这个工作过去有段时间,怕时间长了忘记,故用博客共享出来.在这系列中共写了三篇文章,第一篇是写LogMiner配置及使用,第二篇是测试了LogMine ...

  7. 总结:基于Oracle Logminer数据同步

    第 1 页 共 20 页 出自石山园主,博客地址:http://www.cnblogs.com/shishanyuan LogMiner 配置使用手册 1 Logminer 简介 1.1 LogMin ...

  8. Oracle数据逻辑迁移综合实战篇

    本文适合迁移大量表和数据的复杂需求. 如果你的需求只是简单的迁移少量表,可直接参考这两篇文章即可完成需求: Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上) Oracle简 ...

  9. Oracle 数据同步系列--触发器

    现在随着项目集成的越来越深入,异构的数据多起来,数据同步的场景也用的多起来,我甚至在考虑是否忽悠用户上Oracle GoldenGate了,这样就可以不用考虑采用哪种同步方案了. 简单的介绍一下我们数 ...

  10. 将SQLServer2005中的数据同步到Oracle中

    有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据.不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现. ...

随机推荐

  1. .net core微服务之网关

    网关: 一:apisix doc:https://apisix.apache.org/zh/docs/apisix/getting-started/README/ github:https://git ...

  2. GCC项目的文件组织和编译步骤分解

    C项目的文件组织和编译 C项目的代码, 由头文件(.h后缀)和C文件(.c后缀)组成 C语言的函数和变量, 分声明和定义两个阶段 头文件和C文件是等价的, 相当于C文件的一部分, 其功能由人为划分, ...

  3. 【framework】WMS启动流程

    1 前言 ​ WMS 是 WindowManagerService 的简称. (1)WMS 主要职责 窗口管理:负责启动.添加.删除窗口,管理窗口大小.层级,核心成员有:WindowContainer ...

  4. Lambda 表达式总结

    1 Lambda 表达式简介 ​ Lambda 表达式是 JDK 8 的新特性,主要用于简化匿名内部类的定义,帮助用户方便.高效地书写优雅的代码. ​ Lambda 表达式实现的必须是一个接口,并且接 ...

  5. linux如何发送电子邮件

      使用linux时,有时我们想发邮件给朋友或同事,可不可以通过命令行直接发呢?         想通过linux监控网站或者系统状况并自动报警,如何使用脚本发出邮件给外部邮箱呢?         不 ...

  6. Spring Boot图书管理系统项目实战-11.检索图书

    导航: pre:10.借还统计 next: 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 index.html <!D ...

  7. Taurus.MVC WebMVC 入门开发教程2:一个简单的页面呈现

    前言: 在上一篇中,我们了解了如何下载.配置和运行 Taurus.MVC WebMVC 框架. 现在,让我们开始编写一个简单的页面并进行呈现. 步骤1:创建控制器 首先,我们需要创建一个控制器来处理页 ...

  8. 进程,join的使用,守护进程---day30

    1.进程 # ### 进程 import os,time #当前进程id(子进程) res = os.getpid() print(res) #1772 #当前进程id(父进程) res = os.g ...

  9. CUDA、CUDNN 安装

    安装 CUDA.CUDNN 1. CUDA CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型.它通过利用图形处理器 (GPU) 的处理能力,可大幅提升计算性能. 官方地址 https:// ...

  10. javascript浮点数相减、相乘出现一长串小数

    149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 这是JavaScript浮点运算采用IEEE 754标准导致的Bug ...