暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ogg 11 同步 for linux

原创 四九年入国军 2025-07-22
110


--一、部署ogg-远端、目标端

1、ogg初始化
--oracle 用户
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export OGG_HOME=/home/oracle/ogg
export  PATH=$ORACLE_HOME/bin:$OGG_HOME:$PATH


2、为ogg创建目录 
mkdir /home/oracle/ogg
unzip p22575475_1121032_Linux-x86-64.zip
mv fbo_ggs_Linux_x64_ora11g_64bit.tar /home/oracle/ogg/
cd /home/oracle/ogg
tar -xvf  fbo_ggs_Linux_x64_ora11g_64bit.tar


3、创建子目录--注意存储规划

cd /home/oracle/ogg
./ggsci
GGSCI (test) 1> create subdirs

Creating subdirectories under current directory /home/oracle/ogg

Parameter files                /home/oracle/ogg/dirprm: already exists
Report files                   /home/oracle/ogg/dirrpt: created    --存放report文件
Checkpoint files               /home/oracle/ogg/dirchk: created    --存放checkpoint 文件
Process status files           /home/oracle/ogg/dirpcs: created
SQL script files               /home/oracle/ogg/dirsql: created
Database definitions files     /home/oracle/ogg/dirdef: created
Extract data files             /home/oracle/ogg/dirdat: created    --存放trc文件,占用空间最大
Temporary files                /home/oracle/ogg/dirtmp: created
Stdout files                   /home/oracle/ogg/dirout: created




二、ogg 准备阶段

1、配置数据库用户--两端都做

create tablespace  tbs_ogg datafile '/home/oracle/oradata/ora11g/tbs_ogg01.dbf' size 100m autoextend on;
create user ogg identified by ogg default tablespace tbs_ogg;
grant dba,connect to ogg;


2、配置数据库日志模式--只在源端

alter database force logging;
alter database  add supplemental log data;
select supplemental_log_data_min from v$database;



3、关闭数据库回收站--源端(10g版本必须关闭,11g+建议)
purge dba_recyclebin;
alter system set recyclebin=off scope=spfile;


4、修改ogg参数--远端和目标端

alter  system set enable_goldengate_replication=true ;



5、配置DDL复制--源端

vi $OGG_HOME/GLOBALS
--新增
GGSCHEMA OGG

--需要在$OGG_HOME目录下执行
--以下脚本会在OGG用户下面创建一些基础表

cd $OGG_HOME
sqlplus / as SYSDBA
@marker_setup  
--Enter GoldenGate schema name :ogg
@ddl_setup
@role_setup.sql 
grant ggs_ggsuser_role  to  ogg;
@ddl_enable.sql 

@?/rdbms/admin/dbmspool.sql 
@ddl_pin.sql ogg  --提升DDL性能

@marker_status
@ddl_status ogg


SQL> conn ogg/ogg
Connected.
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
GGS_DDL_COLUMNS                TABLE
GGS_DDL_HIST                   TABLE
GGS_DDL_HIST_ALT               TABLE
GGS_DDL_LOG_GROUPS             TABLE
GGS_DDL_OBJECTS                TABLE
GGS_DDL_PARTITIONS             TABLE
GGS_DDL_PRIMARY_KEYS           TABLE
GGS_DDL_RULES                  TABLE
GGS_DDL_RULES_LOG              TABLE
GGS_MARKER                     TABLE
GGS_SETUP                      TABLE
GGS_STICK                      TABLE
GGS_TEMP_COLS                  TABLE
GGS_TEMP_UK                    TABLE

14 rows selected.




6、配置 sequence --源端和目标端

--源端运行sequence
@sequence.sql 
grant execute on ogg.updateSequence to ogg;
alter table sys.seq$ add supplemental log data (primary key ) columns;


--目标端添加:
@sequence.sql 
grant execute  on ogg.replicateSequence to ogg;
grant execute  on dbms_streams_adm_utl_invok to ogg;


7、配置MGR--源端和目标端 
--vi 方式
vi /home/oracle/ogg/dirprm/mgr.prm
--或者ggsci 命令行方式
--这里是命令行方式
--ogg 11g版本建议参数写相对路径,绝对路径有问题
edit params mgr 

PORT 7809
DYNAMICPORTLIST 7840-7910                                                              --端口号列表,ogg通信用
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, minkeepdays 5                             --定时清理trace文件,只保留5一天之内的*/
USERID ogg,PASSWORD ogg
--以下2个参数只需要在源端配置
PURGEDDLHISTORY MINKEEPDAYS 7, MAXKEEPDAYS 10                                          --定期清理ogg.DDLHISTORY 表
PURGEMARKERHISTORY MINKEEPDAYS 7, MAXKEEPDAYS 10                                       --定期清理ogg.markerHISTORY 表


--定义数据延迟的预警机制
lagreporthours 1                                                                    --每隔1小时健康检查一次
laginfominutes 30                                                                  --一旦发现抽取线程和应用线程延迟超过30分钟,写入延迟信息到alert
lagcriticalminutes 45                                                               --如果延迟时间超过45分钟,会将告警日志写入错误日志中

--以上参数如果配置有问题start 会报错,需要查看错误日志:$OGG_HOME/ggserr.log

8、启动 ogg--两个节点

GGSCI (test2) 5> start mgr
Manager started.

GGSCI (test2) 6> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
GGSCI (test2) 7> 





三、ogg 配置 
    整个配置阶段可分为三部分:启动抓取(源端配置抓取进程和投放进程)、初始化数据和数据应用
	
1、配置extract --源端

./ggsci

--开启用户级的或者表级的附加日志
dblogin userid ogg password  ogg
--表级添加
add trandata scott.*  
--或者添加用户级别,二选一
ADD SCHEMATRANDATA scott


--查看是否开启成功:
info trandata  scott.*
--查看用户级
info schematrandata  scott


2、配置extract 参数文件

edit params ext_tf


extract  ext_tf                                                               --抽取线程名字
SETENV (ORACLE_SID="ora11g") 
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

USERID ogg,PASSWORD ogg
NUMFILES 5000                                                                  --指定抓取线程一次抓取的表数量
EXTTRAIL ./dirdat/tf                                                           --指定抽取进程生产的数据前缀,只能2个字符
DISCARDFILE ./dirrpt/ext_tf.dsc , APPEND,MEGABYTES 100                          --抽取进程报错存放到这个路径下,错误日志最大100MB
DISCARDROLLOVER AT 2:00
WARNLONGTRANS 2h, CHECKINTERVAL 3m                                            --超过2h的长事务告警,每30分钟检查一次
REPORTCOUNT EVERY 30 MINUTES, RATE 
TRANLOGOPTIONS EXCLUDEUSER ogg                                                --排除 ogg用户的事务
DDL &                                                                         --DDL 捕获
INCLUDE OBJNAME SCOTT.*;
DDLOPTIONS ADDTRANDATA, GETAPPLOPS, GETREPLICATES, REPORT
TABLE SCOTT.*;                                                                 --DML 捕获
SEQUENCE SCOTT.*;


3、映射extract 线程 
 
GGSCI >ADD EXTRACT ext_tf, TRANLOG, BEGIN NOW                             --添加抽取进程,从现在开始抽取日志
GGSCI >ADD EXTTRAIL ./dirdat/tf, EXTRACT ext_tf, MEGABYTES 100            --指定抽取进程对应的存放数据
GGSCI >start ext_tf                                                        --启动抽取进程
GGSCI >info all                                                             --查看状态



--查看$OGG_HOME/dirdata 会发现有生成的文件

-rw-r----- 1 oracle oinstall 1039 Jul 17 18:00 tf000000                    --tf是前面设置的前缀
[oracle@orcl:/home/oracle/ogg/dirdat]$ pwd
/home/oracle/ogg/dirdat
[oracle@orcl:/home/oracle/ogg/dirdat]$ 



4、配置pump线程--源端

--pump 参数文件
GGSCI >edit params pump_rf
EXTRACT pump_rf
RMTHOST 192.168.13.162, MGRPORT 7809, compress
RMTTRAIL ./dirdat/rf
DISCARDFILE ./dirrpt/pump_rf.dsc , APPEND,MEGABYTES 100               --pump进程对应的报错日志存放位置,最大100MB
NUMFILES 5000
PASSTHRU                                                              --传输方式:透传
TABLE SCOTT.*;
SEQUENCE SCOTT.*;


--添加pump进程:
GGSCI >ADD EXTRACT pump_rf, EXTTRAILSOURCE ./dirdat/tf                       --pump 线程名字必须和参数文件名字一致,这里指的是源端文件
GGSCI >ADD RMTTRAIL ./dirdat/rf, EXTRACT pump_rf, MEGABYTES 100              --这里指向的是目的端文件:把目标端的trace文件和 pump 线程做了个映射,文件大小是100MB
GGSCI> start PUMP_RF
GGSCI> info all

 
----pump 线程传递数据的方式:
--非透传(默认): pump 要先读取源端和目标端的表定义,然后根据映射或者转换规则进行转换,再进程数据传输
--透传:         源端和目的端的表结构完全一致时,不读取两端的表定义,直接进行数据传递
----支持DDL复制的表必须得用透传的方式进行复制
 
	

--查看目标端看是否有文件生成
[oracle@orcl2:/home/oracle/ogg/dirdat]$ ls -ltr
total 0
-rw-r----- 1 oracle oinstall 0 Jul 18 09:10 rf000000
[oracle@orcl2:/home/oracle/ogg/dirdat]$ pwd
/home/oracle/ogg/dirdat
[oracle@orcl2:/home/oracle/ogg/dirdat]$ 



5、刷新序列号 
---如果用户下不存在任何sequence会报错,忽略即可
dblogin userid ogg password  ogg
flush sequence scott.*






6、数据库初始化 
 
    目标端的数据初始化常用三种方式: ogg、expdp/impdp、rman 
	
--这里采用数据泵方式:

--1> 获取并记录源生产库当前的 SCN 号
 sqlplus / as sysdba
 col CURRENT_SCN for 99999999999999
 select current_scn as SCN1 from v$database;
 --1024284
 
 
 --2>当前系统是否存在长事务?
col START_SCN for 99999999999999
col SCHEMANAME for a20
col MACHINE for a20
select
p.INST_ID,p.SPID,s.sid,s.SERIAL#,p.username,s.SCHEMANAME,s.sql_id,t.start_scn,t.START_TIME,t.status,MACHINE
from gv$transaction t,gv$process p,gv$session s
where s.taddr=t.addr and p.addr=s.paddr and t.start_scn <= &SCN1;

--kill 掉长事务
SQL> ! kill -9 &SPID --操作系统 kill 掉 查到的 SPID 号


 
 --3>数据导出: 以 FLASHBACK_SCN 为参数, 使用 expdp 导出生产库数据
 SQL> select userenv('language') from dual;
--AMERICAN_AMERICA.AL32UTF8
--导出前 需确认 undo 表空间足够大, 以免 ORA-01555
expdp system/oracle directory=bak dumpfile=ora11g_%U.dmp logfile=expdp_ora11g.log filesize=30G job_name=expdp1 schemas=scott   flashback_scn=1024284


--4>数据导入:

--关闭归档可以提高导入速度
impdp system/oracle directory=bak dumpfile=ora11g_%U.dmp logfile=impdp_ora11g.log full=y table_exists_action=truncate




--5>目标库禁用 job、 触发器、 外键约束

--通用方式
set serveroutput on;
BEGIN
FOR i IN ( SELECT priv_user,job FROM dba_jobs where priv_user in('SCOTT'))
LOOP
dbms_job.broken(i.job,true);
END LOOP;
END;
/

BEGIN
FOR i IN ( SELECT table_owner,trigger_name,status FROM dba_triggers where table_owner in('SCOTT'))
LOOP
EXECUTE IMMEDIATE 'alter trigger ' ||i.table_owner||'.'|| i.trigger_name || ' disable';
END LOOP;
END;
/

BEGIN
FOR i IN ( SELECT owner,table_name,constraint_name,status,validated FROM dba_constraints WHERE owner IN ('SCOTT')
and constraint_type = 'R')
LOOP
EXECUTE IMMEDIATE 'alter table ' ||i.owner||'.'|| i.table_name || ' disable constraint ' || i.constraint_name;
END LOOP;
END;
/



7、配置replicate--目标端


--创建 checkpoint 表,
./ggsci
GGSCI > DBLOGIN USERID ogg, PASSWORD ogg
GGSCI > ADD CHECKPOINTTABLE OGG.CHECKPOINTTABLE
--在目录$OGG_HOME 下, 创建文件 GLOBALS
[oracle@test-db160 ogg]$ vi GLOBALS
CHECKPOINTTABLE OGG.CHECKPOINTTABLE


--配置进程: rep_rf
GGSCI >edit params rep_rf
REPLICAT rep_rf
SETENV (NLS_LANG = "AMERICAN_CHINA.AL32UTF8")
USERID ogg, PASSWORD ogg
DDL &
INCLUDE MAPPED
DDLERROR DEFAULT IGNORE RETRYOP MAXRETRIES 3 RETRYDELAY 5                            
DBOPTIONS SUPPRESSTRIGGERS, DEFERREFCONST
DISCARDFILE dirrpt/rep_rf.dsc , APPEND                            --存放进程对应的错误日志
DISCARDROLLOVER AT 2:00
REPORTCOUNT EVERY 30 MINUTES, RATE
REPERROR DEFAULT, ABEND
NUMFILES 5000
GROUPTRANSOPS 2000
MAXTRANSOPS 3000
ASSUMETARGETDEFS                                                --两端数据结构一致使用此参数,类似extract进程里面的透传方式
MAP SCOTT.*,TARGET SCOTT.*;                                      --源端表和目标端表对应关系
SEQUENCE SCOTT.*,TARGET SCOTT.*;

--添加进程:
GGSCI >ADD REPLICAT rep_rf, EXTTRAIL ./dirdat/rf                 --REPLICAT 进程的队列一定要和源端 pump进程里面的远程队列一致
GGSCI >start replicat rep_rf aftercsn 前期获取的 SCN



8、同步测试

--1>DDL create 测试:
--源端:
create table scott.test_tmp(id number,name varchar(20));
--目标端查看:
select * from scott.test_tmp;


----分区表

create table scott.test_tmp2(
id number(12),
name varchar2(30),
age varchar2(10))
partition by range(age)
(partition p1 values less than (20),
partition p2 values less than (40),
partition p3 values less than (60),
partition p_other values less than (maxvalue))
enable row movement;

select * from scott.test_tmp2;

--2>DML  测试:

----INSERT测试
----源端
insert into scott.test_tmp values(1,'test1');
insert into scott.test_tmp values(2,'test2');
commit;
select * from scott.test_tmp;
--目标端
select * from scott.test_tmp;


--分区表
insert into scott.test_tmp2 values(01,'test01',18);
insert into scott.test_tmp2 values(02,'test02',28);
insert into scott.test_tmp2 values(03,'test03',58);
insert into scott.test_tmp2 values(04,'test04',68);
commit;

select * from scott.test_tmp2;
select * from scott.test_tmp2 partition(p1);
select * from scott.test_tmp2 partition(p2);
select * from scott.test_tmp2 partition(p3);
select * from scott.test_tmp2 partition(p_other);

----update测试
-----源端--普通表
update  scott.test_tmp set name='test1111' where id =1;
update  scott.test_tmp set name='test2222' where id =2;
commit;
select * from scott.test_tmp;

-----目标端
select * from scott.test_tmp;

-----源端---分区表
update scott.test_tmp2 set name='test100' where id=01;
update  scott.test_tmp2 set age=19 where id=04;
commit;
----目标端查看
select * from scott.test_tmp2;
select * from scott.test_tmp2 partition(p1);
select * from scott.test_tmp2 partition(p2);
select * from scott.test_tmp2 partition(p3);
select * from scott.test_tmp2 partition(p_other);


----delete测试
---源端
delete from   scott.test_tmp;
commit;
select * from scott.test_tmp;

--目标
select * from scott.test_tmp;

----分区表
delete scott.test_tmp2 where id=01;
commit;
select * from scott.test_tmp2;
select * from scott.test_tmp2 partition(p1);
select * from scott.test_tmp2 partition(p2);
select * from scott.test_tmp2 partition(p3);
select * from scott.test_tmp2 partition(p_other);
----DDL drop 测试:
--源端
drop table scott.test_tmp;
select * from scott.test_tmp;

--目标端
select * from scott.test_tmp;

=》分区表
drop table  scott.test_tmp2;
select * from scott.test_tmp2;


----目标端如果遇到问题就会报错暂停同步:

GGSCI (orcl2) 1> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
REPLICAT    ABENDED     REP_RF      00:00:06      00:03:30       --abended :异常终止

---查明原因后,可以跳过继续恢复:
GGSCI (orcl2) 3> start  REP_RF skiptransaction

Sending START request to MANAGER ...
REPLICAT REP_RF starting


GGSCI (orcl2) 4> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
REPLICAT    RUNNING     REP_RF      00:06:38      00:00:02    






 






「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论