【数据迁移】- Oracle GoldenGate(OGG)
【数据迁移】- Oracle GoldenGate(OGG) - 目录
- 一、GoldenGate简介
- 二、GoldenGate安装规划
- 三、GoldenGate安装前准备
- 3.1 源端打开数据库补充日志
- 3.2 源端打开force logging
- 3.3 源端配置归档模式
- 3.4 两端创建GoldenGate用户
- 四、GoldenGate安装
- 4.1 介质下载
- 4.2 目标端添加环境变量
- 4.3 目标端检查lib包
- 4.4 目标端创建OGG安装目录
- 4.5 两端创建subdir
- 五、配置OGG进程
- 5.1 两端配置mgr
- 5.2 源端配置Extract抽取进程
- 5.3 源端配置Pump进程
- 5.4 源端add trandata
- 5.5 目标端配置复制进程
- 5.6 源端开启事务数据捕捉
- 5.7 源端升级集成抽取
- 六、GoldenGate数据初始化
- 6.1 源端处理数据库长事务
- 6.2 源端数据库导出
- 6.3 目标端数据库导入
- 七、禁用目标端JOB,触发器
- 八、目标端开启复制同步
- 九、正式割接
- 十、回退方案
一、GoldenGate简介
GoldenGate软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库实时同步(real-time data synchronize)、双活(active-active high availability)。GoldenGate软件可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,其复制过程简图如下
如上图所示,GoldenGate的数据复制过程如下:
利用捕捉进程(Capture Process)在源系统端读取Online Redo Log或Archive Log,然后进行解析,只提取其中数据的变化如增、删、改操作,并将相关信息转换为GoldenGate自定义的中间格式存放在队列文件(trail)中。再利用传送进程将队列文件通过TCP/IP传送到目标系统。捕捉进程在每次读完log中的数据变化并在数据传送到目标系统后,会写检查点(checkpoint),记录当前完成捕捉的log位置,检查点的存在可以使捕捉进程在中止并恢复后可从检查点位置继续复制。
二、GoldenGate安装规划
目标端端(19c) | 源端(11g) | |
---|---|---|
操作系统 | Linux | Linux |
Oracle版本 | 19.15 | 11.2.0.4 |
数据库架构 | RAC | 单实例 |
数据库存储方式 | ASM | 文件系统 |
数据库字符集 | ZHS16GBk | ZHS16GBK |
OGG版本 | 19 | 19 |
OGG目录大小 | 5T | 1T |
OGG目录 | /ogg/ogg19 | /home/oracle/ogg |
参数文件目录 | /ogg/ogg19/dirprm | /home/oracle/ogg /dirprm |
trail文件目录 | /ogg/ogg19/dirdat | /home/oracle/ogg /dirdat |
三、GoldenGate安装前准备
3.1 源端打开数据库补充日志
SQL> select SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,
SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL, force_logging from v$database;
SQL> alter database add supplemental log data;
SQL>alter database add supplemental log data (primary key, unique,foreign key) columns;
SQL>alter system switch logfile;
3.2 源端打开force logging
SQL> alter database force logging;
SQL> SELECT force_logging FROM v$database;
3.3 源端配置归档模式
(1)如果数据库没有开启归档,请使用管理员用户登陆数据库,使用以下步骤开启归档,注意该步骤需要重启数据库。
SQL> alter system set log_archive_dest_1='location=/home/oracle/xx' scope=spfile;
SQL> shutdown immediate
SQL> startupmount
SQL> alter database archivelog;
SQL> alter database open;
(2)确认是否开启归档模式:
SQL>select log_mode from v$database;
3.4 两端创建GoldenGate用户
(1)创建表空间,为goldengate用户创建指定的表空间TBS_OGG,表空间并必须大于等于1000m,创建语句如下:
create tablespace TBS_OGG datafile '/home/oracle/oradata/ipmstest/ogg.dbf' size 5G autoextend on;
(2)创建用户ogguser,创建语句如下:
--创建用户:
SQL> create user ggate identified by oracle default tablespace TBS_OGG
temporary tablespace TEMP
quota unlimited on TBS_OGG;
--授权给ogg用户:
源端:
SQL> GRANT CONNECT TO ggate;
SQL> GRANT ALTER SESSION TO ggate;
SQL> GRANT CREATE SESSION TO ggate;
SQL> GRANT FLASHBACK any table TO ggate;
SQL> GRANT SELECT any table TO ggate;
SQL> GRANT RESOURCE TO ggate;
SQL> GRANT SELECT ANY DICTIONARY to ggate;
SQL> GRANT SELECT on dba_clusters to ggate;
SQL> GRANT SELECT ANY TRANSACTION to ggate;
SQL> GRANT alter any table to ggate;
SQL> GRANT execute on utl_file to ggate;
SQL> ALTER TABLE sys.seq$ ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
目标端:
SQL> GRANT CONNECT,unlimited tablespace TO ggate;
SQL> GRANT ALTER SESSION TO ggate;
SQL> GRANT CREATE SESSION TO ggate;
SQL> GRANT RESOURCE TO ggate;
SQL> GRANT SELECT ANY DICTIONARY to ggate;
SQL> GRANT SELECT any table TO ggate;
SQL> GRANT INSERT any table to ggate;
SQL> GRANT UPDATE any table to ggate;
SQL> GRANT DELETE any table to ggate;
SQL> grant exempt access policy to ggate;
SQL> grant execute on DBMS_FLASHBACK to ggate;
SQL> grant execute on utl_file to ggate;
SQL> grant alter any table to ggate;
SQL> Grant create table to ggate;
SQL> exec dbms_goldengate_auth.grant_admin_privilege('ggate');
$ cd /ogg11 (OGG所在目录)
SQL> @sequence.sql
四、GoldenGate安装
4.1 介质下载
到官网下载所对应平台的介质。
http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html
4.2 目标端添加环境变量
# vim .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
ORACLE_SID=马赛克1
ORACLE_BASE=/oracle/app/oracle
ORACLE_HOME=/oracle/app/oracle/19c/dbhome_1export PATH=$PATH:$ORACLE_HOME/bin:/ogg:.
export LD_LIBARY_PATH=$ORACLE_HOME/lib
export PATH
export NLS_LANG=american_america.ZHS16GBK
export PS1='['`hostname`':'gg']'$
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:$ORACLE_HOME/rdbms/lib:/lib:.:/ogg:$LD_LIBRARY_PATH
export CLASSPATH=$ORACLE_HOME/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/jdk/jre/lib/ext
export SHLIB_PATH=$ORACLE_HOME/lib:$SHLIB_PATH:.
umask 0022
export LIBPATH=$ORACLE_HOME/lib:.
4.3 目标端检查lib包
[oggtest:gg]$ unzip p13631344_111112_Linux-x86-64--11G.zip
[oggtest:gg]$ tar xvf fbo_ggs_Linux_x64_ora11g_64bit.tar
[oggtest:gg]$ ldd ggsci
linux-vdso.so.1 => (0x00002ab73aed9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000032c9600000)
libicui18n.so.38 => /oradata/gg/libicui18n.so.38 (0x00002ab73aefa000)
libicuuc.so.38 => /oradata/gg/libicuuc.so.38 (0x00002ab73b25b000)
libicudata.so.38 => /oradata/gg/libicudata.so.38 (0x00002ab73b594000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000032c9a00000)
libxerces-c.so.28 => /oradata/gg/libxerces-c.so.28 (0x00002ab73c26b000)
libnnz11.so => /opt/app/oracle/product/11.2.0/db_1/lib/libnnz11.so (0x00002ab73c782000)
libclntsh.so.11.1 => /opt/app/oracle/product/11.2.0/db_1/lib/libclntsh.so.11.1 (0x00002ab73cb4e000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000032dac00000)
libm.so.6 => /lib64/libm.so.6 (0x00000032c9200000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000032d6400000)
libc.so.6 => /lib64/libc.so.6 (0x00000032c8e00000)
/lib64/ld-linux-x86-64.so.2 (0x00000032c8a00000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00000032cca00000)
libaio.so.1 => /usr/lib64/libaio.so.1 (0x00002ab73f4dc000)
4.4 目标端创建OGG安装目录
$ mkidr /ogg/ogg19
给ogg安装目录授权
# chown oracle:oinstall /ogg/ogg19
安装:19c后用图形化安装,19C之前解压即可
解压:
$ unzip *.zip
$ tar -xvf *.tar
图形化:
解压后有Disk1目录
Oracle用户下,直接./runInstaller进行图形化安装。即可完成安装。
4.5 两端创建subdir
$ ggsci
$GGSCI> create subdirs
五、配置OGG进程
5.1 两端配置mgr
$ ggsci
GGSCI > edit params mgr
PORT 7809
DynamicPortList 7810-7820
PurgeOldExtracts ./dirdat/*,UseCheckpoints,MinKeepDays 3
LagReportHours 1
LagInfoMinutes 30
LagCriticalMinutes 45
GGSCI>start mgr
5.2 源端配置Extract抽取进程
添加extract进程:
GGSCI> add extract ext_xn, tranlog,THREADS 1 begin now
为extract指定本地trail文件:
GGSCI> add exttrail ./dirdat/ex, extract ext_xn, megabytes 100
GGSCI> edit params ext_xn
EXTRACT EXT_XN
SETENV (ORACLE_HOME = "/home/oracle/product/11.2.0/db_1" )
SETENV (ORACLE_SID = "马赛克")
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
REPORTCOUNT EVERY 1 MINUTES ,RATE
USERID ggate password oracle
CACHEMGR CACHESIZE 4G
EXTTRAIL ./dirdat/ex
DISCARDFILE ./dirrpt/ext_xn.dsc, APPEND, MEGABYTES 1000
FETCHOPTIONS NOUSESNAPSHOT
--TRANLOGOPTIONS LOGRETENTION DISABLED
--TRANLOGOPTIONS DBLOGREADER
DBOPTIONS ALLOWUNUSEDCOLUMN
--DDLOPTIONS ADDTRANDATA
DYNAMICRESOLUTION
Numfiles 5000
report at 1:59
DISCARDROLLOVER AT 2:00
REPORTROLLOVER AT 2:00
WARNLONGTRANS 1H, CHECKINTERVAL 10m
STATOPTIONS REPORTFETCH
sequence 马赛克用户.*;
TABLE 马赛克用户.*;
5.3 源端配置Pump进程
GGSCI> ADD EXTRACT pup_xn, EXTTRAILSOURCE ./dirdat/ex, BEGIN now
GGSCI> ADD RMTTRAIL ./dirdat/re, EXTRACT pup_xn, megabytes 100
GGSCI> edit params pup_xn
EXTRACT pup_xn
PASSTHRU
DYNAMICRESOLUTION
USERID ggate password oracle
RMTHOST IP马赛克, MGRPORT 7839
RMTTRAIL ./dirdat/re
DISCARDFILE ./dirrpt/ext_pup1.dsc, APPEND, MEGABYTES 1000
REPORTCOUNT EVERY 1 HOURS, RATE
sequence 马赛克用户.*;
TABLE 马赛克用户.*;
5.4 源端add trandata
GGGSCI> DBLOGIN USERID ggate, PASSWORD oracle
GGSCI> add trandata
GGSCI> info trandata
5.5 目标端配置复制进程
GGSCI (oggtest) 1> edit params ./GLOBAL
GGSCHEMA ggate
CHECKPOINTTABLE ggate.checkpoint
GGSCI> DBLOGIN USERID ggate, PASSWORD oracle
GGSCI> add checkpointtable ggate.checkpoint
GGSCI> add replicat rp_dm, EXTTRAIL ./dirdat/re, checkpointtable ggate.checkpoint
GGSCI > edit param rp_dm
replicat rp_dm
SETENV (ORACLE_HOME='/oracle/app/oracle/19c/dbhome_1')
SETENV (ORACLE_SID='马赛克')
SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
USERID ggate password oracle
DBOPTIONS SUPPRESSTRIGGERS
ASSUMETARGETDEFS
DISCARDFILE ./dirrpt/rp_dm.dsc, purge, megabytes 512
DDL INCLUDE MAPPED,exclude objtype 'TRIGGER' ,exclude objtype 'JOB',exclude instr 'ALTER SYNONYM'
ALLOWNOOPUPDATES
REPORTCOUNT EVERY 30 MINUTES, RATE
MAP 马赛克用户.*,TARGET 马赛克用户.*;
5.6 源端开启事务数据捕捉
GGSCI> start EXTRACT ext_xn
GGSCI> start EXTRACT pup_xn
5.7 源端升级集成抽取
-- 有压缩表的情况下需要升级为集成抽取
GGSCI> DBLOGIN USERID ggate, PASSWORD oracle
GGSCI > register extract ext_xn database
GGSCI > alter extract ext_xn,upgrade integrated tranlog
GGSCI > info ext_xn
GGSCI > info all
六、GoldenGate数据初始化
6.1 源端处理数据库长事务
OGG无法处理抽取进程启动的时间点以前的事务,因此在数据全量初始化前要清理抽取进程启动的时间点前开始的事务,否则会有数据丢失的风险。
--检查数据库长事务:
SQL> set lin 200 pagesize 500
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> col event for a30
SQL> col OSUSER for a10
SQL> col USERNAME for a10
SQL> col PROGRAM for a35
SQL> SELECT s.INST_ID,s.sid,s.serial#,s.status,s.username,START_DATE,s.LOGON_TIME,s.WAIT_TIME,
s.osuser, s.sql_id, s.program
FROM gv$session s,gv$transaction t WHERE s.INST_ID=t.INST_ID and s.saddr=t.ses_addr
order by START_DATE;
与应用和DBA确认长事物是否可处理
6.2 源端数据库导出
记录下当前SCN
SQL> select current_scn from v$database
数据泵导出:
SQL> col DIRECTORY_PATH for a50;
SQL> select * from dba_directories;
SQL> create directory dpdir as '/xx';
SQL> grant read,write on directory dpdir to public;
导出: (注意修改目录和评估空间大小)
$ expdp \"/ as sysdba\" directory=dpdir DUMPFILE=tb%U.dmp logfile=tb.log parallel=12 FLASHBACK_SCN=239174773615 schemas=用户马赛克
6.3 目标端数据库导入
目标端创建表空间,与源端一致
$ impdp \' / as sysdba\' directory=xxx dumpfile=tb%U.dmp logfile=tbimp.log parallel=6 cluster=n
七、禁用目标端JOB,触发器
禁用JOB:
SQL> select a.broken,'exec dbms_job.broken('||A.JOB||',true);', a.* from
dba_jobs a where a.log_user in ('马赛克用户');
查询触发器:
SQL> select 'alter trigger '||owner||'.'||trigger_name||' disable;' from dba_triggers
where owner in ('马赛克用户') order by status,owner;
八、目标端开启复制同步
数据库层面先开启ogg复制参数:
SQL> ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE SCOPE=BOTH;
开启目标端的复制进程,从指定的SCN开始
GGSCI> start rp_dm, aftercsn 239174773615
GGSCI> info all
九、正式割接
1、ogg源端停止应用,监听,查看进程延迟为0,停止ogg进程,切换应用地址,修改job
SQL> show parameter job_queue
SQL> alter system set job_queue_processes=0 sid='*' scope=both;
2、目标端查看ogg进程lag为0,目标端启用JOB,触发器
--启用JOB:
SQL> select a.broken,'exec dbms_job.broken('||A.JOB||',false);', a.* from
dba_jobs a where a.log_user in ('马赛克用户');
--查询触发器:
SQL> select 'alter trigger '||owner||'.'||trigger_name||' enable;' from dba_triggers
where owner in ('马赛克用户') order by status,owner;
3、业务验证
4、源端还原job
alter system set job_queue_processes=xxx sid='*' scope=both;
十、回退方案
停止两端OGG进程,应用修改原数据库IP访问地址