参考 https://blog.csdn.net/orabing/article/details/79932093
写在前面
|
源端 |
目标端 | |
|
ip |
192.168.18.70 |
192.168.18.60 |
|
操作系统 |
oracle linux 6.5 |
oracle linux 6.5 |
|
oracle 版本 |
11.2.0.4.0 |
11.2.0.4.0 |
|
实例名 |
test |
test |
|
安装用户 |
oracle |
oracle |
|
OGG 管理用户 |
ogg |
ogg |
|
待同步的用户 |
scott |
scott |
1 前期准备(源 + 目)
1、 开归档 先创建个归档目录 # mkdir /arch # chown oracle:dba /arch -R SQL> show parameter arch; SQL> alter system set log_archive_dest_1='location=/arch'; SQL> shutdown immediate ; SQL> startup mount ; SQL> alter database archivelog; SQL> atler database open; 2 、设置参数( ogg 版本是 12c 以上都需要设置) SQL> alter system set enable_goldengate_replication=true scope=both; 3 、打开数据库最小附加日志 SQL> select supplemental_log_data_min from v$database; 结果为NO ,表示没有打开 alter database add supplemental log data; alter database add supplemental log data (primary key, unique,foreign key) columns; alter system switch logfile; -- 如果没有变成 YES ,也可切换日志 4、 增加 UNDO_RETENTION SQL> alter system set =86400; 5 、开启数据库强制日志模式 alter database force logging;
2 创建 ogg 管理用户 ( 源 + 目 )
1 、 创建OGG 单独使用的表空间 : SQL>create tablespace ogg_tbs datafile '/oradata/test / ogg_ data01.dbf ' size 20m autoextend off; 2 、创建 ogg 管理用户 SQL>create user ogg identified by 123456 default tablespace ogg_tbs; 3、 授权 grant connect, resource,CREATE SESSION to ogg; grant dba to ogg;
|
grant connect,resource to ogg; grant SELECT ANY TABLE to ogg; grant FLASHBACK ANY TABLE to ogg; grant SELECT ANY DICTIONARY to ogg; grant UPDATE ANY TABLE to ogg; grant DROP ANY TABLE to ogg; grant DELETE ANY TABLE to ogg; grant INSERT ANY TABLE to ogg; grant UNLIMITED TABLESPACE to ogg; grant create table,create sequence to ogg; grant execute on utl_file to ogg; |
3 安装 ogg
3.1 上传文件(源 + 目)
1、 上传软件到/u01/ogg # mkdir ogg 通过ftp 上传 # chown oracle:dba /ogg -R # su - oracle $ cd /u01/ogg $ unzip V100692-01.zip
3.2 环境变量(源 + 目)
su - oracle vi .bash_profile
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export OGG_HOME=/u01/ogg
export PATH=$OGG_HOME:$PATH
生效
source .bash_profile
3.3 安装 ogg (源 + 目)
$ cd /u01/ogg/fbo_ggs_Linux_x64_shiphome/Disk1 $ ./runInstaller 如果卡主,用oracle 用户直接连接 xshell 1 选择数据库版本( 11g ) 2 选择 ogg 的安装目录 yes 3 安装 yes 4 安装成功 5 检查 /u01/ogg 目录下是否有 dirprm , dirdef 等目录没有的话要添加 $ ggsci GGSCI (db) 3> create subdirs
4 OGG 配置
1 证书及抽取表配置
------ 源端 ------ 创建OGG 认证证书文件用于隐藏口令登录 cd /u01/ogg ./ggsci GGSCI > add credentialstore GGSCI > alter credentialstore add user ogg,password 123456 alias ogg1 --ogg1 是 ogg 的别名 测试登录 GGSCI (ogg1) 2> dblogin useridalias ogg1 配置 抽取的表 加入trandata GGSCI > add trandata s cott . JIA_TAB -- 可通过 schema.* 代表添加该用户下所有表 查看抽取的表信息 GGSCI > info trandata s cott . JIA_TAB 添加检查点表 GGSCI >add checkpointtable ogg.checkpoint ------ 目标端 ------ cd /u01/ogg ./ggsci GGSCI > add credentialstore GGSCI > alter credentialstore add user ogg,password 123456 alias ogg2 --ogg2 是 ogg 的别名 GGSCI (ogg1) 2> dblogin useridalias ogg2 添加检查点表 GGSCI > add checkpointtable ogg.chkpt -- 和源端的检查点名不一样 注:强列建议为每个Replicat 进程创建 checkpointtable 。
2 配置 MGR 进程 (源+ 目标)
1 配置全局 GGSCI> edit params ./GLOBALS ENABLEMONITORING CHECKPOINTTABLE ogg.checkpoint GGSCHEMA ogg 2 mgr GGSCI>edit param mgr PORT 7809 DYNAMICPORTLIST 7810-7820 3 管理 mgr 进程命令 GGSCI> start MGR GGSCI> info MGR -- 或者查看全部进程 info all GGSCI> stop MGR
3 配置 DDL 支持(源)
|
登陆 ggs |
GGSCI> dblogin useridalias ogg1 |
|
执行配置脚本 |
$ cd $OGG_HOME -- 一定要去家目录 $ sqlplus "/as sysdba" SQL> @marker_setup.sql -- 出现提示的时候,输入 ogg SQL> @ddl_setup.sql SQL> @role_setup.sql |
|
授权 |
Grant the role to all GoldenGate Extract users; ----- 根据提示执行赋权操作 SQL> @ddl_enable.sql |
要提高DDL 触发器的性能,可以通过 ddl_pin 脚本,该脚本会将触发器使用的包加载到内存,以此提高效率。该脚本执行时需要引用 dbms_shared_pool 系统包,因此在使用 ddl_pin 脚本前需要确保 dbms_shared_pool 可用。
|
检查 dbmspool |
SQL> @?/rdbms/admin/dbmspool.sql |
|
执行脚本 |
SQL> @ddl_pin ogg |
如果在执行脚本中出错,执行下面的步骤重新做,首先把所有GG 进程停掉,包括 mgr 进程
|
停止进程 |
GGSCI> stop * GGSCI> stop mgr |
|
停止进程 |
GGSCI> stop * GGSCI> stop mgr |
|
删除 ddl 配置 |
SQL> @ddl_disable.sql -- 首先使 DDL 触发器失效 SQL> @ddl_remove.sql SQL> @marker_remove.sql |
4 配置 extract 进程(源)
Extract 运行在数据库源端,负责从源端数据表或者日志中捕获数据。 Extract 的作用可以按照表来时间来划分: 初始时间装载阶段:在初始数据装载阶段,Extract 进程直接从源端的数据表中抽取数据。 同步变化捕获阶段:初始数据同步完成以后,Extract 进程负责捕获源端数据的变化 (DML 和 DDL) 1 添加 extract 进程 GGSCI > add extract ext_y ,tranlog,begin now 解释: ext_y 是进程名,一般是 ext 开头,后面可以加 1-2 为字符标识 tranlog 表示要抽取数据库日志 begin now 表示从当前时间开始抽取
2
本地队列(trail 文件落地在 /u01/ogg/dirdat/ 下,并且以 la 开头,用 ext_y 进程)
exttrail /dirdat/ la , extract ext_y
add exttrail /u01/ogg/dirdat/ la , extract ext_y , THREADS 2 (RAC 环境使用 )
3 配置 extract 参数
edit params ext_y
|
EXTRACT ext_y setenv (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) SETENV (ORACLE_SID = test) SETENV (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/db_1) USERIDALIAS ogg1 exttrail /u01/ogg/dirdat/la
DDL INCLUDE ALL ---DDL 时开启 DYNAMICRESOLUTION
LOGALLSUPCOLS NOCOMPRESSUPDATES UPDATERECORDFORMAT FULL REPORTCOUNT EVERY 2 SECONDS, RATE
table scott.JIA_TAB;
|
4 启动 extract 进程
GGSCI > start extract ext_y
5 配置 data pump 投递进程(源)
Pump进程 pump进程运行在数据库源端,其作用是将源端产生的本地trail文件,把trail以数据块的形式通过TCP/IP 协议发送到目标端,这通常也是推荐的方式。
注意:无论是否使用pump进程,在目标端都会生成trail文件
1 、
配置传输进程(dpea 将本地生成 la 文件)
add extract dpea , exttrailsource /u01/ogg/dirdat/ la
dpea 进程传输到目标端( 192.168.18.60 ) /u01/ogg/dirdat/ 并且以 ra 开头,使数据落地
add rmttrail /u01/ogg/dirdat/ ra , extract dpea
使用 Data Pump 的好处是: ( 就是上面的dpea,名字叫dpea ) ⒈ 如果目标端或者网络失败,源端的 Extract 进程不会意外终止 ⒉ 需要在不同的阶段实现数据的过滤或者转换 ⒊ 多个源数据库复制到数据中心 ⒋ 数据需要复制到多个目标数据库
2 、配置参数
edit params dpea
|
EXTRACT dpea setenv (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) passthru rmthost 192.168.18.60, mgrport 7809, compress -- 目标端 ip rmttrail /u01/ogg/dirdat/ra dynamicresolution DDL INCLUDE ALL ---DDL 时开启
table scott.JIA_TAB;
|
3 、管理 投递进程
GGSCI > start extract dpea –启动 dpea 进程
GGSCI > stop extract dpea –关闭 dpea 进程
GGSCI > kill extract dpea -- 强制停止 dpea 进程
GGSCI > info dpea -- 查看进程参数信息
GGSCI > stats dpea -- 查看进程运行信息
GGSCI > view report dpea --- 查看运行报告
GGSCI > start ext * –启动所有 exttact 进程
验证
info all
注意:此时保证目标端mgr 已经启动,否则 dpea 进程无法启动
查看错误日志
more ggserr.log | grep ERROR
6 创建Replicat 进程 ( 目标 )
Replicat 进程,通常我们也把它叫做应用进程。可以简写 repa ,运行在目标端,是数据传递的最后一站,负责读取目标端 trail 文件中的内容,并将其解析为 DML 或 DDL 语句,然后应用到目标数据库中。
和Extract 进程一样, Replicat 也有其内部的 checkpoint 机制,保证重启后可以从上次记录的位置开始恢复而无数据损失的风险。
Replicat 进程的状态包括 Stopped( 正常停止 ),Starting( 正在启动 ) , Running( 正在运行 ) , Abended(Abnomal End 的缩写,标示异常结束 ) 。 1 添加进程,指定 chkckpoint 进程 GGSCI > add replicat rep_m ,exttrail ./dirdat/ ra , checkpointtable ogg.chkpt GGSCI > edit params rep_m
|
replicat rep _m setenv (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) SETENV (ORACLE_SID = test) USERIDALIAS ogg2 reperror default, abend discardfile /u01/ogg /dirout/rep _m . dsc , append assumetargetdefs dynamicresolution
ddl include all --- 开启 ddl 同步,还需要配合执行 @ddl 脚本 ddlerror default ignore retryop maxretries 3 retrydelay 5 --- 开启 ddl 同步 map scott . JIA_TAB , target scott . JIA_TAB ; |
2 启动 repa 进程,这里启动只是查看进程是否能启动,真正启动 repa 在后面,要加 scn 号
GGSCI > start extract rep _m
7 管理进程的命令
只需要在命令后面加上进程名就可以了。以ext_y 举例
GGSCI > start ext_y –启动 extract 进程
GGSCI > stop ext_y –关闭 extract 进程
GGSCI > kill ext_y -- 强制停止 extract 进程
GGSCI > info ext_y -- 查看进程参数信息
GGSCI > stats ext_y -- 查看进程运行信息
GGSCI > view report ext_y --- 查看运行报告
5 初始化数据
1 确保事物已提交
|
select sess.sid , sess.serial# , sess.event , sess.sql_id , sess.status from v$session sess , v$transaction trans where sess.SADDR = trans.SES_ADDR and trans.START_TIME < '2020/10/30 14:00:00' ; |
|
select sess.sid , sess.serial# , sess.event , sess.sql_id , sess.status , lo.OBJECT_ID , b.OBJECT_NAME from v$session sess , v$transaction trans , v$locked_object lo , dba_objects b where sess.SADDR = trans.SES_ADDR and trans.START_TIME < '2020/10/30 14:00:00' and lo.XIDUSN = trans.XIDUSN and lo.XIDSLOT = trans.XIDSLOT and lo.xidsqn = trans.xidsqn and b.OBJECT_ID = lo.OBJECT_ID |
确保数据库事物的开始时间都在抽取进程创建之后。
注: 如果查询结果不为空,我们向相关人员询问,确保session相关的操作都已经提交
2 源端使用expdp 指定 SCN 方式导出数据
1 查看当前 scn
select name,current_scn from v$database
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL; 1733334 (我是用的第一个结果) 2 创建路径并授权 S QL>create directory d2 as '/home/oracle/rman'; SQL> grant read,write on directory d2 to public; 3 导出数据 - 一定要指定scn
$ expdp scott/123456 directory=d2 dumpfile= 1 .dmp tables=scott.jia_tab flashback_scn = 1733334 logfile=a.log ;
传输
scp table.dmp oracle@192.168.18.60:/home/oracle/rman
3 目标 端 导入
$impdp scott/123456 directory=d2 dumpfile=table.dmp table_exists_action=replace logfile=a.log; 收集统计信息
SQL> exec DBMS_STATS.GATHER_SCHEMA_STATS (OWNNAME => ' SCOTT ',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO', DEGREE =>12, cascade => TRUE, options => 'GATHER');
4 对比数据
|
以 schema 为单位导, 常用 select owner,OBJECT_TYPE,status,count(*) from dba_objects where owner IN (&U) group by owner,OBJECT_TYPE,status order by owner,OBJECT_TYPE,status; 输入变量 U='SCOTT' |
|
本次试验以表为单位 select count(*) from scott.jia_tab |
5 禁用的trigger 和外键约束 ( 目标 )
把下面sql 查出来的结果,执行下
|
select 'alter table '||owner||'.'||table_name||' disable constraint '||constraint_name||';' from dba_constraints where constraint_type in ('R') and STATUS='ENABLED' and owner IN (&U) order by status,owner; 输入变量 U='SCOTT' |
检查外键约束 |
|
select 'alter trigger '||owner||'.'||trigger_name||' disable;' from dba_triggers where owner IN (&U) and status='ENABLED' order by status,owner; 输入变量 U='SCOTT' |
检查触发器 |
6 开启 Replicat 进程(目标)
start replicat rep _ m , aftercsn 1733334
6 测试
1 在源端插入几条数据 insert into jia_tab select * from emp where deptno=20 2 在目标端查看 select * from jia_tab
