新上的一个项目,需要同步几个表的数据到远程的数据库,为了保证实时性,采用了golden gate的方式。
oracle 数据库的版本都是11g
1 安装
下载OGG 安装包
191004_fbo_ggs_Linux_x64_shiphome.zip
创建 安装目录
mkdir /ogg
chown -R oracle.oinstall /ogg
使用oracle 用户安装
unzip 191004_fbo_ggs_Linux_x64_shiphome.zip
修改.bash_profile
export OGG_HOME=/home/oracle/ogg
export PATH=$ORACLE_HOME/bin:$PATH:$OGG_HOME
编辑静默安装文件
vi /home/oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp
修改的地方如下:
INSTALL_OPTION=ORA11g
SOFTWARE_LOCATION=/ogg
返回 Disk1 目录,执行安装
./runInstaller -silent -responseFile /home/oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp
安装完成 后 进入 /ogg
ldd ggsci # 查看是否有依赖包没安装
启动 golden gate
直接 ggcsi 或者到 /ogg 目录下执行 ./ggcsi
CREATE SUBDIRS # 创建应用目录
源端和目标端都是这么安装
2 配置
数据库的设置
开启数据库级别日志补充
SQL >ALTER DATABASE FORCE LOGGING;
SQL >ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL >ALTER SYSTEM ARCHIVE LOG CURRENT;
SQL >SELECT name,open_mode,force_logging,supplemental_log_data_min FROM v$database;
创建OGG管理用户及其表空间
SQL >select name from v$datafile;
SQL >CREATE TABLESPACE goldengate DATAFILE '+DATA01' SIZE 100M AUTOEXTEND ON;
SQL >CREATE USER oggadmin IDENTIFIED BY oggadmin DEFAULT TABLESPACE goldengate;
SQL >GRANT dba TO oggadmin;
配置DDL功能
SQL>alter system set recyclebin=off scope=both;
SQL> @/ogg/marker_setup.sql
SQL> @/ogg/ddl_setup.sql
SQL> @/ogg/role_setup.sql
SQL>GRANT GGS_GGSUSER_ROLE TO oggadmin;
SQL> @/ogg/ddl_enable.sql
SQL>ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE SCOPE=BOTH;
添加角色 (目标端不执行)
SQL >@/goldengate/role_setup
Enter GoldenGate schema name:oggadmin
ogg软件配置
设置全局参数
ogg global
GGSCI> EDIT PARAMS ./GLOBALS
GGSCHEMA oggadmin
CHECKPOINTTABLE oggadmin.checkpoint
配置源端管理任务 (参数的含义可以自己查,我就不解释了)edit param mgr
PORT 7809
DYNAMICPORTLIST 7801-8200
AUTOSTART ER *
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
配置源端抽取任务 edit param E_SHADM1
extract E_SHADM1
SETENV(ORACLE_SID="xlsdb1")
SETENV(NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
USERID oggadmin,PASSWORD oggadmin
DBOPTIONS ALLOWUNUSEDCOLUMN
CACHEMGR, CACHESIZE 256MB
REPORT AT 06:00
REPORTCOUNT EVERY 1 HOURS, RATE
REPORTROLLOVER AT 02:00
TRANLOGOPTIONS DBLOGREADER
EXTTRAIL ./dirdat/e1
DDL INCLUDE ALL
DDLOPTIONS ADDTRANDATA, REPORT
table shadm.t_tms_pos;
table shadm.t_tms_pos_tmp;
执行下面的2句语句,完成任务添加
add extract E_SHADM1,tranlog,THREADS 2, begin now
add exttrail /ogg/dirdat/e1,extract E_SHADM1
配置源端传输任务
edit params P_SHADM1
extract P_SHADM1
SETENV(ORACLE_SID="xlsdb1")
SETENV(NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
USERID oggadmin,PASSWORD oggadmin
REPORT AT 01:59
REPORTROLLOVER AT 02:00
CACHEMGR, CACHESIZE 256MB
FLUSHCSECS 30
NUMFILES 6000
EOFDELAYCSECS 30
RMTHOST 192.168.102.12,MGRPORT 7809, TCPBUFSIZE 100000, TCPFLUSHBYTES 300000
RMTTRAIL ./dirdat/t1
table shadm.t_tms_pos;
table shadm.t_tms_pos_tmp;
执行下面的2句语句,完成任务添加
add extract P_SHADM1,exttrailsource /ogg/dirdat/e1
add rmttrail /ogg/dirdat/t1,extract P_SHADM1
配置目标端管理任务 edit param mgr(路径最好使用 ./dirdat 这样的方式,因为如果安装的绝对路径不一样的话,会出现问题)
PORT 7809
DYNAMICPORTLIST 7801-8200
AUTOSTART REPLICAT *
AUTORESTART REPLICAT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
配置目标端恢复数据任务 edit param R_SHADM1
replicat R_SHADM1
ASSUMETARGETDEFS
SETENV (ORACLE_SID="xlsbackdb")
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
USERID oggadmin,PASSWORD oggadmin
REPORT AT 03:00
REPORTROLLOVER AT 03:20
CACHEMGR, CACHESIZE 256MB
REPERROR DEFAULT,ABEND
DISCARDFILE ./dirrpt/R_SHADM1.dsc,APPEND,MEGABYTES 10
DISCARDROLLOVER AT 06:00
NUMFILES 5000
EOFDELAYCSECS 30
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
map shadm.t_tms_pos, target shadm.t_tms_pos;
map shadm.t_tms_pos_tmp, target shadm.t_tms_pos_tmp;
执行下面的语句,完成任务添加
add replicat R_SHADM1, exttrail /ogg/dirdat/t1,CHECKPOINTTABLE oggadmin.checkpoint
可以先开启源端的同步进程。
ADD TRANDATA shadm.t_tms_pos
ADD TRANDATA shadm.t_tms_pos_tmp
start mgr
start E_SHADM1
导入导出表没什么特别的,导出的时候记得加上参数 flashback_scn ,这样可以让表的同步也从这个scn开始,保证数据一致
我自己的库导出时的scn=347069066
导入表到远程的库之后,现在可以启动同步了。
目标端: start mgr
源端: start P_SHADM1
目标端: start replicat R_SHADM1,aftercsn 347069066 (意思是从这个scn开始恢复数据)
因为我这个是源端不能停库,所以ogg的启动顺序才这样,一般的正常启动方式是
source : mgr
target: mgr
source: 抽取数据进程
target: 恢复进程
source: 推送数据过程
下面附一些ogg 的日常管理用的命令:
DBLOGIN USERID 用户名,PASSWORD 用户密码 #登录数据库
info all # 查看所有进程状态
info R_SHADM1 # 查看某个进程的信息
edit param R_SHADM1 # 编辑进程参数
view param R_SHADM1 # 查看进程配置
stats R_SHADM1,hourly #查看每小时的数据变更状况
start/stop R_SHADM1 # 启动/停止进程
view report R_SHADM1 #查看进程的日志情况
delete R_SHADM1 #删除进程,必须先登录
ADD TRANDATA USERNAME.TABLE_NAME #添加所需同步的表的附加日志
追加数据同步
当 发现进程挂起的时候,怎么继续同步数据呢
本例中因为 ddl 在 目标端执行出错,导致之后的 语句都失败了(这个DDL语句是加分区语句,对目前的数据不影响)
目标端操作:
info R_SHADM2
可以看到 的信息是
恢复日志为 :
/home/oracle/ogg/dirdat/t2000000000
停在的rba :
55894293
回到 ogg 安装目录:
./logdump
open /home/oracle/ogg/dirdat/t2000000000
pos 55894293
n ############################ 可以看到 55894293 这个操作是DDL 操作
n ####这是 下一个 rba操作,显示的 55894311,但是还是ddl 分区,(这个就是知道分区操作了2次)
n #### 2020/03/06 01:28:27.609.813 Insert Len 211 RBA 55894793 ####这时候可以了 记住这个RBA数值
回到ogg ./ggsci 登录
alter replicat R_SHADM2, extrba 55894793
start R_SHADM2
可以看到 进程正常运行了