前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle CDC详细配置(LogMiner)

Oracle CDC详细配置(LogMiner)

作者头像
Grainger
发布2022-04-24 10:03:08
2K0
发布2022-04-24 10:03:08
举报
文章被收录于专栏:数据与未来数据与未来

在很多的数据处理任务中,我们经常会用到数据同步的需求,尤其是异构数据库同步,当然目前世面上有很多的数据同步工具,开源和商业的都有很多,当然Oracle自身也可以实现数据的实时或者异步同步。这里我们示例一下通过配置 Oracle 提供的 LogMiner 免费工具,进行数据变更的捕获。配置完成后,动手能力强的小伙伴,就可以自己写个代码,解析相应的变更,然后可以做成同构或者异构数据库的同步工具。

具体步骤:

登录数据库,并查看 utl_file_dir 参数是否配置。

代码语言:javascript
复制
sqlplus / as sysdba
show parameter utl_file_dir;

如果没有配置,则在文件系统中创建/opt/oradata/oraclelogs目录。

代码语言:javascript
复制
mkdir /opt/oradata/oraclelogs

在 Oracle 执行以下命令:

代码语言:javascript
复制
CREATE OR REPLACE DIRECTORY logdir AS '/opt/oradata/oraclelogs';
alter system set utl_file_dir = '/opt/oradata/oraclelogs' scope = spfile;

重启数据库,并执行@?/rdbms/admin/utlfile.sql

代码语言:javascript
复制
shutdown immediate
startup

@?/rdbms/admin/utlfile.sql

注意:在Oracle XE中,该文件将位于 /u01/app/oracle/product/11.2.0/xe/rdbms/admin/utlfile.sql。

运行以下命令配置日志参数(非必须):

代码语言:javascript
复制
show parameter recovery_file_dest;
alter system set log_archive_dest_1='LOCATION=/opt/oradata/oraclelogs' scope = spfile;
alter system set db_recovery_file_dest_size = [根据实际情况配置]g;
alter system set db_recovery_file_dest = '/opt/oradata/oraclelogs' scope = spfile;

关闭并重启数据库到 mount。

代码语言:javascript
复制
shutdown immediate
startup mount

启用归档模式:

代码语言:javascript
复制
alter database archivelog;
alter database open;
archive log list;

创建并授予用户使用 logminer 的以下权限:

代码语言:javascript
复制
create user repuser identified by repuser;
GRANT CREATE SESSION TO repuser
grant all on DBMS_LOGMNR_D to repuser; 
grant all on DBMS_LOGMNR to repuser; 
grant execute on sys.dbms_logmnr to repuser;
grant select on v_$archived_log to repuser;
grant select on v_$logfile to repuser;
grant select on v_$log to repuser;
grant select on v_$logmnr_contents to repuser;
grant select on v_$database to repuser;
grant select any transaction to repuser;
grant select on dba_objects to repuser;

启用补充日志记录:

代码语言:javascript
复制
ALTER DATABASE ADD LOGFILE('/opt/oradata/oraclelogs/tpcds.log') SIZE 100M BLOCKSIZE 512 REUSE;

select SUPPLEMENTAL_LOG_DATA_MIN from sys.v_$database;

如果结果为 NO,请运行以下命令:

代码语言:javascript
复制
alter database add supplemental log data; 
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

select SUPPLEMENTAL_LOG_DATA_MIN from sys.v_$database;

此时结果应为 YES。

运行以下命令以验证配置过程:

代码语言:javascript
复制
select GROUP#,member from sys.v_$logfile;

上面命令将显示日志文件列表。要验证补充日志:

代码语言:javascript
复制
SELECT supplemental_log_data_min "Minimum",supplemental_log_data_pk  "Primary key",supplemental_log_data_ui "Unique Key",supplemental_log_data_fk  "Foregin Key",supplemental_log_data_all "All" FROM v$database;

上面的查询结果 Minimum 和 ALL 列的值为 YES,如下:

代码语言:javascript
复制
Minimum Pri Uni For All
-------- --- --- --- ---
YES  NO  NO NO  YES

切换日志:

代码语言:javascript
复制
alter system switch logfile;
select GROUP#,THREAD#,STATUS from sys.v_$log;

注意:必须至少有一个状态是活动的。如果不是,则运行上面的查询,直到一个状态变为活动状态。

查询归档日志名称:

代码语言:javascript
复制
SELECT name FROM sys.v_$archived_log

从查询结果中选取条一个文件名称,这里假设第一个文件为“/opt/oradata/oraclelogs/XE/archivelog/2015_09_15/o1_mf_1_196_bzho8z5g_.arc”,运行以下命令:

代码语言:javascript
复制
exec sys.dbms_logmnr.add_logfile(logfilename => '/opt/oradata/oraclelogs/XE/archivelog/2015_09_15/o1_mf_1_195_bzho5hql_.arc',OPTIONS => sys.DBMS_LOGMNR.NEW);

对于第一个文件以外的日志文件,这里假设第二个文件为“/opt/oradata/oraclelogs/XE/archivelog/2015_09_15/o1_mf_1_196_bzho8z5g_.arc”,运行以下命令:

代码语言:javascript
复制
exec sys.dbms_logmnr.add_logfile(logfilename => '/opt/oradata/oraclelogs/XE/archivelog/2015_09_15/o1_mf_1_196_bzho8z5g_.arc',OPTIONS => sys.DBMS_LOGMNR.ADDFILE);

执行以下命令启动 logmnr。

代码语言:javascript
复制
exec sys.dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location => '/opt/oradata/oraclelogs');

EXECUTE sys.DBMS_LOGMNR.START_LOGMNR(DICTFILENAME =>'/opt/oradata/oraclelogs/dictionary.ora');

exec sys.dbms_logmnr.start_logmnr();
select table_name from sys.v_$logmnr_contents;

此时可以对表进行插入、删除、更新等操作。运行以下查询即可以获取对表所做的更改。 这里我们假设我们操作的表为:TEST1,TEST2。

代码语言:javascript
复制
select sql_redo from sys.v_$logmnr_contents where SEG_TYPE_NAME = 'TABLE' AND table_name in ('TEST1','TEST2');

查询出的 sql_redo 就是对表做的变更操作了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山东Oracle用户组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档