介绍
本文介绍OGG单向dml复制,先从数据初始化开始,然后配置实时同步!数据库和OGG的安装过程略!
初始化数据有很多方法,这里介绍用ogg来初始化,所以创建了T1表!
实时同步使用源端EXTRACT进程捕捉增量数据,存到源端trail文件中,然后使用源端pump进程读取EXTRACT的trail文件并投递到目标端的replicat进程的trail文件中。
服务器 | 操作系统版本 | 数据库版本 | OGG版本 | |
源端 | 192.168.141.100 | CentOS6.8 | 11.2.0.4 | 12.2.0.1 |
目标端 | 192.168.141.105 | CentOS6.8 | 11.2.0.4 | 12.2.0.1 |
数据库配置
1.源端和目标端数据库需要运行在归档模式,开启最小数据库附加日志,开启force_logging(可选)
alter database archivelog; (需要数据库在mount状态执行)
alter database force logging;
alter database add supplemental log data;
注意:
需要配置参数
ENABLE_GOLDENGATE_REPLICATION否则后面会遇到报错:
ERROR OGG-02091 Operation not supported because enable_goldengate_replication is not set to true.
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE SCOPE=BOTH;
2.创建OGG用户和单独表空间(源端和目标端都需要)
create tablespace ts_ogg datafile '/u01/app/oracle/oradata/tdb01/ts_ogg01.dbf' size 200M AUTOEXTEND on extent management local segment space management auto;
create user ggusr identified by ggusr default tablespace ts_ogg;
为了方便直接给予DBA权限:
grant resource,connect,dba to ggusr;
3.测试用户和表准备(源端目标端都需要)
这里直接使用scott用户来做测试:
alter user scott identified by scott account unlock;
grant select_catalog_role to scott;
源端:使用 sys用户在scott下面创建表,因为DBA_OBJECTS表scott无法访问
create table scott.t1 as select * FROM DBA_OBJECTS;
ALTER TABLE scott.t1 ADD constraint pk_t1 primary key(object_id);
目标端:只需要创建表结构
create table scott.t1 as select * FROM DBA_OBJECTS where 1=2;
ALTER TABLE scott.t1 ADD constraint pk_t1 primary key(object_id);
4.配置TNS
源端:
目标端:
OGG MGR进程配置
在源端和目标端都要配置MGR管理进程
GGSCI (oracle01) 1>EDIT PARAMS mgr
PORT 7809 ---手动编辑输入
GGSCI (oracle01) 3> view params mgr -查看
PORT 7809
其他命令:
-- info all 查看进程信息
-- start mgr 启动mgr进程
-- info mgr 查看mgr进程信息
-- view report mgr 查看mgr的报告
配置完成后,将源端和目标端的mgr进程都启动
start mgr
OGG数据初始化
在做实时同步之前,需要将源端和目标端的表(t1)中的数据进行同步,同步的方式有很多(数据泵,dblink,ogg等),这里介绍通过ogg来同步表数据,直接从源库同步数据到目标库(direct load),不生成trail文件。
1.在源端添加 extract 进程
GGSCI (oracle01) 1> ADD EXTRACT initab,SOURCEISTABLE
查看相关信息:
info initab,task
info initab,showch
编辑参数:
GGSCI (oracle01) 4> EDIT PARAMS initab
extract initab
setenv (ORACLE_SID=tdb01)
setenv (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
userid ggusr,password ggusr
rmthost 192.168.141.105,mgrport 7809
rmttask replicat,group scott1 --- scott1 为目标端replicat进程名称(红色字体使用时需要去掉)
table scott.t1;
GGSCI (oracle01) 6> view params initab -----查看参数
2.在目标端添加replicat进程
GGSCI (oracle02) 2> add replicat scott1,specialrun ---specialrun 只运行一次
编辑参数rinig1 --名字可以随便取,但是必须和上面同意
GGSCI (oracle02) 3> EDIT PARAMS scott1
replicat scott1
setenv (ORACLE_SID=tdb02)
setenv (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
setenv (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
assumetargetdefs
userid ggusr,password ggusr
discardfile ./dirrpt/rinig1.dsc,purge
map scott.*,target scott.*;
GGSCI (oracle02) 4> view params scott1 ---查看参数
3.开始初始化数据
源端:
启动extract进程 并查看日志输出
GGSCI (oracle01) 9>start extract initab
GGSCI (oracle01) 10>info *,task --查看运行状态
GGSCI (oracle01) 11>view report initab ---查看输出信息,检查是否有报错
没有报错最后会出现:
注意:
OGG-01201 Error reported by MGR : Access denied.
如果出现这个报错,说明目标端mgr拒绝了连接,需要在目标端添加mgr的参数文件中添加
ACCESSRULE, PROG *, IPADDR *, ALLOW
查询两边表scott.t1表的数据量是否相同:
select count(*) from scott.t1; ---86953条(我这里是)
至此,数据初始化完成!
DML实时同步
源端EXTRACT进程捕捉增量数据,存到trail文件中,然后使用pump进程读取EXTRACT的trail并投递到目标端的replicat进程!!!
1.配置OGG实时同步功能(源端操作)
####使用ogg用户ggusr登录
GGSCI (oracle01) 1> dblogin userid ggusr, password ggusr
Successfully logged into database.
####在源端配置将需要传输的用户的表的附加日志:
GGSCI (oracle01 as ggusr@tdb01) 2>info trandata scott.* ---查看表附加日志信息
Logging of supplemental redo log data is disabled for table SCOTT.BONUS.
Logging of supplemental redo log data is disabled for table SCOTT.DEPT.
Logging of supplemental redo log data is disabled for table SCOTT.EMP.
Logging of supplemental redo log data is disabled for table SCOTT.SALGRADE.
Logging of supplemental redo log data is disabled for table SCOTT.T1.
####添加表附加日志信息
GGSCI (oracle01 as ggusr@tdb01) 3> add trandata scott.*
2.源端配置EXTRACT进程并添加trail文件,进程名字不能超过8个字符
GGSCI (oracle01) 2>ADD EXTRACT scott_st,tranlog,begin now
编辑参数:
GGSCI (oracle01) 3>EDIT PARAMS scott_st
extract scott_st
setenv (ORACLE_SID=tdb01)
setenv (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
userid ggusr,password ggusr
exttrail ./dirdat/st
table scott.*;
GGSCI (oracle01) 4>view PARAMS scott_st
添加 exttrail文件,文件前缀不能超过2个字:
GGSCI (oracle01) 5>add exttrail ./dirdat/st,extract scott_st,megabytes 100
启动extract进程scott_st:
GGSCI (oracle01) 6>start extract scott_st
3.源端添加并启动pump进程(pump进程也是一种extract进程)
GGSCI (oracle01) 7>EDIT PARAMS pora_st
extract pora_st
setenv (ORACLE_SID=tdb01)
setenv (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
passthru
rmthost 192.168.141.105,mgrport 7809
rmttrail ./dirdat/pa
table scott.*;
添加pump进程,并使用前面extract捕获的日志
GGSCI (oracle01) 8>add extract pora_st,exttrailsource ./dirdat/st
添加输出到目标端的trail文件名称,和参数中一致
GGSCI (oracle01) 9>add rmttrail ./dirdat/pa,extract pora_st,megabytes 100
启动extract进程pora_st:
start extract pora_st
4.目标端配置replicat进程
####在目标端添加检查表,
GGSCI (oracle02) 1> EDIT PARAMS ./GLOBALS
checkpointtable ggusr.rep_demo_ckpt
ggsci 登录到ggusr用户
GGSCI (oracle02) 2>dblogin userid ggusr, password ggusr
GGSCI (oracle02 as ggusr@tdb02) 3>add checkpointtable ggusr.rep_demo_ckpt
此时,在oracle中登录ggusr后,可以看到该用户下多出2张表
REP_DEMO_CKPT TABLE 和 REP_DEMO_CKPT_LOX
添加并启动replicat进程
GGSCI (oracle02) 1>EDIT PARAMS rora_st
replicat rora_st
setenv (ORACLE_SID=tdb02)
setenv (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
userid ggusr,password ggusr
handlecollisions
assumetargetdefs
discardfile ./dirrpt/rora_st.dsc,purge
map scott.*,target scott.*;
添加replicat进程,配置trail
GGSCI (oracle02) 2>add replicat rora_st,exttrail ./dirdat/pa
启动extract进程!!(前面已经启动mgr)
GGSCI (oracle02) 3>start replicat rora_st
其他命令:
stats rora_st -----查看进程的捕获信息!!!!
info *.task
测试
同步测试:
select max(object_id) from t1; --在源端和目标端都查询T1表中最大的object_id号
源端做insert操作并提交:
insert into t1(object_id,object_name) values('88606','ogg_test');
commit;
目标端查询:
select object_id,object_name from t1 where object_id='88606';