增量数据丢失的原因分析(三)(r8笔记第91天)
今天开发的同事找到我说,他们发现一个应用今天应该会同步过来一部分数据,但是今天却没有,所以想让我帮忙看看到底是怎么回事。
对于这类需求也算是轻门熟路,不光维护管理数据,补数据也在行。看来今天又不可避免要修复数据了,不过还是得明白原因是什么。
首先查看了近几天的数据同步情况,时间范围是5月1日~5月6日,但是查看却唯独缺少了5月5日的数据,因为是计算前一天的数据变化情况,所以5月6日应该会同步5月5日的数据变化。
TRUNC(UPDATE_DATE) COUNT(*)
------------------- ----------
2016-05-02 00:00:00 6724
2016-05-03 00:00:00 6198
2016-05-04 00:00:00 5772
2016-05-01 00:00:00 7268
至于数据为什么没有同步,确实有些奇怪,这个时候先来理一理数据同步的原理,其实这个库是一个OLAP的库,会从OLTP的库中抓取变化的数据情况更新到OLAP的统计库中。而同步的驱动方式是通过scheduler的方式来完成,每天凌晨会定时同步。
使用下面的方式来查看最近10天的scheduler job的运行情况,发现只有今天运行失败。
select log_date,owner,job_name,status,ADDITIONAL_INFO from DBA_SCHEDULER_JOB_LOG where log_date>sysdate-10 and owner='TEST' and job_name like '%USER%' ORDER BY 1 ;
LOG_DATE OWNER JOB_NAME STATUS
----------------------------------- -------------------------- -----------
27-APR-16 03.28.14.044366 AM +08:00 TEST SYN_USERCENTER SUCCEEDED
。。。
05-MAY-16 03.28.32.538013 AM +08:00 TEST SYN_USERCENTER SUCCEEDED
06-MAY-16 03.28.23.809575 AM +08:00 TEST SYN_USERCENTER FAILED
那么问题就看起来有了方向,是由于scheduler job失败导致的数据同步失败。
到底是什么原因导致的呢,可以查看一个视图来得到一些相关的信息。
select log_date,owner,job_name,status,ADDITIONAL_INFO from DBA_SCHEDULER_JOB_RUN_DETAILS where log_date>sysdate-10 and owner='TEST' and job_name like '%USER%' ORDER BY 1 ;
得到的信息是一个ORA错误:ORA-12170: TNS:Connect timeout occurred
这个时候使用tnsping的方式来连接那个目标库,发现没有了响应,超时退出。
而这个问题明白了原因之后,依然很蹊跷,这个环境一直没有动过,也没有做过系统层面的网络变化,到底是什么原因导致的呢。
对于这个问题,从数据库层面,系统层面还真分析不出来什么特别之处。所以就求助网络组的同学。
目前是10.11.133.128的服务器去telnet 10.11.65.112的服务器,但是通过几次简单的测试,在65.112端看到133.128的ip却会有多种变化。有时候是10.11.133.128,有时候是10.11.134.129
# tcpdump -i eth0 host 10.11.133.128 and port 1528 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:49:57.314010 IP 10.11.133.128.51355 > 10.11.65.112.1528: Flags [F.], seq 1003407519, ack 3632754879, win 49640, length 0
16:49:57.314095 IP 10.11.65.112.1528 > 10.11.133.128.51355: Flags [F.], seq 1, ack 1, win 115, length 0
16:49:57.316199 IP 10.11.133.128.51355 > 10.11.65.112.1528: Flags [.], ack 2, win 49640, length 0
16:49:59.098833 IP 10.11.133.128.51382 > 10.11.65.112.1528: Flags [S], seq 1012926596, win 49640, options [mss 1460,nop,wscale 0,nop,nop,sackOK], length 0
16:49:59.098877 IP 10.11.65.112.1528 > 10.11.133.128.51382: Flags [S.], seq 233530546, ack 1012926597, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:49:59.101376 IP 10.11.133.128.51382 > 10.11.65.112.1528: Flags [.], ack 1, win 49640, length 0
# tcpdump -i eth0 host 10.11.134.129 and port 1528 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:41:25.055791 IP 10.11.134.129.50758 > 10.11.65.112.1528: Flags [S], seq 778963631, win 49640, options [mss 1460,nop,wscale 0,nop,nop,sackOK], length 0
16:41:25.055848 IP 10.11.65.112.1528 > 10.11.134.129.50758: Flags [S.], seq 3056729568, ack 778963632, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:41:30.126448 IP 10.11.65.112.1528 > 10.11.134.129.50758: Flags [S.], seq 3056729568, ack 778963632, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:41:30.211652 IP 10.11.134.129.50758 > 10.11.65.112.1528: Flags [R], seq 778963632, win 49640, length 0
对于这种情况,查看了133.128的网卡配置情况,e1000g0存在一个漂移的IP,即10.11.133.128,而另外一个IP 10.11.134.129则来自一个新的网卡e1000g1
e1000g0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
inet 10.11.133.129 netmask ffffff00 broadcast 10.11.133.255
e1000g0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
inet 10.11.133.128 netmask ffffff00 broadcast 10.11.133.255
e1000g1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 4
inet 10.11.134.129 netmask ffffff00 broadcast 10.11.134.255
查看路由的信息,可以看到目前是存在两个默认路由,分别从133,134网段进行过滤。
$netstat -rn
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ---------- ---------
default 10.11.133.254 UG 1 28179
default 10.11.134.254 UG 1 28129
10.11.133.0 10.11.133.128 U 1 7961 e1000g0:1
10.11.133.0 10.11.133.129 UG 1 0
10.11.134.0 10.11.134.129 U 1 1308 e1000g1
224.0.0.0 10.11.133.129 U 1 0 e1000g0
而这个也是目前导致测试中发现源端的IP一会是133.128,一会又是134.129
当然还有更多的网络内容我也没接受得了。不过可以看出网络这块还是存在着一小窍门。
最终在65.112开通了这两个IP的防火墙之后,看起来问题是初步解决了,后续还需要更多的验证。
而留给我的就是修复数据,这个还是需要结合里面的业务来根据需求来补充那部分没有同步的数据。
- Android 之dragger使用
- Android图像处理 - 高斯模糊的原理及实现
- 走进科学:银行ATM机真的安全吗?
- 漏洞科普:对于XSS和CSRF你究竟了解多少
- 巧用Live Template,不仅能提升AS开发效率,还能装逼
- 黑了前男友网站:从找SQL注入到后台权限
- 扩展CakePHP的CacheHelper以使用缓存引擎
- 走进科学:酒店保险箱真的保险么?
- 利用xmlrpc.php对WordPress进行暴力破解攻击
- .Net中如何操作IIS
- Havex:以工控设备为狩猎目标的恶意软件
- 大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践
- 浅谈php安全
- 在统一的分析平台上构建复杂的数据管道
- 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 数组属性和方法
- centos6.5服务器安装Nginx设置服务和开机自启的方法
- linux系统挂载数据盘的方法(视频图文教程)
- CentOS7 Docker Nginx部署及运行详解
- linux下安装memcached_动力节点Java学院整理
- OneinStack一键安装PHP/JAVA/HHVM和超详细的VPS手动安装LNMP的方法
- RTSP协议视频平台EasyNVR如何将静态广告位修改为动态广告位?
- keeplive+mysql+drbd高可用架构安装步骤
- IP摄像头RTSP协议视频平台EasyNVR录像列表没有按照开始时间倒序排序的问题修复
- leetcode哈希表之两数之和
- Linux系统下Tomcat8启动速度很慢的解决方法
- Linux下查看binlog文件创建时间的命令
- Linux下修改文件权限(所有权)
- Sticks(UVA - 307)【DFS+剪枝】
- Linux CentOS服务器搭建与初始化配置教程
- Centos6.9安装vsftpd并配置多用户的方法