一、背景
GoldenGate从源数据库的事务日志捕获数据,并应用到目标数据库,它提供了一种灵活的、松耦合的体系结构,可以被用于实现几乎所有复制的场景。最大的挑战之一就是为复制建立一个目标库,在目标数据库初始实例化后,应用改变的数据时,确保没有数据冲突,也没有数据丢失。GoldenGateton通过“CSN”(Commit Sequence Number)解决此问题。“CSN”并不是Oracle的“SCN”,虽然它们在功能上相似,但语法是不同的。GoldenGate使用此功能获得源数据库的读一致性映像进行目标数据库的实例化,并且对一致性映像的CSN保持跟踪。
本文假设这样一个场景,源数据库是生产系统数据库,需要做到停机最小化,并且已有很大的数据量。现在需要用GoldenGate搭建一个复制环境。源和目标都已经安装配置好GoldenGate。
二、环境
两台Oracle VM VirtualBox虚拟机
host:master1、master2
IP:192.168.1.1、192.168.1.2
OS:Linux 2.6.32
DB:Oracle 11.2.0.3,启用归档
OGG:ogg112101_fbo_ggs_Linux_x64_ora11g_64bit 2.2.3
master1上是源数据库,master2上建立auxiliary DB,其数据库名称和相关的目录结构都和源库一样
三、使用RMAN duplicate复制实例化目标库
11g的RMAN duplicate 可以通过Active database duplicate和Backup-based duplicate两种方法实现。这里的测试使用的是Active database duplicate,因为Active database duplicate 功能强大,不需要先把目标数据库进行rman备份,只要目标数据库处于归档模式下即可直接通过网络对数据库进行copy,且copy完成后自动open数据库。这对于大数据特别是T级别的数据库来说优点非常明显,复制前不需要进行备份,减少了备份和传送备份的时间,同时节省备份空间。下面来进行具体的duplicate操作。
1. 开启源库的补充日志
在master1上:
2. 启动GoldenGate抽取进程
在master1上:
3. 创建auxiliary DB参数文件,启动实例到nomount状态
在master1上执行
4. 在master2上创建参数文件中的相关目录并修改所属
5. 在master2上启动实例到nomount状态
6. 创建密码文件,把master1上的orapwmydb1拷贝到master1的相应目录下
7. 配置网络
master1上:
修改listener.ora文件如下:
修改listener.ora文件如下:
8. 在master1上启动复制
9. 复制完成后,查看auxiliary DB上最后恢复到的最后SCN
在master2上查看alert log文件,查找RESETLOGS after incomplete recovery UNTIL CHANGE条目
10. 重启auxiliary DB库
在master2上:
11. 启动GoldenGate复制进程
在master2上:
五、参考
Oracle GoldenGate Best Practices: Instantiation from an Oracle Source Database
Oracle Rman duplicate数据库复制
Oracle11gR2使用RMAN duplicate复制数据库
GoldenGate从源数据库的事务日志捕获数据,并应用到目标数据库,它提供了一种灵活的、松耦合的体系结构,可以被用于实现几乎所有复制的场景。最大的挑战之一就是为复制建立一个目标库,在目标数据库初始实例化后,应用改变的数据时,确保没有数据冲突,也没有数据丢失。GoldenGateton通过“CSN”(Commit Sequence Number)解决此问题。“CSN”并不是Oracle的“SCN”,虽然它们在功能上相似,但语法是不同的。GoldenGate使用此功能获得源数据库的读一致性映像进行目标数据库的实例化,并且对一致性映像的CSN保持跟踪。
本文假设这样一个场景,源数据库是生产系统数据库,需要做到停机最小化,并且已有很大的数据量。现在需要用GoldenGate搭建一个复制环境。源和目标都已经安装配置好GoldenGate。
二、环境
两台Oracle VM VirtualBox虚拟机
host:master1、master2
IP:192.168.1.1、192.168.1.2
OS:Linux 2.6.32
DB:Oracle 11.2.0.3,启用归档
OGG:ogg112101_fbo_ggs_Linux_x64_ora11g_64bit 2.2.3
master1上是源数据库,master2上建立auxiliary DB,其数据库名称和相关的目录结构都和源库一样
三、使用RMAN duplicate复制实例化目标库
11g的RMAN duplicate 可以通过Active database duplicate和Backup-based duplicate两种方法实现。这里的测试使用的是Active database duplicate,因为Active database duplicate 功能强大,不需要先把目标数据库进行rman备份,只要目标数据库处于归档模式下即可直接通过网络对数据库进行copy,且copy完成后自动open数据库。这对于大数据特别是T级别的数据库来说优点非常明显,复制前不需要进行备份,减少了备份和传送备份的时间,同时节省备份空间。下面来进行具体的duplicate操作。
1. 开启源库的补充日志
在master1上:
alter database add supplemental log data;
2. 启动GoldenGate抽取进程
在master1上:
start manager
ADD EXTRACT pri_ext, TRANLOG, BEGIN NOW
ADD EXTTRAIL /home/oracle/ogg/dirdat/lt, EXTRACT pri_ext
ADD EXTRACT pum_ext, EXTTRAILSOURCE /home/oracle/ogg/dirdat/lt
ADD RMTTRAIL /home/oracle/ogg/dirdat/rt, EXTRACT pum_ext
START EXTRACT pri_ext
START EXTRACT pum_ext
3. 创建auxiliary DB参数文件,启动实例到nomount状态
在master1上执行
create pfile from spfile;
使用scp直接拷贝到master2的相关目录,或者在master2上直接编辑参数文件。
scp /u01/app/oracle/product/11.2.0/db_1/dbs/initmydb1.ora 192.168.1.2:/u01/app/oracle/product/11.2.0/db_1/dbs
如果有则删除掉这行*.local_listener='LISTENER_MYDB1'
4. 在master2上创建参数文件中的相关目录并修改所属
mkdir -p /u01/app/oracle/admin/mydb1
mkdir -p /u01/app/oracle/admin/mydb1/adump
mkdir -p /u01/app/oracle/oradata/mydb1
mkdir -p /u01/app/oracle/fast_recovery_area/
mkdir -p /u01/app/oracle/fast_recovery_area/mydb1
5. 在master2上启动实例到nomount状态
startup nomount pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initmydb1.ora';
create spfile from pfile;
6. 创建密码文件,把master1上的orapwmydb1拷贝到master1的相应目录下
scp /u01/app/oracle/product/11.2.0/db_1/dbs/orapwmydb1 192.168.1.2:/u01/app/oracle/product/11.2.0/db_1/dbs
7. 配置网络
master1上:
修改listener.ora文件如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = mydb1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
修改tnsnames.ora文件如下:
MYDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb1)
)
)
oradu =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb1)
)
)
master2上:
修改listener.ora文件如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = mydb1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
修改tnsnames.ora文件如下:
MYDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb1)
)
)
oradu =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb1)
)
)
8. 在master1上启动复制
rman target sys/123456@mydb1 auxiliary sys/123456@oradu
RMAN> duplicate target database to mydb1 from active database nofilenamecheck;
9. 复制完成后,查看auxiliary DB上最后恢复到的最后SCN
在master2上查看alert log文件,查找RESETLOGS after incomplete recovery UNTIL CHANGE条目
vi /u01/app/oracle/diag/rdbms/mydb1/mydb1/trace/alert_mydb1.log
RESETLOGS after incomplete recovery UNTIL CHANGE 1474353
10. 重启auxiliary DB库
在master2上:
shutdown immediate;
create spfile from pfile;
startup;
11. 启动GoldenGate复制进程
在master2上:
-- 建立检查点表
start manager
DBLOGIN USERID ogg, PASSWORD 123456
# 源库上没有OGG的添加检查点表,所以目标库上要手工添加
ADD CHECKPOINTTABLE ogg.cpt
ADD REPLICAT rep, EXTTRAIL /home/oracle/ogg/dirdat/rt
start replicat rep, aftercsn 1474353
五、参考
Oracle GoldenGate Best Practices: Instantiation from an Oracle Source Database
Oracle Rman duplicate数据库复制
Oracle11gR2使用RMAN duplicate复制数据库