前言:
本篇内容旨在实现Oracle 19c Container DataBase下OGG的搭建,选取测试环境已经解锁PDB下HR用户并在源端已经新建完成测试表T1。
环境介绍:
源端: 目标端:
Hostname:server Hostname:target
IP:192.168.88.20 IP:192.168.88.21
db_global_name:orcl1 db_global_name:orcl1
pdb:pdb_orcl1 pdb:pdb_orcl1
1.安装OGG软件
1.1用oracle用户创建安装目录
创建目录
/u01/ogg
(一般与ORACLE为同级母目录也就是在/u01下面创建ogg目录就好)
mkdir /u01/app/oracle/ogg
1.2上传OGG软件
使用oracle用户上传V983658-01-ogg19.1.zip安装包到
/home/oracle
目录下;
上传完成以后执行unzip V983658-01-ogg19.1.zip
解压安装文件。
1.3安装OGG软件
图形用户界面下进入fbo_ggs_Linux_x64_shiphome/Disk1目录执行./runInstaller安装脚本。(注意安装路径与数据库版本)
2.配置Linux内核参数
编辑**/etc/sysctl.conf文件进行配置,在源和目标端**设置Linux内核参数vm.max_map_count=2097152
max_map_count表示单个进程可以分配的内存映射区域的最大数量
3.开启归档、强制日志、补充日志
在源端数据库上开启归档日志、强制日志,补充日志并设置初始化参数。
(关于补充日志可参考https://blog.csdn.net/Auspicious_air/article/details/112799539)
SQL> alter database archivelog;--(需要在mount状态下,关闭数据库以mount的方式起动)。
SQL> alter database force logging;--(可以在open状态下操作)
SQL> alter database add supplemental log data;-- (可以在open状态下操作)
SQL> alter database add supplemental log data(primary key,unique,foreign key) columns; --(可以在open状态下操作)
SQL> alter system archive log current; --切一下归档
SQL> select log_mode,force_logging,supplemental_log_data_min from v$database;
LOG_MODE FORCE_LOGGING SUPPLEME
------------ --------------------------------------- --------
ARCHIVELOG YES YES
设置初始化参数**enable_goldengate_replication**
为true
(默认不开启),此参数的作用就是启用ogg
SQL> alter system set enable_goldengate_replication = true;
/*
ENABLE_GOLDENGATE_REPLICATION controls services provided by the RDBMS for Oracle GoldenGate (both
capture and apply services). Set this to true to enable RDBMS services used by Oracle GoldenGate.
*/
4.源端创建角色
在源端数据库创建表空间ts_global_ogg及全局账户c##oggadmin并授予dba角色。
表空间用来存放GoldenGate用户c##oggadmin涉及到的一些配置表。
SQL> create tablespace ts_global_ogg
datafile '/u01/app/oracle/oradata/SERVER/ts_global_ogg01.dbf'
size 200M;
SQL> alter database default tablespace ts_global_ogg
/*
使用默认表空间,为什么要修改数据库默认的表空间?为什么不直接使用?这是因为倘若直接使用会有这样的报错
ORA-65048: error encountered when processing the current DDL statement in
pluggable database pdb_orcl1
ORA-00959: tablespace 'TS_GLOBAL_OGG' does not exist
该报错是因为在容器数据库中对于全局用户要指定表空间,它会去检查每一个pdb下面是否有该表空间,倘若没有指定的表空间,那么就会出现这个错误。使用这个技巧可以跳过这个检查。
*/
SQL> create user c##oggadmin identified by "oggadmin"
SQL> grant dba to c##oggadmin container = all
5.目标端创建角色
在目标端数据库下为要进行数据同步的Pluggable Database里分别创建表空间ts_ogg和用户oggadmin。
SQL> alter session set container = pdb_orcl1;
SQL> create tablespace ts_ogg
datafile '*******/pdb_orcl1/ts_ogg01.dbf'
size 200M
SQL> create user oggadmin identified by "oggadmin"
default tablespace ts_ogg
SQL> grant dba to oggadmin
6.源端进程
在源端数据库配置ogg相关进程(你设置的所有进程的参数都存在于ogg目录下dirprm文件夹中)
在OS下执行
/u01/ogg/ggsci
打开ogg控制台 (ggsci是OGG命令行管理工具)
6.1配置mgr进程:
GGSCI (server) 1> edit params mgr
编辑mgr管理进程的参数,加入如下内容:
PORT 6800
autostart extract *
autorestart extract *,retries 3,waitminutes 3
编辑好以后,保存退出。
可以启动mgr进程:start mgr
manager进程参数配置说明: port:指定服务监听端口;默认端口为7809(也可以自定义)
dynamicportlist:动态端口:可以制定最大256个可用端口的动态列表,当指定的端口不可用时,管理进程将会从列表中
选择一个可用的端口,源端和目标段的collector、replicat、ggsci进程通信也会使用这些端口;比如:dynamicportlist
7501-7601 comment:注释行,也可以用–来代替;
autostart:指定在管理进程启动时自动启动哪些进程;比如:autostart extract * 启动所有的抽取进程
autorestart:自动重启参数设置:本处设置表示每3分钟尝试重新启动所有extract进程,共尝试3次;
purgeoldextracts:定期清理trail文件设置:本处设置表示对于超过3天的trail文件进行删除。purgeoldextracts./dirdat/*,usecheckpoints,minkeepdays
3 lagreport、laginfo、lagcritical:
定义数据延迟的预警机制:设置表示mgr进程每隔1小时检查extract的延迟情况,如果超过了30分钟就把延迟作为信息
记录到错误日志中,如果延迟超过了45分钟,则把它作为警告写到错误日志中。 lagreporthours 1 laginfominutes 30 lagcriticalminutes 45
6.2用户ogg登录到数据库
GGSCI (server) 2> dblogin userid c##oggadmin,password oggadmin
Successfully logged into database CDB$ROOT.
6.2.1编辑GLOBALS
GGSCI (server as c##oggadmin@orcl1/CDB$ROOT) 3> edit params ./GLOBALS
加入如下内容
GGSCHEMA C##OGGADMIN --我们ogg的用户名字叫做这个:c##oggadmin
然后保存退出。
6.2.2对要抽取的表添加trandata
前往SQL交互窗口:
1.之所以执行如下两行SQL是为了避免在CDB下无法执行PDB的trandata add
SQL> exec dbms_goldengate_auth.grant_admin_privilege('c##oggadmin');
PL/SQL procedure successfully completed.
SQL> exec dbms_goldengate_auth.grant_admin_privilege('c##oggadmin',container=>'all');
PL/SQL procedure successfully completed.
GGSCI (server as c##oggadmin@orcl1/CDB$ROOT) 4> add trandata pdb_orcl1.hr.t1
或者使用
SQL> alter table schema.table_name add supplemental log data(all) columns
2.如果想从PDB下面对trandata进行添加操作可以执行如下命令:
GGSCI (serevr as c##oggadmin@orcl1/CDB$ROOT) 5> dblogin userid sys@192.168.88.20/pdb_orcl1,password oggadmin
/*
抽取进程和传输进程其实都是extract进程,也可以配置在一个进程完成这两个功能,但是当网络传输有问题时,这样抽取
也就不能继续运行了,所以推荐分开配置为两个进程.
*/
6.2.3添加抽取进程ext1(自定义名称)。
GGSCI (server as c##oggadmin@orcl1/CDB$ROOT) 6> add extract ext1,integrated tranlog,begin now
6.2.4添加抽取进程ext1对应的trail文件。
GGSCI (serevr as c##oggadmin@orcl1/CDB$ROOT) 7> add exttrail /u01/app/oracle/ogg/dirdat/et,extract ext1 megabytes 200
--其中et(exttrail的缩写)是不需要自己手动创建的并且要严格控制在两个字符或者两个字符以内,OGG会自动创建。
6.2.5注册抽取进程ext1到pdb_orcl1。
GGSCI (server as c##oggadmin@orcl1/CDB$ROOT) 8> register extract ext1 database container(pdb_orcl1)
6.2.6添加投递进程pump1
GGSCI (server as c##oggadmin@orcl1/CDB$ROOT) 9> add extract pump1,exttrailsource /u01/app/oracle/ogg/dirdat/et
6.2.7给投递进程添加远程trail文件
GGSCI (server as c##oggadmin@ora19c/CDB$ROOT) 10> add rmttrail /u01/app/oracle/ogg/dirdat/rt,extract pump1,megabytes 200
6.2.8配置抽取进程ext1
GGSCI (server as c##oggadmin@ora19c/CDB$ROOT) 11> edit params ext1
加入如下内容:
extract ext1
userid c##oggadmin,password oggadmin
exttrail /u01/app/oracle/ogg/dirdat/et --抽取进程的跟踪文件
table pdb_orcl1.hr.t1;
6.2.9配置投递进程pump1
GGSCI (server as c##oggadmin@orcl1/CDB$ROOT) 12> edit params pump1
加入如下内容
extract pump1
userid c##oggadmin,password oggadmin
rmthost 192.168.88.21,mgrport 6800 --其中rmthost用来指定目标数据库的IP,
rmttrail /u01/app/oracle/ogg/dirdat/rt --rmttrail用来指定投递到目标端的trail文件。
table pdb_orcl1.hr.t1; --table参数后面就是你要复制投递的表,注意结束了一定要用‘;’
7.配置源端与目标端的tnsnames.ora
在tnsname.ora中加入当前pdb_orcl1的连接信息。例如:
TARGET_PDB_ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.21)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb_orcl1)
)
)
之后要测试连通性
8.在目标端数据库配置ogg的相关进程。
8.1配置mgr进程
GGSCI (target) 5> edit params mgr
加入如下内容
PORT 6800
autostart replicat *
autorestart replicat *,retries 3,waitminutes 3
编辑完成保存退出然后启动mgr。
GGSCI (target) 6> start mgr
8.2用ogg用户oggadmin登录pdb_orcl1
GGSCI (target) 7> dblogin userid oggadmin@192.168.88.21/pdb_orcl1,password oggadmin;
Successfully logged into database PDB_ORCL1.
8.3编辑GLOBALS
GGSCI (target as oggadmin@orcl1/PDB_ORCL1) 8> edit params ./GLOBALS
加入如下内容:
GGSCHEMA oggadmin
CHECKPOINTTABLE oggadmin.checkpointtable
8.4添加检查点表(checkpointtable)
GGSCI (target as oggadmin@orcl1/PDB_ORCL1) 9> add checkpointtable oggadmin.checkpointtable
8.5添加数据复制进程rep1并配置
GGSCI (target as oggadmin@orcl1/PDB_ORCL1) 9> add replicat rep1 exttrail /u01/app/oracle/ogg/dirdat/rt,checkpointtable oggadmin.checkpointtable
GGSCI (target as oggadmin@orcl1/PDB_ORCL1) 10> edit params rep1
加入如下内容:
replicat rep1
userid oggadmin@ora19c2_pdb1,password oggadmin
ASSUMETARGETDEFS
--使用ASSUMETARGETDEFS参数时,用MAP语句中指定的生产库源表和灾备端目标表具有相同的列结构。它指示的Oracle GoldenGate不在生产端查找源表的结构定义。
HANDLECOLLISIONS --不要用!存在操作不一致性(详情https://blog.csdn.net/zhuxiaoliao/article/details/42234661)
DBOPTIONS ENABLE_INSTANTIATION_FILTERING --当DDL复制报错时,则需要用到此处的ddlerror参数预处理一些常见的报错信息。Ddlerror对于抽取、复制进程均有效,默认为abend。
DISCARDFILE /u01/app/oracle/ogg/rep1_discard.txt,append,megabytes 10
--将执行失败的记录保存在discard file中,文件中已经包含记录的话,再后面继续追加,不删除之前的记录。
--如当DDL复制报ORA-1430错误,传递了重复的alter语句导致,则可以用ddlerror (1430, discard)将错误信息扔到discard文件里。
DISCARDROLLOVER AT 02:00
--为了防止discard file被写满,每天2:00做一次文件过期设定
DDLERROR DEFAULT IGNORE RETRYOP --DDL语句出错默认
map pdb_orcl1.hr.t1,target hr.t1;
9.启动源端OGG抽取和投递进程
GGSCI (server) 5> start pump1
GGSCI (server) 6> start ext1
10.导入数据
如果源端数据巨大可以使用数据泵(Data Pump)的方式;
如果在测试环境上进行测试可以手工建表:PDB下HR用户T1表。
11.启动目标端OGG复制进程
GGSCI (target as oggadmin@orcl1/PDB_ORCL1) 10> start mgr
GGSCI (target as oggadmin@orcl1/PDB_ORCL1) 11> start rep1
12.OGG进程检查与日志查看
在源和目标端的OGG控制台(GGSCI)执行info all
命令,查看进程是否是RUNNING状态。
相应日志会记录在/u01/app/oracle/ogg/ggserr.log
文件中。