起因

前几天在弄Hubble连接Oracle数据库,然后在mongodb中建立一个镜像数据库;

发现一个问题,原本数据是11W,但是镜像库中只有6w多条;

刚开始以为是没运行好,又rebuild了一下

结果变成了7w多,又rebuild,又变成了6w了............

rebuild了N次,基本上每次结果都是不一样的

准备调试

没办法只能下载源码调试一下;

先把所有的dll都输出到同一个目录

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

然后把Hubble的服务停止了,再把Hubble的所有文件拷贝到dll的输出目录

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

然后编译生成一下,将HubbleTask设为启动项目,直接启动

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

这样就相当于启动服务器了

然后进入Hubble的安装目录,启动QueryAnalyzer.exe

 开始调试

因为是建立mongodb的镜像,所以找到Hubble.Code项目中的DBAdapter文件夹中的MongoAdapter.cs

找到方法public void MirrorInsert(IList<Document> docs)  插入镜像数据

设置断点,就可以了,然后找到QueryAnalyzer.exe中的rebuild,执行

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

其中的docs就是需要插入到monogodb的数据,每次5000个,运行几次后就发现了,每到5,6w左右数据的时候,就会传入一个1000多的数据,然后就没有下次了

就是后面的数据查询不到了,每次只能查到6w左右的数据,现在可以排除是插入数据失败的原因

排除了monogodb插入错误的原因后,开始检查Oracle查询数据是否准确

然后推测是在从Orcale获取数据的时候有问题?

打开并行任务瞄一下...(这里只是习惯的看一下,不一定每次都有效)

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

不过这次很巧的,发现了一个熟悉的方法(因为Orcale的驱动是重新实现的,所以这部分比较熟)

刚好和猜测也吻合了,这个是获取Oracle数据的地方

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

点进去看一下

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

查询语句似乎有些问题看,这时还不确定

好吧 我承认这段时间搞Oracle比较多,也吃过不少亏,所以看到这段语句的时候就感觉不太对劲了

看看这个语句是什么时候,在什么情况下生成...

记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

继续顺着代码的思路往下排查

仔细看这个代码就不难发现,他希望的效果是,按照索引键排序,然后查找出最小的5000个记录

并保存最后一个(最大一个)索引键的值到from这个变量上

再看GetSelectSql(from)方法

        private string GetSelectSql(long from)
        {
            if (_DBProvider.Table.DBAdapterTypeName.IndexOf("sqlserver", StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                return GetSqlServerSelectSql(from);
            }
            else if (_DBProvider.Table.DBAdapterTypeName.IndexOf("mongodb", StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                return GetMongoDBSelectSql(from);
            }
            else if (_DBProvider.Table.DBAdapterTypeName.IndexOf("oracle", StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                return GetOracleSelectSql(from);
            }
            else if (_DBProvider.Table.DBAdapterTypeName.IndexOf("mysql", StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                return GetMySqlSelectSql(from);
            }
            else if (_DBProvider.Table.DBAdapterTypeName.IndexOf("sqlite", StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                return GetSqliteSelectSql(from);
            }
            else
            {
                return GetSqlServerSelectSql(from);
            }

        }
GetSelectSql

相关文章: