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

作者:冰 河 时间:2024-01-28 05:48:49 

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

为了实现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)当在查询vlogmnrlogs时提示“表或视图不存在”,是因为没有查询vlogmnr_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';

来源:https://blog.csdn.net/l1028386804/article/details/106323738

标签:LogMiner,Oracle
0
投稿

猜你喜欢

  • python基础知识之字典(Dict)

    2023-08-25 20:01:44
  • Python使用OpenCV进行标定

    2022-08-17 15:05:33
  • 利用Javascript实现一套自定义事件机制

    2024-05-03 15:59:07
  • python中PS 图像调整算法原理之亮度调整

    2021-02-09 17:51:01
  • Oracle SQL性能优化系列学习二

    2010-07-23 13:23:00
  • dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)

    2024-04-28 09:45:40
  • 通过字符串导入 Python 模块的方法详解

    2023-10-15 03:00:56
  • Python内置函数delattr的具体用法

    2023-04-22 05:35:22
  • python实现人脸识别代码

    2022-12-20 15:39:06
  • Python+Pygame实现神庙逃亡游戏

    2022-06-12 16:26:28
  • 能让Python提速超40倍的神器Cython详解

    2023-11-12 07:11:11
  • python常见的占位符总结及用法

    2023-10-11 10:39:58
  • 详解python使用turtle库来画一朵花

    2021-08-30 14:58:49
  • 利用XMLHTTP无刷新自动实时更新数据

    2008-02-19 18:29:00
  • 详谈LABJS按需动态加载js文件

    2024-04-23 09:20:56
  • Mysql中实现提取字符串中的数字的自定义函数分享

    2024-01-25 10:56:20
  • archlinux 罗技K380 F1-F12 功能键锁定(实现方法)

    2023-11-27 22:42:48
  • mysql中文排序注意事项与实现方法

    2024-01-15 17:18:55
  • MySQL中SQL命令语句条件查询实例详解

    2024-01-12 19:45:48
  • python去除字符串中空格的6种常用方法

    2023-09-25 12:36:53
  • asp之家 网络编程 m.aspxhome.com