本次迁移背景:

机房要搬迁,新搭建了一套oracle数据库,计划不停机迁移,将源端旧库的数据迁移到目标端新库里。

原本想用RMAN方式迁移,但是由于旧库是AIX系统,新库是linux系统,用RMAN迁移会有问题,于是考虑用数据泵+ogg的方式实现不停机迁移。

这里计划按用户进行导出,给大用户单独配置一个ogg进程,将多个小用户弄一批ogg进程。这里以同步其中一个用户AMI为例。

/*

有时可能需要配置同步某个库的一些表到其他库,也经常用到ogg。

*/

一 数据库配置

1.1 开启归档(源端)

源端归档必须开启,目标端不开启不影响ogg同步,但是假如数据文件损坏后,无法恢复数据库到某个时间点,建议都开启下归档日志。

#检查归档日志是否开启

archive log list;

若Automatic archival是Enabled,则表示是开启状态。若是Disabled,则需要开启:

shutdown immediate;

startup mount;

alter database archivelog;

archive log list;

alter database open;

1.2 打开数据库级别的附加日志(源端)

通过以下sql语句检查数据库附加日志的打开状况:

SQL> select SUPPLEMENTAL_LOG_DATA_MIN,supplemental_log_data_pk,supplemental_log_data_ui,

force_logging from v$database;

返回值yes为打开,pk,ui都需要打开。注意force logging不需要打开,如果已经打开没关系。

如果没有开启,请执行如下命令打开

alter database add supplemental log data;

alter database add supplemental log data (primary key, unique,foreign key) columns;

alter system switch logfile;

#再次检查

select SUPPLEMENTAL_LOG_DATA_MIN,supplemental_log_data_pk,supplemental_log_data_ui,

force_logging from v$database;

注意:

如果数据库不能打开到force logging的模式下,则nologging的表无法进行同步。如果表创建的时候使用了nologging,则需要alter table tablename logging;

1.3 创建Goldengate用户和表空间(源端和目标端)

#给ogg创建单独的表空间

create tablespace OGGTBS datafile '/u01/app/oracle/oradata/orcl/oggtb1.dbf'  size 3g;

#给ogg创建单独的管理用户

CREATE USER GOLDENGATE IDENTIFIED BY "123456" DEFAULT TABLESPACE OGGTBS TEMPORARY TABLESPACE TEMP;

GRANT CONNECT,resource TO goldengate;

GRANT ALTER ANY  TABLE TO goldengate;

GRANT ALTER SESSION TO goldengate;

GRANT CREATE SESSION TO goldengate;

GRANT FLASHBACK ANY TABLE TO goldengate;

GRANT SELECT ANY DICTIONARY TO goldengate;

GRANT SELECT ANY TABLE TO goldengate;

GRANT drop ANY TABLE TO goldengate;

Grant insert any table to goldengate;

Grant update any table to goldengate;

Grant delete any table to goldengate;

Grant create any table to goldengate;

GRANT EXECUTE ON utl_file TO goldengate;

GRANT EXECUTE ON dbms_flashback TO goldengate;

GRANT SELECT ANY TRANSACTION TO goldengate;

1.4 开启ogg复制(源端和目标端)

alter system set enable_goldengate_replication=true;

1.5 确定数据库的字符集(源端)

$ sqlplus / as sysdba
SQL> show parameter nls_language
SQL> show parameter nls_territory
SQL> select name,value$ from sys.props$ where name='NLS_CHARACTERSET';
数据库的字符集为 NLS_LANGUAGE _ NLS_TERRITORY . NLS_CHARACTERSET
例如:
NLS_LANGUAGE 为AMERICAN
NLS_TERRITORY为 AMERICA
NLS_CHARACTERSET为ZHS16GBK
则数据库的字符集为AMERICAN_AMERICA.ZHS16GBK

二 安装Goldengate软件(源端和目标端)

在源端和目标端都安装下ogg软件。

软件下载地址: https://edelivery.oracle.com/osdc/faces/SoftwareDelivery

OGG 同步数据到kafka含全量 ogg数据不同步_oracle

OGG 同步数据到kafka含全量 ogg数据不同步_数据库_02

 点击文件名下载即可。

2.1 创建目录,配置环境变量

mkdir -p /goldengate
chown -R oracle:oinstall /goldengate
su - oracle
vi .bash_profile
新增:
export OGG_DIR=/goldengate
export PATH=$OGG_DIR:$ORACLE_HOME/bin:$ODI_HOME/oracledi/client:$ODI_JAVA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$OGG_DIR:$ORACLE_HOME/lib:/usr/lib
#使修改生效
source .bash_profile

2.2 安装Goldengate软件

将安装介质包上传至此目录:/goldengate
cd /goldengate
tar xvf fbo_ggs_Linux_x64_ora11g_64bit.tar
./ggsci
#创建OGG工作目录
GGSCI (orasvr) 3> create subdirs 
cd /goldengate/dirdat
mkdir database

2.3 添加checkpoint表

添加GLOBALS参数文件,加入检查表

GGSCI (fdpdb1) 1>edit params ./GLOBALS
checkpointtable goldengate.checkpoint
GGSCI (fdpdb1) 1>dblogin userid goldengate,password 123456
GGSCI (fdpdb1) 1>add checkpointtable goldengate.checkpoint

三 Goldengate配置

3.1 配置MGR进程(源端和目标端)

3.1.1 配置参数文件

GGSCI (fdpdb1) 2> edit params mgr
新增:
port 7839
DYNAMICPORTLIST 7850-7959
AUTOSTART ER *
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 7
PURGEOLDEXTRACTS ./dirdat/database/*,usecheckpoints,minkeephours 2
USERID goldengate, PASSWORD 123456
--PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 4
--PURGEMARKERHISTORY MINKEEPDAYS 7, MAXKEEPDAYS 10
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
3.1.2 启动mgr
start mgr
info all #确保进程是running状态
3.2 在源端配置ogg
3.2.1 增加复制表的附加日志信息 
要复制哪些表,就增加哪些表的附加日志信息
$ cd /goldengate
$ ./ggsci
GGSCI> dblogin userid goldengate ,password 123456
如果是按用户导出,则 add trandata 用户.*
如果是按表导出,则add trandata 表名
--对每张表检查是否增加了附加日志配置
ggsci> info trandata 表名
3.2.2 配置抽取进程
这里抽取进程以ext开头,后面的AM为自定义字母缩写。
edit param EXT_AM
新增:
EXTRACT EXT_AM
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
SETENV (ORACLE_SID = "orcl")
USERID goldengate, PASSWORD "123456"
GETTRUNCATES
REPORTCOUNT EVERY 1 MINUTES, RATE
DISCARDFILE ./dirrpt/EXT_AM.dsc,APPEND,MEGABYTES 1024
THREADOPTIONS  MAXCOMMITPROPAGATIONDELAY 60000 IOLATENCY 60000
TRANLOGOPTIONS _DISABLESTREAMLINEDDBLOGREADER
DBOPTIONS  ALLOWUNUSEDCOLUMN
WARNLONGTRANS 2h,CHECKINTERVAL 3m
EXTTRAIL ./dirdat/database/am
FETCHOPTIONS NOUSESNAPSHOT
TRANLOGOPTIONS DBLOGREADER
GETUPDATEBEFORES
NOCOMPRESSDELETES
CACHEMGR CACHESIZE 1G
TABLE AMI.*;
3.2.3 创建抽取进程
add extract EXT_AM, tranlog, begin now, threads 1
add exttrail ./dirdat/database/am, extract EXT_AM, megabytes 1024
3.2.4 配置投递进程 
这里抽取进程以dpe开头,后面的am为自定义字母缩写。
GGSCI> edit params dpe_am
EXTRACT dpe_am
PASSTHRU
RMTHOST 172.22.204.250, MGRPORT 7839, compress
RMTTRAIL ./dirdat/database/am
TABLE AMI.*;
3.2.5 创建投递进程
add extract dpe_am, exttrailsource ./dirdat/database/am
ADD RMTTRAIL   ./dirdat/database/am, EXTRACT dpe_am, MEGABYTES 1024
3.2.6 启动抽取进程和传输进程 
GGSCI> start extract EXT_AM
GGSCI> start extract dpe_am
info all #确保进程都处于RUNNING启动状态
造几条测试数据,查看投递进程是否捕获到变更:
stats dpe_am

示例:

OGG 同步数据到kafka含全量 ogg数据不同步_OGG 同步数据到kafka含全量_03

 #在目标端检查下有没有投递过来,看看能否看到文件

cd /goldengate/dirdat/database

ls -ltr

假如能看到上面自定义的队列文件,则为正常:

OGG 同步数据到kafka含全量 ogg数据不同步_OGG 同步数据到kafka含全量_04

 

3.3 初始化数据

DML操作包括INSERT、UPDATE、DELETE、SELECT操作,而在这些操作中UPDATE、DELETE操作Redo只记录了变更的数据列以及行ID(ROWID),GoldenGate抽取数据后将其转换为自己的格式发送都目标端。在同步开始前目标端没有初始化数据(目标端为空数据),那么事物产生的UPDATE、DELETE DML操作发送到目标端,目标端GoldenGate Replicat进程会因为找不到数据而报错从而导致Replicat进程崩溃停止(ABENDED),所以这就需要我们在同步前初始化数据,初始化完后再同步,这样大大降低错误率。同步数据的方式可以通过DBLINK、EXP/IMP、SQLLDR或者表空间迁移等方式同步。

3.3.1 expdp备份源端数据目标端配置

3.3.1.1 在源端查询SCN号
SELECT a."CURRENT_SCN" FROM v$database a ;  #记录查出来的scn,这里是1343313
3.3.1.2 导出时加上SCN号
vi expdp_ami_alldata_20230621.par
新增:
userid='/ as sysdba'
directory=DMP
dumpfile=expdp_ami_alldata_20230621_%U.dmp
logfile=expdp_ami_alldata_20230621.log
schemas=ami
compression=ALL
CLUSTER=N
parallel=8
exclude=statistics
FLASHBACK_SCN=1343313  #上面查出来的scn,表示从这个位置开始导出
#开始导出
nohup expdp parfile=expdp_ami_alldata_20230621.par >nohup_expdp_ami_alldata_20230621.log &
tail -100f  nohup_expdp_ami_alldata_20230621.log
检查日志是否有报错。
3.3.2 将备份文件拷贝到目标端
3.3.2 在目标端导入数据
vi impdp_ami_alldata_20230621.par
新增:
userid='/ as sysdba'
directory=dmp
dumpfile=expdp_ami_alldata_20230621_%u.dmp
logfile=impdp_ami_alldata_20230621.log
table_exists_action=replace
cluster=n
parallel=8
#导入
nohup impdp parfile=impdp_ami_alldata_20230621.par >nohup_impdp_ami_alldata_20230621.log &
tail -100f  nohup_impdp_ami_alldata_20230621.log
检查日志是否有报错。
3.4 在目标端配置复制进程
3.4.1 配置复制进程
edit param rep_am
新增如下内容:
REPLICAT rep_am
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
SETENV (ORACLE_SID = "orcl")
USERID goldengate, PASSWORD 123456
SQLEXEC "ALTER SESSION SET CONSTRAINTS=DEFERRED"
REPORT AT 01:59
REPORTCOUNT EVERY 30 MINUTES, RATE
REPERROR DEFAULT, ABEND
HANDLECOLLISIONS
--DBOPTIONS_NOAUTOMATICSEQUENCEFLUSH
batchsql BATCHESPERQUEUE 100, OPSPERBATCH 8000
--GROUPTRANSOPS 2000
--MAXTRANSOPS 500
assumetargetdefs
DISCARDFILE ./dirrpt/rep_am.dsc,
DISCARDROLLOVER AT 02:30
GETTRUNCATES
ALLOWNOOPUPDATES
---SOURCEDEFS ./dirdef/cj.def
assumetargetdefs
map                ami.*  ,target                ami.*;
/*
假如是要同步多个表,则这样写:
map 用户.表1,target 用户.表1;
map 用户.表2,target 用户.表2;
*/
3.4.2 添加复制进程
ADD REPLICAT rep_am, EXTTRAIL ./dirdat/database/am
3.4.3 启动目标端复制进程
start replicat rep_am,aftercsn 上面查的scn
示例:
start replicat rep_am,aftercsn 1343313
info all  #检查,确保命令是running状态

3.5 测试数据同步

3.6 期间遇到的问题

快照过旧

调大undo_retention:

若还是不行,则将大表找出来,单独配置大表的ogg同步。