首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跨Server和Postgres比较表中的数据?

如何跨Server和Postgres比较表中的数据?
EN

Stack Overflow用户
提问于 2019-11-04 10:56:29
回答 2查看 1.9K关注 0票数 1

我正在将数据从Server 2017迁移到Postgres 10.5,即所有表、存储过程等。

在数据迁移之后,我想比较Server和Postgres数据库之间的数据一致性。

我现在所能想到的就是使用Pandas,并将表加载到Server的数据帧中,同时还可以将Postgres和数据帧进行比较。

但是数据是围绕着6 GB的,它需要很长时间才能将表加载到数据帧中,并且还驻留在一个服务器上,而服务器并不是我运行Python的本地服务器。是否有任何方法有效地比较Server和Postgres之间的数据一致性?

EN

回答 2

Stack Overflow用户

发布于 2019-11-04 12:28:22

是的,您可以按主键对数据进行排序,然后将数据写入json或xml文件。

然后您可以对这两个文件执行diff。

您还可以使用主键运行这个块,这样您就不必处理一个大文件了。

记录任何不显示为相等的差异。如果不管区别是什么,您也可以只在两个文件块上运行MD5/SHA1 1,如果散列机器处理,则没有区别,如果没有,则存在。

从使用nhibernate的经验来看,您需要注意的是:

  • 位字段
  • 文本,ntext,varchar(最大),nvarchar(最大)字段 (通过编码UTF8,它们映射到没有长度的varchar )
  • 变量二进制,变量二进制(最大),图像(bytea[] vs. )
  • xml
  • 在pgsql中插入所有数据后,将重置所有主键的id串行生成器。

另一件需要注意的事情是CURRENT_TIMESTAMP使用哪个时区。

注意:

我实际上直接运行了System.Data.DataRowComparer,而没有将数据写入文件:

代码语言:javascript
复制
static void Main(string[] args)
{
    DataTable dt1 = dt1();
    DataTable dt2= dt2();
    IEnumerable<DataRow> idr1 = dt1.Select();
    IEnumerable<DataRow> idr2 = dt2.Select();

    // MyDataRowComparer MyComparer = new MyDataRowComparer();
    // IEnumerable<DataRow> Results = idr1.Except(idr2, MyComparer);
    IEnumerable<DataRow> results = idr1.Except(idr2);
}

然后将所有不匹配的DataRows写入一个日志文件中,每个表都有一个目录(如果有差异)。

不过,我不知道Python用什么代替了System.Data.DataRowComparer。

因为这是一个一次性的任务,所以您也可以选择不使用Python,而是使用C# (参见上面的代码示例)。

此外,如果您有大型表,则可以使用具有顺序访问权限的DataReader进行比较。但是如果用另一种方法来削减它,它就会大大减少所需的工作量。

票数 1
EN

Stack Overflow用户

发布于 2019-11-04 11:31:22

考虑过使用外部数据包装器(FDW)使Server数据在Postgres中可见吗?

fdw

我还没有使用这个FDW工具,但是总的来说,基本的FDW设置过程很简单。FDW的作用类似于代理/别名,允许您访问远程数据,就好像它位于Postgres中一样。上面链接的工具不支持联接,所以您必须迭代地执行比较,等等。根据您的设置,您必须检查性能是否足够。

请向后报告!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58691983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档