GoldenGate数据迁移的问题总结(二)(r10笔记第85天)
昨天使用GoldenGate同步数据,数据量玩得有些大了。最后发现很多小问题变得更加严峻,比如空间问题。
而且由于没有更多的经验,导致这个问题被我引入了另外一个极端。
查看目标端的空间,一个临时创建的目录一下子满了,得清理一下空间了。
[oracle@newtest ogg_10g]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 9.9G 9.4G 17M 100% /
停止了目标端的replicat进程。
> stop rep_test
Sending STOP request to REPLICAT REP_TEST ..
这个时候注意到源端的日志输出了下面的信息,已经做了Rolling over的操作
2016-11-16 17:27:58 INFO OGG-01026 Oracle GoldenGate Capture for Oracle, ext_tlbb.prm: Rolling over remote file /export/home/oracle/ogg/ogg_10g/dirdat/tl000068.
2016-11-16 17:28:31 INFO OGG-01026 Oracle GoldenGate Capture for Oracle, ext_tlbb.prm: Rolling over remote file /export/home/oracle/ogg/ogg_10g/dirdat/tl000069.
2016-11-16 17:29:05 INFO OGG-01026 Oracle GoldenGate Capture for Oracle, ext_tlbb.prm: Rolling over remote file /export/home/oracle/ogg/ogg_10g/dirdat/tl000070.
为了尽快清理目标端的trail文件,我查看了下help的输出,发现一个cleanup的命令,这个应该不错,试一试吧。
> cleanup replicat rep_test
Cleanup completed.
然后查看实际上目标服务器上压根没有清理掉这些trail文件,而稍后又运行了下面的几个命令。
delete exttrail /export/home/oracle/ogg/ogg_10g/dirdat/tl000051
delete exttrail /export/home/oracle/ogg/ogg_10g/dirdat/tl
没有任何的提示,而且服务器端空间还是没有释放。
-rw-rw-rw- 1 oracle oinstall 99999876 Nov 16 17:19 /export/home/oracle/ogg/ogg_10g/dirdat/tl000051
这可让我很疑惑了。干脆先停了试试,发现停进程失败。
> stop rep_test
Sending STOP request to REPLICAT REP_TLBB ...
STOP request pending end-of-transaction (765395 records so far)..
以上的操作都是测试环境的测试所用,所以没有太大的心理负担,但是发现问题似乎很难解决了。
从下面的额信息可以看出,似乎是在写48号trail文件的时候hang住了,也不处理任何数据。
> send rep_test, status
Sending STATUS request to REPLICAT REP_TEST ...
Current status: At EOF
Sequence #: 48
RBA: 99999876
6158834 records in current transaction
PENDING
STOP request pending end-of-transaction (6158834 records so far)
最后我使用kill的方式才终于停止了进程。
> kill replicat rep_test
Sending KILL request to MANAGER ...
Killed process (84166) for REPLICAT REP_TEST
然后再次启动的时候,发现目标端的trail文件出现了一些变化,进程启动失败了,会自动终止。
2016-11-16 18:41:24 INFO OGG-00996 Oracle GoldenGate Delivery for Oracle, rep_tlbb.prm: REPLICAT REP_TLBB started.
2016-11-16 18:41:24 ERROR OGG-01091 Oracle GoldenGate Delivery for Oracle, rep_tlbb.prm: Unable to open file "/export/home/oracle/ogg/ogg_10g/dirdat/tl000022" (error 2, No such file or directory).
2016-11-16 18:41:24 ERROR OGG-01668 Oracle GoldenGate Delivery for Oracle, rep_tlbb.prm: PROCESS ABENDING.
纳闷的是trail文件指向了22号文件。而前面的trail文件已经被我删除了。
这个问题这个时候该怎么办?而更让人奇怪的trail文件开始疯狂复制,而源端的trail文件id最大还是83,目标端已经到了100多。
2016-11-16 18:54:27 INFO OGG-01735 Oracle GoldenGate Collector for Oracle: Synchronizing /export/home/oracle/ogg/ogg_10g/dirdat/tl000168 to disk.
反复尝试,折腾了不少时间,想这下只能是重新复制一遍了,如果在数据量很大的情况下,这真是一次失败的数据复制。
不过今天看了下,想还有没有救,我试了下面的方法,可能算是一个土办法,仅供借鉴。
我在目标端的目录下删除了应用进程的trail文件,从源端重新拷贝到了目标端。
在目标端开启应用进程,不过SEQNO,RBA得改改。
alter replicat rep_TEST, EXTSEQNO 22 EXTRBA 0
这样一来,rep看似就有了一些反应。
2016-11-17 12:00:55 INFO OGG-00996 Oracle GoldenGate Delivery for Oracle, rep_tlbb.prm: REPLICAT REP_TLBB started.
2016-11-17 12:01:09 INFO OGG-01020 Oracle GoldenGate Delivery for Oracle, rep_tlbb.prm: Processed extract process RESTART_ABEN
D record at seq 23, rba 1037 (aborted 0 records).
查看应用进程的情况,已经可以看到大事务的数据处理了。
> send rep_test,status
Sending STATUS request to REPLICAT REP_TLBB ...
Current status: Processing data
Sequence #: 37
RBA: 45790084
3352129 records in current transaction
这个过程持续了些时间,同步完成后,数据是同步了过来,已经应用到了83号trail文件,我想这个问题应该是告一段落了,但是当我在源端继续修改一些数据,发现目标端没有同步过来。看来我的那个小伎俩还是有一些限制,而我在源端停止了投递进程后,重启就失败了。
2016-11-17 15:28:34 ERROR OGG-01496 Oracle GoldenGate Capture for Oracle, dp_tlbb.prm: Failed to open target trail file /export
/home/oracle/ogg/ogg_10g/dirdat/tl000169, at RBA 84770994.
2016-11-17 15:28:34 ERROR OGG-01668 Oracle GoldenGate Capture for Oracle, dp_tlbb.prm: PROCESS ABENDING.
不过这个问题通过我对OGG的一些了解似乎还是有一些门道。
3> alter extract DP_TEST ETROLLOVER
4> alter DP_TEST extseqno 83,extrba 0
这样源端的投递进程就可以启动了,而问题是目标端的应用进程又开始报错了,,这个过程就是查看ggserr.log的信息,看到是170的trail,那么我们就修改为170号trail文件。
alter REPLICAT rep_TLBB,extseqno 170,extrba 0
问题的原因是什么呢,我们来查看源端的投递进程就明白了。源端和目标端是有read position和write position。
> send dp_test,status
Sending STATUS request to EXTRACT DP_TEST ...
EXTRACT DP_TEST (PID 8302)
Current status: Recovery complete: At EOF
Current read position:
Sequence #: 83
RBA: 84769935
Timestamp: 2016-11-17 15:25:38.000000
Extract Trail: /export/home/oracle/ogg/ogg_10g/dirdat/tl
Current write position:
Sequence #: 170
RBA: 84769847
Timestamp: 2016-11-17 15:43:38.610104
Extract Trail: /export/home/oracle/ogg/ogg_10g/dirdat/tl
而对于OGG的数据同步有些过程怎么理解呢。其实和Oracle中的物化视图日志有一些相似,物化视图的增量刷新是不完全依赖于物化视图日志,而在同步的过程中是会参考已有的数据,其中一个基准就是rowid.
比如下面的语句。
delete from SWD_QDRAWCHECK where rownum<2;
其实映射到目标端就是这样的形式:
fqgms90ybsvnk DELETE FROM "TEST"."SWD_QDRAWCHECK" WHERE "ID" = :b0
这个过程怎么去源端印证呢。
我们做了一个delete操作,这些变更就写入了最新的trail文件,那么我们使用strings来查看里面的信息。
AAACe8AAEAAEf5jAEB
TEST.SWD_QDRAWCHECK
8876366
8876242
...
TEST.SWD_DRAWCN
AAACd3AAEAACk4iAAG
16385776
我们根据rowid来查看,可以看到数据是依旧于ROWID定位到的,而目标端肯定是没有这个ROWID对应,这就需要传入一个需要的ID值,比如唯一性主键的值等。
> select * from TEST.SWD_QDRAWCHECK where rowid='AAACe8AAEAAEf5jAEB';
ID QDETAILID DRAWCNID
---------- ---------- ----------
8876362 8876233 11171791
整个过程虽然走了不少的弯路,但是反复尝试,仔细比对,还是找到了一些门道,希望继续整理,保证信息的准确性,,能够帮助到更多需要的朋友。
今天的笔记到此告一段落,先准备去赶航班了,下一站会到达魔都上海去感受一场技术盛宴,写笔记的老传统依旧不变。
- TensorFlow ML cookbook 第一章7、8节 实现激活功能和使用数据源
- Go语言struct类型详解
- spark1.x升级spark2如何升级及需要考虑的问题
- 使用 kubeadm 创建一个 kubernetes 集群
- Oracle 12c 多租户专题|CDB元数据内幕
- 深入分析golang多值返回以及闭包的实现
- Hadoop3.0扩展Yarn资源模型详解2:资源Profiles说明
- hdu------(1525)Euclid's Game(博弈决策树)
- Go语言指针访问结构体的方法
- Spring Boot & Spring Cloud 应用内存管理
- hdu----(1849)Rabbit and Grass(简单的尼姆博弈)
- 10分钟让你明白MySQL是如何利用索引的
- 扩展Yarn资源模型详解1
- hdu-------(1848)Fibonacci again and again(sg函数版的尼姆博弈)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Xinetd服务的安装与配置详解
- redis实战第七篇 使用redis工具(redis-cli)搭建redis cluster
- 使用ROS2机器人操作系统进行多机器人编程技术实践(Multi-Robot Programming Via ROS2 )
- 自动化运维实践 | Ansible playbook重用
- 手把手教你打造高效的 Kubernetes 命令行终端
- docker save load export import的区别
- 使用ABAC控制数据访问
- linux 压力测试工具之ab
- 什么是Python Wheels?为什么要关心它?
- Nginx fastcgi_cache权威指南
- 玩转dockerfile
- redis实战第六篇 手动创建redis cluster
- docker容器入门最佳教程
- redis实战第五篇 jedis 连接 redis sentinel详解
- redis实战第四篇 手动容灾故障转移记录