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.iso | RHEL/CentOS 6.10 操作系统镜像 |
p13390677_112040_Linux-x86-64_1of7.zip | Oracle 11g 数据库安装包分卷1 |
p13390677_112040_Linux-x86-64_2of7.zip | Oracle 11g 数据库安装包分卷2 |
V34339-01.zip | Oracle GoldenGate 11.2.1.0.3 安装包 |
rlwrap-0.42-1.el6.x86_64.rpm | sqlplus/ggsci 命令行增强工具(可选) |
1.3 网络规划
| 节点 | 主机名 | Host-Only IP | 核心用途 |
|---|---|---|---|
| 源端 | ogg1 | 192.168.56.111/24 | 数据抽取与传输 |
| 目标端 | ogg2 | 192.168.56.112/24 | 数据接收与应用 |
- 额外配置NAT网卡(自动获取IP),用于外网下载依赖包
1.4 磁盘与内存规划
- 单节点内存:3072MB(3GB),双节点总占用6GB
- 单节点系统盘:60GB 固定大小VMDK虚拟磁盘
- 单节点分区方案:
挂载点 大小 文件系统 核心用途 /boot1GB ext4 系统引导与内核文件 swap4GB swap 虚拟内存换页空间 /15GB ext4 系统根目录 /u0140GB ext4 Oracle软件、数据库数据、OGG软件与Trail文件
二、创建虚拟机与安装系统
核心思路:先制作通用模板虚拟机ogg1,完成所有主备通用的系统配置、Oracle和OGG软件安装,再完整克隆生成ogg2,仅修改差异化参数,减少80%重复操作。
2.1 创建虚拟机
- 打开 VirtualBox,点击「新建」,名称设为
ogg1,选择CentOS 6.10镜像 - 内存分配3072MB,创建60GB固定大小VMDK虚拟磁盘
- 启动顺序:硬盘优先,移除软驱
2.2 虚拟机硬件配置
- 存储:挂载CentOS 6.10 ISO镜像
- 网络:网卡1为Host-Only,网卡2为NAT
2.3 安装 CentOS 6.10
- 启动虚拟机,加载ISO,语言选English,时区Asia/Shanghai
- 软件选择:带GUI的服务器
- 按1.4章节分区方案手动分区
- 网络配置:主机名
ogg1,Host-Only静态IP192.168.56.111/24 - 设置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
安装关键步骤:
- 取消安全更新,选择「仅安装数据库软件」
- 选择「单实例数据库安装」,企业版
- 确认安装位置,特权组选择dba
- 忽略swap警告,完成安装
- 按提示执行两个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完整克隆
- 右键ogg1 → 复制,新名称
ogg2 - 勾选「重新初始化所有网卡的MAC地址」
- 选择「完整复制」,生成新的硬盘UUID
5.3 ogg2差异化配置
- 启动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
- 修改Oracle环境变量
su - oracle
sed -i 's/^export ORACLE_HOSTNAME=.*/export ORACLE_HOSTNAME=ogg2/' ~/.bash_profile
source ~/.bash_profile
# 验证
echo $ORACLE_HOSTNAME
- 清理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 |