RHEL 6.10 + Oracle 11.2.0.4 + GoldenGate 11.2.1.0.3 单向复制部署指南

8 阅读9分钟

RHEL 6.10 + Oracle 11.2.0.4 + GoldenGate 11.2.1.0.3 单向复制部署指南

这是一套可完整复现的Oracle GoldenGate单向同步部署笔记,基于VirtualBox虚拟机环境,所有步骤均亲测有效。无需丰富的Linux或Oracle经验,跟着步骤操作即可成功搭建。如有错误,欢迎批评指正。


OGG(Oracle GoldenGate)是基于数据库日志的增量数据复制(CDC)技术,全程不侵入业务、不锁表、亚秒级延迟。

标准单向同步数据流:源端Redo/Archive日志 → Extract抽取 → 本地Trail文件 → Data Pump传输 → 目标端Trail文件 → Replicat应用 → 目标库数据一致

四大核心进程

进程位置核心作用
Manager源+目标进程启停、监控、自动重启、端口管理、清理旧文件
Extract源端解析Redo/Archive,捕获DML/DDL,写入本地Trail
Data Pump源端读取本地Trail,压缩加密后传输到目标端
Replicat目标端读取远程Trail,生成SQL应用到目标库

一、环境准备

1.1 VirtualBox 配置

打开 VirtualBox,进入「管理 → 主机网络管理器」,创建 Host-Only 网卡,默认网段为 192.168.56.1/24,关闭DHCP服务器,用于主备节点通信。

1.2 软件清单

提前下载以下文件,放在宿主机易访问目录(如 D:\software\):

文件名说明
CentOS-6.10-x86_64-bin-DVD1.isoRHEL/CentOS 6.10 操作系统镜像
p13390677_112040_Linux-x86-64_1of7.zipOracle 11g 数据库安装包分卷1
p13390677_112040_Linux-x86-64_2of7.zipOracle 11g 数据库安装包分卷2
V34339-01.zipOracle GoldenGate 11.2.1.0.3 安装包
rlwrap-0.42-1.el6.x86_64.rpmsqlplus/ggsci 命令行增强工具(可选)

1.3 网络规划

节点主机名Host-Only IP核心用途
源端ogg1192.168.56.111/24数据抽取与传输
目标端ogg2192.168.56.112/24数据接收与应用
  • 额外配置NAT网卡(自动获取IP),用于外网下载依赖包

1.4 磁盘与内存规划

  • 单节点内存:3072MB(3GB),双节点总占用6GB
  • 单节点系统盘:60GB 固定大小VMDK虚拟磁盘
  • 单节点分区方案:
    挂载点大小文件系统核心用途
    /boot1GBext4系统引导与内核文件
    swap4GBswap虚拟内存换页空间
    /15GBext4系统根目录
    /u0140GBext4Oracle软件、数据库数据、OGG软件与Trail文件

二、创建虚拟机与安装系统

核心思路:先制作通用模板虚拟机ogg1,完成所有主备通用的系统配置、Oracle和OGG软件安装,再完整克隆生成ogg2,仅修改差异化参数,减少80%重复操作。

2.1 创建虚拟机

  1. 打开 VirtualBox,点击「新建」,名称设为ogg1,选择CentOS 6.10镜像
  2. 内存分配3072MB,创建60GB固定大小VMDK虚拟磁盘
  3. 启动顺序:硬盘优先,移除软驱

2.2 虚拟机硬件配置

  • 存储:挂载CentOS 6.10 ISO镜像
  • 网络:网卡1为Host-Only,网卡2为NAT

2.3 安装 CentOS 6.10

  1. 启动虚拟机,加载ISO,语言选English,时区Asia/Shanghai
  2. 软件选择:带GUI的服务器
  3. 按1.4章节分区方案手动分区
  4. 网络配置:主机名ogg1,Host-Only静态IP192.168.56.111/24
  5. 设置root密码为oracle,关闭Kdump,完成安装并重启

三、ogg1通用系统配置(root用户执行)

3.1 网络与hosts配置

# 关闭NetworkManager
service NetworkManager stop
chkconfig NetworkManager off

# 配置hosts解析
cat >> /etc/hosts <<EOF
192.168.56.111 ogg1
192.168.56.112 ogg2
EOF

# 验证网络
ping -c 3 ogg1

3.2 关闭防火墙与SELinux

# 关闭防火墙
service iptables stop
chkconfig iptables off
service ip6tables stop
chkconfig ip6tables off

# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 验证
getenforce  # 应输出Disabled

3.3 创建Oracle用户与组

groupadd -g 1000 oinstall
groupadd -g 1031 dba
groupadd -g 1032 oper

useradd -u 1101 -g oinstall -G dba,oper oracle
echo "oracle" | passwd --stdin oracle

# 验证
id oracle

3.4 创建安装目录

# Oracle目录
mkdir -p /u01/app/oracle/product/11.2.0.4/db_1
mkdir -p /u01/app/oracle/oradata/oggdb
mkdir -p /u01/app/oracle/arch
mkdir -p /u01/app/oracle/admin/oggdb/adump

# OGG目录
mkdir -p /u01/app/ogg
mkdir -p /u01/app/ogg/dirdat /u01/app/ogg/dirrpt /u01/app/ogg/dirchk

# 软件目录
mkdir -p /soft

# 授权
chown -R oracle:oinstall /u01 /soft
chmod -R 775 /u01 /soft

3.5 配置内核参数(3GB内存)

cat >> /etc/sysctl.conf <<EOF
# Oracle 11g + OGG 核心参数
kernel.shmmax = 1610612736
kernel.shmall = 2097152
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

# OGG专属优化参数
kernel.panic_on_oops = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_window_scaling = 1
net.core.netdev_max_backlog = 5000
net.core.somaxconn = 2048
EOF

# 注释掉原有重复参数
vi /etc/sysctl.conf

# 生效
sysctl -p

3.6 调整/dev/shm大小

sed -i 's/^tmpfs.*/tmpfs                   /dev/shm                tmpfs   defaults,size=2000M        0 0/' /etc/fstab
mount -o remount /dev/shm
df -h /dev/shm  # 验证大小为2GB

3.7 配置用户资源限制

sed -i 's/^* soft nproc 1024/*          soft    nproc     16384/' /etc/security/limits.d/90-nproc.conf

cat >> /etc/security/limits.conf <<EOF
# Oracle用户资源限制
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768

# OGG专属资源限制
oracle hard nofile 65536
oracle hard nproc 16384
EOF

# 配置login文件,启用资源限制
cat >> /etc/pam.d/login <<EOF
session required pam_limits.so
EOF

# 配置profile全局用户资源限制
cat >> /etc/profile <<EOF
if [ \$USER = "oracle" ]; then
    if [ \$SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
    umask 022
fi
EOF

# 使配置生效
source /etc/profile

3.8 配置本地YUM源与依赖包

mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom

cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local CentOS 6.10 DVD
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
EOF

yum clean all
yum repolist

# 安装依赖包
yum install -y binutils compat-libcap1 compat-libstdc++-33 \
elfutils-libelf-devel gcc gcc-c++ glibc glibc-devel ksh libaio \
libaio-devel libgcc libstdc++ libstdc++-devel libXext libXtst \
libX11 libXau libXi make sysstat unixODBC unixODBC-devel \
libaio.i686 libaio-devel.i686

# 安装rlwrap(可选)
yum localinstall -y /soft/rlwrap-0.42-1.el6.x86_64.rpm

3.9 配置Oracle用户环境变量

su - oracle
cat >> ~/.bash_profile <<'EOF'
# Shell基础配置
PS1="[\u@\h:\w]\$ "
alias sqlplus="rlwrap sqlplus"
alias rman="rlwrap rman"
alias ggsci="rlwrap ./ggsci"

# Oracle核心环境变量
export LANG=en_US
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=ogg1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORACLE_SID=oggdb
export ORACLE_TERM=xterm

# OGG环境变量
export OGG_HOME=/u01/app/ogg
export PATH=$ORACLE_HOME/bin:$OGG_HOME:.:$PATH:$HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:$OGG_HOME

# 字符集
export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

umask 022
EOF

source ~/.bash_profile

3.10 安装Oracle 11.2.0.4软件(仅安装软件)

# 解压安装包
su - oracle
cd /soft
unzip -q p13390677_112040_Linux-x86-64_1of7.zip
unzip -q p13390677_112040_Linux-x86-64_2of7.zip

# 删除压缩包节省空间
rm p13390677_112040_Linux-x86-64_1of7.zip
rm p13390677_112040_Linux-x86-64_2of7.zip

# 启动安装程序
export DISPLAY=192.168.56.1:0.0
cd /soft/database
./runInstaller

安装关键步骤

  1. 取消安全更新,选择「仅安装数据库软件」
  2. 选择「单实例数据库安装」,企业版
  3. 确认安装位置,特权组选择dba
  4. 忽略swap警告,完成安装
  5. 按提示执行两个root脚本

3.11 安装OGG 11.2.1.0.3软件

su - oracle
cd /soft
unzip -q V34339-01.zip
# 解压核心安装包
tar -xf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /u01/app/ogg

# 修改权限
chown -R oracle:oinstall /u01/app/ogg
chmod -R 775 /u01/app/ogg

# 初始化OGG目录
cd $OGG_HOME
./ggsci

GGSCI (ogg1) 1> create subdirs
GGSCI (ogg1) 2> exit

3.12 配置开机自启动

su - root
# 给rc.local加执行权限
chmod +x /etc/rc.d/rc.local

cat >> /etc/rc.d/rc.local <<EOF
# Oracle监听自启
su - oracle -c "/u01/app/oracle/product/11.2.0.4/db_1/bin/lsnrctl start"
# Oracle数据库自启
su - oracle -c "/u01/app/oracle/product/11.2.0.4/db_1/bin/sqlplus / as sysdba <<EOF
startup;
exit;
EOF"

# OGG Manager自启
su - oracle -c "cd /u01/app/ogg && ./ggsci -c 'start mgr'"
EOF

# 验证
tail -15 /etc/rc.d/rc.local

四、源端(ogg1)数据库与OGG基础配置

4.1 创建数据库实例

su - oracle
export DISPLAY=192.168.56.1:0.0

# 创建监听
netca  # 按向导创建默认监听LISTENER,端口1521
# 验证监听状态
lsnrctl status

# 创建数据库
dbca

DBCA关键配置

  • 全局数据库名:oggdb,SID:oggdb
  • 取消EM配置,所有账户密码统一为oracle
  • 存储类型:文件系统,数据文件位置/u01/app/oracle/oradata/oggdb
  • 启用归档模式,快速恢复区/u01/app/oracle/arch
  • 仅保留Oracle Text和Sample Schemas
  • 内存:2048MB,勾选"Use Automatic Memory Management"

4.2 数据库OGG前置配置

sqlplus / as sysdba

-- 开启强制日志
alter database force logging;
-- 验证
SQL> select force_logging from v$database;

-- 验证归档模式
archive log list;

-- 开启补充日志
alter database add supplemental log data;
alter database add supplemental log data (primary key, unique index) columns;
-- 验证
SQL> select supplemental_log_data_min from v$database;

-- 创建OGG专用用户和表空间
create tablespace ogg_tbs
datafile '/u01/app/oracle/oradata/oggdb/ogg01.dbf'
size 500M autoextend on next 100M maxsize unlimited;

-- 创建OGG用户
create user ogg identified by ogg
default tablespace ogg_tbs
temporary tablespace temp;

-- 授予权限
grant connect, resource, select any dictionary, flashback any table,
select any table, insert any table, update any table, delete any table, alter any table
to ogg;

grant execute on dbms_flashback to ogg;

-- 创建测试用户和表
create user test identified by test default tablespace users;
grant dba to test;

conn test/test
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)
);
exit

4.3 OGG基础配置

su - oracle
cd $OGG_HOME
./ggsci

-- 配置Manager进程
edit param mgr
# 粘贴以下内容:
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3

-- 启动Manager
start mgr
-- 验证状态,预期输出:MANAGER RUNNING
info all

-- 配置全局参数
edit param ./GLOBALS
# 粘贴以下内容:
CHECKPOINTTABLE ogg.checkpoint
GGSCHEMA ogg

-- 创建检查点表
dblogin userid ogg password ogg
add checkpointtable ogg.checkpoint

-- 验证
info checkpointtable ogg.checkpoint
exit

五、克隆虚拟机并配置ogg2

5.1 克隆前清理(ogg1执行)

su - root
sed -i '/^HWADDR=/d' /etc/sysconfig/network-scripts/ifcfg-eth[0-1]
rm -rf /etc/udev/rules.d/70-persistent-net.rules
umount /mnt/cdrom
shutdown -h now

5.2 VirtualBox完整克隆

  1. 右键ogg1 → 复制,新名称ogg2
  2. 勾选「重新初始化所有网卡的MAC地址」
  3. 选择「完整复制」,生成新的硬盘UUID

5.3 ogg2差异化配置

  1. 启动ogg2,以root用户登录
# 修改主机名和IP
hostname ogg2
sed -i 's/HOSTNAME=ogg1/HOSTNAME=ogg2/g' /etc/sysconfig/network
sed -i 's/192.168.56.111/192.168.56.112/g' /etc/sysconfig/network-scripts/ifcfg-eth0

# 重启网络
service network restart

# 验证网络互通
ping -c 3 ogg1
ping -c 3 ogg2
  1. 修改Oracle环境变量
su - oracle
sed -i 's/^export ORACLE_HOSTNAME=.*/export ORACLE_HOSTNAME=ogg2/' ~/.bash_profile
source ~/.bash_profile
# 验证
echo $ORACLE_HOSTNAME
  1. 清理OGG残留并重新初始化
cd $OGG_HOME
rm -rf dirprm/*
rm -rf dirchk/*
rm -rf dirdat/*
rm -rf dirrpt/*
rm -rf dirpcs/*
rm -rf dirsql/*
rm -rf dirdef/*
rm -rf dirtmp/*
rm -rf dirout/*
rm -f GLOBALS
rm -f ggserr.log*
# 重新初始化OGG目录
./ggsci
create subdirs
exit

# 重新配置OGG基础环境
./ggsci
edit param mgr
# 粘贴以下内容:
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3

-- 启动Manager
start mgr
-- 验证状态
info all

-- 配置全局参数
edit param ./GLOBALS
# 粘贴以下内容:
CHECKPOINTTABLE ogg.checkpoint
GGSCHEMA ogg

-- 创建检查点表
dblogin userid ogg password ogg
info checkpointtable ogg.checkpoint  # 验证克隆的检查点表

-- 再次验证
info all
exit

六、配置OGG同步进程

6.1 源端(ogg1)进程配置

su - oracle
cd $OGG_HOME
./ggsci

-- 添加表级补充日志
dblogin userid ogg password ogg
add trandata test.emp
-- 验证
info trandata test.emp

-- 配置Extract抽取进程ext1
edit param ext1
# 粘贴以下内容:
extract ext1
userid ogg, password ogg
exttrail ./dirdat/lt
dynamicresolution
getupdatebefores
nocompressdeletes
nocompressupdates
tranlogoptions convertucs2clobs
warnlongtrans 12h, checkinterval 30m
discardfile ./dirrpt/ext1.dsc, append, megabytes 100
reportcount every 1 minutes, rate
table test.*;

-- 添加Extract进程
add extract ext1, tranlog, begin now
-- 绑定本地Trail文件
add exttrail ./dirdat/lt, extract ext1, megabytes 100

-- 配置Data Pump传输进程pump1
edit param pump1
# 粘贴以下内容:
extract pump1
passthru
rmthost ogg2, mgrport 7809
rmttrail ./dirdat/rt
discardfile ./dirrpt/pump1.dsc, append, megabytes 100
reportcount every 1 minutes, rate
table test.*;

-- 添加Data Pump进程
add extract pump1, exttrailsource ./dirdat/lt
-- 绑定远程Trail文件
add rmttrail ./dirdat/rt, extract pump1, megabytes 100

exit

6.2 目标端(ogg2)进程配置

su - oracle
cd $OGG_HOME
./ggsci

-- 配置Replicat复制进程rep1
edit param rep1
# 粘贴以下内容:
replicat rep1
userid ogg, password ogg
assumetargetdefs
handlecollisions
discardfile ./dirrpt/rep1.dsc, append, megabytes 100
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10000
MAXTRANSOPS 100000
BATCHSQL
map test.*, target test.*;

-- 添加Replicat进程
add replicat rep1, exttrail ./dirdat/rt, checkpointtable ogg.checkpoint

exit

七、启动进程并验证同步

7.1 按顺序启动进程

# ogg1执行
su - oracle
cd $OGG_HOME
./ggsci
start mgr
start ext1
start pump1
info all

# ogg2执行
su - oracle
cd $OGG_HOME
./ggsci
start mgr
start rep1
info all

7.2 验证同步效果

-- ogg1源端执行
sqlplus test/test
insert into emp values (7369, 'SMITH', 'CLERK', 7902, to_date('1980-12-17', 'yyyy-mm-dd'), 800, null, 20);
insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('1981-02-20', 'yyyy-mm-dd'), 1600, 300, 30);
commit;

-- ogg2目标端验证
sqlplus test/test
select * from emp;  -- 应显示两条记录

-- 测试更新
update emp set sal = 900 where empno = 7369;
commit;
select sal from emp where empno = 7369;  -- 应显示900

-- 测试删除
delete from emp where empno = 7499;
commit;
select count(*) from emp;  -- 应显示1

八、日常运维

操作命令
查看所有进程状态info all
查看进程详细信息info ext1 detail
启动/停止进程start ext1 / stop ext1
强制停止进程stop ext1!
查看进程延迟lag ext1 / lag rep1
查看统计信息stats ext1
查看全局错误日志view ggserr.log
查看进程报告view report ext1