OGG12.3+TDT6.1 实践指南

  其他常见问题
内容纲要

OGG+TDT(6.1)部署手册

注意:本文档仅限studio1.1之前版本使用,studo1.2版本之后的tdt去掉了<表过滤>,新版本可以使用<批量数据流>实现增量导入。

1. 文档说明

本文档用于说明基于OGG12和TDT6.1的实时同步部署步骤。

软件 版本
TDH 6.0.1final
TDT 6.1final
Workflow 6.1final
源端Oracle 11.2.0.1.0(Linux)
源端Goldengate 12.3.0.1.4 (Linux)
目标端OGG FOR BIG DATA 11.3.2.1.1(Linux)

安装包已存放在 \\fs.transwarp.club\Software\Tools\OGG_For_TDT6.1\

2. OGG+TDT数据流图

# 步骤说明:

file

1.抽取进程(EXT01):将Oracle Redo日志解析为OGG日志,需要为该进程指定存储OGG日志的本地目录和日志名称的前缀,该前缀由两位字母组成,如ac;

2.传输进程(DEP01,有时也称之为数据泵进程):将步骤1中的OGG日志传输到目标端;

3.Handler解析进程:将目标端接收的OGG日志解析为TDT日志,解析后日志的存放路径由handler.properties的gg.handler.tdthagdler.TargetDir参数指定,默认为/tmp/ogg,如果是生产环境,请自行定义该目录;

4.Poster进程:将步骤3中的TDT日志上传到HDFS,注意,目前该进程只监控/tmp/ogg目录新增的文件,并将新增的文件上传到HDFS,因此,如果poster运行过程中意外停止,为避免目标端ORC表数据丢失,停止期间新增的文件要手动上传到HDFS;

5.Job进程:Job进程实际为TDT的客户端,负责向TDT Server提交同步作业,TDT Server接收该作业后,将会解释HDFS的日志数据,并根据同步作业提供的描述方式将增量数据写入到TDH的ORC Transaction表。注意,TDT对于同步任务会顺序读取HDFS上的数据并记录已处理数据,所以,重新启动Job进程后将从上个停止的时间点继续读取数据,数据不会丢失。

3. 源端Oracle配置

3.1. 开启归档

1.查询数据库是否处于归档模式

SQL> select log_mode from v$database;

LOG_MODE
------------------------
ARCHIVELOG

2.开启归档

$> sqlplus / as sysdba 
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;

Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     425
Next log sequence to archive   427
Current log sequence           427

3.2. 开启数据库附加日志

开启附加日志主要是为了 UPDATE操作, ORACLE默认日志记录模式, 不会记录 UPDATE操作中没有更新到的数据, 但是 TDT 为了实现同步必须要拿到所有的列数据, 故需要执行此操作

Oracle日志(redo log)一般用于实例恢复和介质恢复,但是如果需要靠日志还原完整的DML操作信息(比如Goldengate),默认记录的日志量还不够。比如一个UPDATE的操作,默认redo只记录了rowid以及被修改的字段信息,但GoldenGate还原这个事务时,是在另一个库中进行还原,这时组成ROWID的四个部分(对象ID,数据文件ID,块号,行号)中,极可能是与原库不相同的,所以,不能根据ROWID来进行还原和处理。而要在SQL层面根据某个键值来定位记录,所以还需要将主键或者其他字段的信息附加到日志中去。要往日志中增加这些额外字段信息的操作,就是开启附加日志,即Add Supplemental Logging。打开附加日志,会使数据库的日志量和负载增加,所以,应该根据需要,只打开相应的级别的附加日志。
附加日志分为两类:
数据库级附加日志和表级附加日志,数据库级的附加日志对数据库中的所有对象都有效,而表级附加日志则只对指定的表有效。而表级附加日志的开启的一个重要前提,就是要先打开数据级的最小附加日志,其命令就是:alter database add supplemental log data;。

无论是数据库级,还是表级,均有全部列级,主键列,唯一键列和外键列级等。

1.开启数据库附加日志

$> sqlplus / as sysdba
SQL> alter database add supplemental log data;
SQL> alter database add supplemental log data (ALL) columns;

2.确认信息

--检查数据库级附加日志,期望 MIN和ALL是YES的状态
SQL> select  SUPPLEMENTAL_LOG_DATA_MIN
       ,SUPPLEMENTAL_LOG_DATA_PK
       ,SUPPLEMENTAL_LOG_DATA_UI
       ,SUPPLEMENTAL_LOG_DATA_FK
       ,SUPPLEMENTAL_LOG_DATA_ALL 
from   v$database;

--检查表级附加日志,一般不使用表级附加
SQL> select g.log_group_name name,
       g.owner || '.' || g.table_name table_name,
       g.always,
       g.generated,
       c.column_name
  from dba_log_groups g, dba_log_group_columns c
 where g.log_group_name = c.log_group_name(+)
   and g.table_name = c.table_name(+)
   and g.table_name = 'EMP'
   and g.owner = 'GOLDENGATE'
 order by 1, 2, 3, 4;

3.3. 检查数据库强制日志

之前流传的一些 ogg 部署文档提到数据库需要开启强制日志模式, 这里明确一下: 如果OGG 只是为了 TDT 做数据同步, 这一步骤不需要做. 只需要确认一下需要同步的数据库和表不要被设置为 no logging 模式.

--数据库强制日志,如果OGG只是为了做TDT同步,不需要开启,为NO的状态
SQL> select force_logging from v$database;  
--确保数据库和表不要被设置为no logging模式
SQL> select TABLE_NAME,LOGGING from DBA_TABLES  where table_name=;  

3.4. 创建goldengate用户

SQL> create user goldengate identified by goldengate default tablespace pfm;
SQL> grant connect, resource,CREATE SESSION to goldengate;
SQL> grant select any dictionary to goldengate;
SQL> grant select on sys.props$ to goldengate;
SQL> grant sysdba to goldengate;  --或者直接最高权限sydba
SQL>
create table EMP
(
  empno    NUMBER(4) primary key,
  ename    VARCHAR2(10),
  job      VARCHAR2(9),
  mgr      NUMBER(4),
  hiredate DATE,
  sal      NUMBER(7,2),
  comm     NUMBER(7,2),
  deptno   NUMBER(2)
)
tablespace PFM;

3.5. 查询数据库字符集

查询源端字符集,编辑OGG进程时需要该参数

SQL > select PARAMETER,VALUE
     from  nls_database_parameters
     where PARAMETER in ('NLS_LANGUAGE',
                     'NLS_TERRITORY',
                     'NLS_CHARACTERSET',
                     'NLS_NCHAR_CHARACTERSET');

file

4. 源端OGG配置(ORACLE服务器)

4.1. 安装OGG

4.1.1. 使用oracle用户安装OGG软件

源端目录下的:V975837-01.zip 直接解压。

4.1.2. 编辑response目录下的文件

#-------------------------------------------------------------------------------
# Specify the installation option.
# Specify ORA12c for installing Oracle GoldenGate for Oracle Database 12c and
# ORA11g for installing Oracle GoldenGate for Oracle Database 11g 
#-------------------------------------------------------------------------------
INSTALL_OPTION=ORA11g
#-------------------------------------------------------------------------------
# Specify a location to install Oracle GoldenGate
#-------------------------------------------------------------------------------
SOFTWARE_LOCATION=/root/ogg_12_3

执行安装

$ ./runInstaller -silent -nowait -responseFile  /data/fbo_ggs_Linux_x64_shiphome/Disk1/response/ oggcore.rsp

4.1.3. 设置环境变量

修改oracle用户的环境变量

$>export OGG_HOME=/ogg_12_3
$>export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd64/libjsig.so:$JAVA_HOME/jre/lib/amd64/server/libjvm.so:$OGG_HOME:$OGG_HOME/lib:$LD_LIBRARY_PATH
$>cd $OGG_HOME
$>chmod –R +x ./
$>./ggsci

4.2. 编辑进程

4.2.1. 编辑管理进程

GGSCI > edit params mgr
PORT 7809
DYNAMICPORTLIST 7810-7820
USERID goldengate, PASSWORD goldengate
LAGCRITICALMINUTES 45
LAGINFOMINUTES 30
LAGREPORTHOURS 1
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7

参数说明:

  1. PORT 7809:mgr所用端口。
  2. DYNAMICPORTLIST 7810-7820:mgr可用端口范围。
  3. USERID goldengate, PASSWORD goldengate:使用goldengate/goldengate登录数据库。
  4. LAGCRITICALMINUTES 45:延迟阈值45分钟。
  5. LAGINFOMINUTES 30:每隔30分钟检查延迟阈值,如果超过阈值,写入错误日志。
  6. LAGREPORTHOURS 1:每隔1小时检查延迟报告。
  7. PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7:文件传输后,
  8. 本地文件保留7天。

4.2.2. 编辑抽取进程

以抽取GOLDENGATE用户下的表为例,NLS_LANG的值根据源端数据库字符集填写

GGSCI > edit params ext01
EXTRACT ext01
DYNAMICRESOLUTION
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID goldengate, PASSWORD goldengate
EXTTRAIL ./dirdat/ac
GETUPDATEBEFORES
TABLE GOLDENGATE.*;

参数说明:

  1. DYNAMICRESOLUTION:动态解析表名。
  2. EXTTRAIL ./dirdat/ac:将OGG日志存放到$OGG_HOME/dirdat/目录,日志前缀是ac。
  3. GETUPDATEBEFORES:获取修改前镜像。
  4. TABLE GOLDENGATE.*:抽取GOLDENGATE用户下表的redo日志。

4.2.3. 编辑传输进程

以GOLDENGATE用户为例,NLS_LANG的值根据源端数据库字符集填写

GGSCI > edit params dpe01

EXTRACT dpe01
DYNAMICRESOLUTION
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID goldengate,PASSWORD goldengate
RMTHOST 172.22.23.1, MGRPORT 7809
RMTTRAIL ./dirdat/xe
TABLE GOLDENGATE.*;
GGSCI > ADD EXTRACT dpe01, EXTTRAILSOURCE ./dirdat/ac
GGSCI > ADD RMTTRAIL ./dirdat/xe, EXTRACT dpe01, MEGABYTES 1024

参数说明:

  1. DYNAMICRESOLUTION:动态解析表名
  2. RMTHOST 172.22.23.1, MGRPORT 7809:目标端地址及管理端口
  3. RMTTRAIL ./dirdat/xe:目标端接收日志的日志为$OGG_HOME/dirdat/xe

4.3. 添加进程

添加抽取进程:ext01

抽取的日志目录为$OGG_HOME/dirdat,日志前缀为ac
THREADS 参数,注意在RAC环境下设置为2

GGSCI > ADD EXTRACT ext01, TRANLOG, THREADS 1, BEGIN NOW
GGSCI > ADD EXTTRAIL ./dirdat/ac, EXTRACT ext01, MEGABYTES 1024

添加传输进程:dpe02

将源端的$OGG_HOME/dirdat/ac传输到目标端的$OGG_HOME/dirdat/xe

GGSCI > ADD EXTRACT dpe01, EXTTRAILSOURCE ./dirdat/ac
GGSCI > ADD RMTTRAIL ./dirdat/xe, EXTRACT dpe01, MEGABYTES 1024

4.4. 启动进程

GGSCI> start mgr
GGSCI> start ext01
GGSCI> start dpe01
GGSCI> info all

5. 目标端OGG配置

5.1. 安装OGG

5.1.1. 安装OGG软件

TDH端/mnt/disk1/OGBD目录下的:OGG_BigData_Linux_x64_12.3.2.1.1.zip 直接解压。

5.1.2. 设置环境变量

参考OCG源端环境变量设置

5.1.3. handler.properties修改

修改权限$OGG_HOME/dirprm/handler.properties中的gg.handler.tdthagdler.TargetDir值对应的目录权限改为777

$> mkdir /tmp/ogg/emp_like0826
$> chmod 777 /tmp/ogg/emp_like0826

5.2. 编辑进程

5.2.1. MGR进程配置

GGSCI > edit params mgr

PORT 7809
DYNAMICPORTLIST 7810-7820
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 30

5.2.2. REPLICAT进程配置

读取 dirdat 目录下的 xe 开头 trail 文件, 并调用 TDT Handler

GGSCI > edit params handler

REPLICAT HANDLER
getEnv (JAVA_HOME)
getEnv (LD_LIBRARY_PATH)
getEnv (PATH)
TARGETDB LIBFILE libggjava.so SET property=dirprm/handler.properties
MAP GOLDENGATE.*, TARGET GOLDENGATE.*;

5.3. 添加进程

GGSCI > add replicat handler, exttrail dirdat/xe

5.4. 启动进程

GGSCI> start mgr
GGSCI> start handler

查看OGG运行状态

GGSCI > info all

6. TDT 插件配置

下载链接中的extension-ogg-package.tar.gz包并解压得到extension-ogg目录,进入extension-ogg 目录, 运行 bash bin/ogg_helper.sh –, 这个脚本会把 TDT Handler 的JAR包和配置文件一并拷入 OGG的对应目录下,各配置如下

6.1. 安装TDT插件

下载链接:百度网盘:https://pan.baidu.com/s/17E87iQ4W-5-c-0T9ARGk7Q 提取码:olxh
解压transporter-extension-package.tar.gz(示例在/mnt/disk1路径下)

inceptor handler:执行:bash bin/ogg_helper.sh -i
修改${OGG_HOME}/dirprm/handler.properties,各配置项如下

file

注: handler会自动将文件上传至hdfs,如果使用kerberos方式连接hdfs,需要先将krb5.conf放入到/etc目录下, 需要将hdfs namenode所在机器的hostname加入到当前机器的hosts中去

6.2. 上传hdfs配置文件

将NameNode节点的core-site.xml和hdfs-site.xml拷贝到/root/transporter-extension/conf目录

6.3. 启动同步脚本数据动态同步到HDFS

$ nohup ./run_poster.sh & 

注意:
脚本:CLASSPATH 修改成其他名称(脚本编写有误)
日志:transporter-extension/bin/tdt.log

6.4. 测试

Oracle插入数据:

SQL> insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('8011', 'lkw1', 'master', '7839', to_date('23-06-2019', 'dd-mm-yyyy'), '99999', '99999', '20');
SQL> commit;

查看hdfs目录数据,接收到数据:

7. 配置TDT+Workflow

7.1. TDT算子1:同步Reader

选择Sync JSON

file

7.2. TDT算子2:表过滤转换组件

选择TABLE FILTER
file

7.3. TDT算子3:TEXT writer

选择TEXT
file
file

7.4. TDT调试

将需要同步的表在inceptor创建对应的数据表,例:

CREATE  TABLE emp_ogg01(
  empno decimal(38,0) DEFAULT NULL, 
  ename string DEFAULT NULL, 
  job string DEFAULT NULL, 
  mgr decimal(38,0) DEFAULT NULL, 
  hiredate timestamp DEFAULT NULL, 
  sal decimal(7,2) DEFAULT NULL, 
  comm decimal(7,2) DEFAULT NULL, 
  deptno decimal(38,0) DEFAULT NULL
) clustered by(empno) into 1 buckets stored as orc_transaction;

file

7.5. 查看目标表数据

file

7.6. Workflow实现准实时调度tdt工作流

file

8. 补充

8.1. OGG常用命令

1.登录OGG

   $> cd $OGG_HOME
   $> ./ggsci

2.查看OGG版本

   $> ./ggsci -v

3.查看进程信息

   GGSCI> info all
   GGSCI> view report mgr
   GGSCI> info mgr
   GGSCI> stats ext01

4.删除进程

   GGSCI> delete ext01

5.配置进程参数

   GGSCI> view param mgr
   GGSCI> edit param mgr

6.修改抽取进程起始文件号

   GGSCI> alter extract ext01,extseqno 19,extrba 0 
   GGSCI> alter extract ext01,begin now

8.2. OGG重要目录说明

dirdat:存放抽取日志
dirchk:存放检查点文件
dirprm:存放参数、配置、程序文件
dirrpt:存放每个进程的执行情况
dirdef:存放表的定义文件
dirpcs:存放进程状态文件

8.3. 解决sqlplus/ggsci命令行无法回退字符或者上翻下翻命令

8.3.1. 下载rlwrap包

http://www.zf678.com/item/20170110/1050.html

8.3.2. root用户下解压安装

 $>tar -zxvf rlwrap-0.37.tar.gz
 $>yum -y install readline*
 $>yum install gcc
 $>./configure
 $>make
 $>make install
 $>rlwrap -v

8.3.3. oracle用户下配置别名

 $>vi  .bash_profile
 alias sqlplus='rlwrap /data/oracle/product/11.2.0/db_1/bin/sqlplus'
 alias ggsci='rlwrap /ogg_12_3/ggsci'
 $>source  .bash_profile

8.3.4. 执行ggsci测试回退和上翻下翻功能

9. 常见问题

9.1. 源端安装ogg时报错:The given response file response/oggcore.rsp is not found.

必须写绝对路径

9.2. SASL authentication not complete

  1. root用户没有登录mysql的权限
  2. tdt没有写日志的权限
  3. rule.json路径配置不正确

9.3. ogg adapter12.2不支持

如果使用ogg adapter12.2,会有以下报错:

file

9.4. ./ggsci: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory

LD_LIBRARY_PATH环境变量没有配置好

9.5. 执行run_poster.sh脚本时 Error: Conf file missing, place hdfs-site.xml and core-site.xml under /mnt/disk1/transporter-extension/conf

需要将配置文件部署到TDT插件的配置目录

9.6. Workflow任务执行失败,查看tdt日志Dataflow job already running

修改顺序执行的并发模式下,并发度为1
file

9.7. 解析进程稳定运行一周后,突然挂掉了,hdfs上没有出现tdt日志

file

查看report日志发现:
OGG-01161 Bad column index(90) specified for table PCISV7.WEB_PLY_INSURED. max columns = 90.
file
原因:
主库表结构发生变更,导致和def定义的不一致
当源端发生表结构表更时,一定要重新配置TDT,否则变更后的数据是不会同步过来的。

9.8. 启动解析进程,无法启动

file
查看report日志发现:
OGG-06509 Using the following key columns for soure table ODS_PROD.ODS_WEB_ORG_OPER: C_OPER_ID.
原因:
由于之前源端ogg配置的是最小附加日志,tdt日志中没有update操作以前的数据,/home/oracle/ogg/dirdat下rr开头的第一个文件含有dba手工修改的表数据信息,从第二个队列开始可以同步复制,正常解析

9.9. 一个数据流首次执行任务,同步1.8G数据,sql执行缓慢,目标表为新建表

file
Task任务GC时间超过总时间80%
file
Executor jstat信息,频繁fullGC
file
inceptor资源15c/32G x3.只有第一次同步出现,第一次同步任务执行了12分钟,后面的同步平均在2分钟

原因:大概是第一次同步的tdt日志既包含源端没有设置OGG配置“GETUPDATEBEFORES”和后面包含“GETUPDATEBEFORES”的数据,总之很大可能是数据问题。

9.10. 同步后的orc表,日期字段为空,tdt解析后的数据中,时间戳类型的字段年月日和时分秒中间有个冒号,需要加上一个列映射算子,用tdh_todate进行下转换,在6.1TDT的模板固定写死了,需要修改rule.json,修改image中的rule.json后,不能push到harbor.

file
file

原因:
docker push 问题未知,准备在idc环境重现下
另外感觉需要修改下同步任务的模板,由现在的reader->table_filter->writer变成reader->table_filter->column_map->writer。因为如果是新建的表,默认都是string类型,为了保持和源端类型一致,有必要进行一些列映射和数据类型的转换。
我在5.X的tdt上是可以加列映射的。
或者
对日期类型,ogg解析后在年月日和时分秒之间有一个冒号,如2017-01-01:10:30:00,需要在json中进行处理:tdh_todate(‘2017-01-01:10:30:00′,’yyyy-MM-dd:HH:mm:ss’,’yyyy-MM-dd HH:mm:ss’)

9.11. DPE进程启动失败,ABENDED状态,report报错 OGG-00664 OCI Error beginning session (status = 257-ORA-00257: archiver error. Connect internal only, until freed.)

file

原因:归档日志空间不足,参考rman清理归档日志

这篇文章对您有帮助吗?

平均评分 5 / 5. 次数: 1

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。