使用数据泵+ogg同步oracle数据

本次迁移背景:

机房要搬迁,新搭建了一套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

 点击文件名下载即可。

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

示例:

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

cd /goldengate/dirdat/database

ls -ltr

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

 

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, APPEND, MEGABYTES 1024

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 , nodbcheckpoint

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同步。

猜你喜欢

转载自blog.csdn.net/YABIGNSHI/article/details/131331135