集成手机平台待办数据失败问题跟踪和处理
Mongodb
、
Oracle
、
SQLServer
场景:
公司的集成手机平台后台的核心数据库采用的Mongodb
读写分离架构,所有异构系统平台
(
财务、ERP
、计划
……)(
对应的数据库ORACLE
、
SQLServer
、
Mysql ……)
流程待办会实时推送到Mongodb
库里,实现所有系统手机端移动审批。
问题:
各个系统供应商对接集成手机平台系统水平参差不齐,经常出现个别系统待办未推到集成手机平台或待办转已办失败的问题;
解决方案:
各个系统供应商优化接口周期长,在优化完成之前,需要有手动处理机制,即出现待办未推送或待办转已办失败问题,可以及时知道并及时手动处理。
一:待办出现问题时,第一时间向相关系统管理员发送预警邮件,及时手动干预,避免问题升级;
二:监控大屏实时展示失败的待办信息;
三:当失败的待办数量很庞大,批量修复并定期集中处理历史失败的待办;
一:待办出现问题时,第一时间向相关系统管理员发送预警邮件,及时手动干预,避免问题升级;
由于待办出现问题时会在相应系统数据库里生成一条日志记录,可以通过触发器实现邮件预警,以SQLServer
数据库为例:
二:监控大屏实时展示失败的待办信息
通过Grafana
监控平台,可以添加
SQLServer
等数据源,实时展现失败待办信息;
三:当失败的待办数量很庞大,批量修复或定期处理历史失败的待办
可以通过集成手机平台数据库(Mongodb)
的待办表和各个系统数据库
(ORACLE
、
SQLServer
、
Mysql)
待办表做对比:
1
集成手机平台数据库
(Mongodb)
的待办数据多于各个系统数据库待办数据,表示待办转已办失败,需要手动删除多余的待办信息;
2
集成手机平台数据库
(Mongodb)
的待办数据少于各个系统数据库待办数据,表示待办推送失败,需要手动重推;
那么如何批量查出所有系统待办转已办失败的数据
呢
?
(1)
导出集成手机平台数据库(Mongodb)
的待办数据到
execl
Mongodb
所在服务器操作系统为
Centos7.5,
可以在自己电脑上安装一个
Mongodb
客户端,使用
mongoexport
工具导出数据;
导出语句:
D:\MongoDB\Server\3.4\bin>
mongoexport.exe –csv –host 192.100.100.100:27017 /d testdb /c TEST_TdUndo /f "_id,userName,account,createTime,content" /q "{"delete": false}" /o C:\Users\Administrator\Desktop\all
cjc
_Undo1219a.csv
默认情况下打开CSV
文件中文是乱码的:
通过如下方式解决乱码问题:
—
打开方式
(
记事本
)—
格式
—
字体
—
中文
GB2312—
保存
—-csv
方式打开
—
调整格式
—
另存为
execl
格式文件
(
2
)
导出各个系统数据库(ORACLE
、
SQLServer
、
Mysql)
的待办数据到
execl
例如
系统1
:
select Name,
Account
,
Ini
Date,
content
from
undoerp
where
UnDoStatus='
待办
'
and CreateDate>='2019-11-
01
08:00:00.000'
and CreateDate<='2019-12-
01
23:59:00.000';
(3)
对比数据
—1
集成手机平台数据库
(Mongodb)
的待办数据多于各个系统数据库待办数据,表示待办转已办失败,需要手动删除;
—2
集成手机平台数据库
(Mongodb)
的待办数据少于各个系统数据库待办数据,表示待办推送失败,需要手动重推;
数据对比有两种方式:
1
:通过execl
函数对比各个系统数据,找出待办转已办失败的数据和待办未推的数据;
但是实际情况可能会比较复杂,比如各系统时间格式不一致、推送待办有延时、标题不一致等问题,通过execl
很难对比数据,可以通过
SQL
语句实现数据对比;
2
:将所有系统对应的Mongodb
、
Oracle
、
SQLServer
、
Mysql
待办数据导出到execl
中,在将所有系统execl
数据通过plsql
全部导入到
oracle
数据库中,通过
sql
对比找出想要的数据,例如
Mongodb
数据表左连接各系统Oracle
、
SQLServer
、
Mysql
数据表,匹配不上的数据,既是待办转已办失败的数据。
Oracle
、
SQLServer
、
Mysql
数据表左连接
Mongodb
数据表,匹配不上的数据,既是未推待办的数据。
(1)oracle
先创建多张表,并通过plsql
导入各个系统数据;
例如:
create table undo
cjc
(id varchar2(500),userName varchar2(500),account varchar2(100), updateTime varchar2(100),content nvarchar2(2000));
select * from undo
cjc
for update;
create table undo
erp
(userName varchar2(500),account varchar2(100), updateTime varchar2(100),content nvarchar2(2000),isstart varchar2(100));
select * from undo
erp
for update;
……
(2)
通过sql
进行数据对比
select distinct a.id,a.username cjc
用户名,
a.account cjc
登录名,
a.updatetime cjc
到达时间,
a.content enanar
标题
,
b.username erp
用户名
,
b.account erp
登录名
,
b.updatetime erp
到达时间
,
b.content erp
标题
from undo
cjc
a
left JOIN undoerp b
on a.account = b.account
and a.content like '%' || b.content || '%'
where a.content =
‘
xxx
系统
’
order by
erp
登录名
;
右侧没有匹配上的数据,既是待办转已办失败的数据;
逻辑删除有问题的待办:
即通过主键ID
唯一定位到有问题的待办,将
delete
字段值由
false
改成
true
;
单条语句如下:
db.T_ChenUndo.update({"_id":ObjectId("5dd3xxxxx"),"account":"cjc","delete":false},{$set:{delete:true}},{multi:true});
根据ID
等信息,批量生成删除错误待办的脚本,即可批量修复待办转已办失败问题;
欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!