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

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

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

我现在能想到的就是使用Python Pandas并将表从SQL Server和Postgres加载到数据帧中,并比较数据帧。

但是数据大约为 6 GB ,这需要很长时间才能将表加载到数据帧中,并且还托管在我运行Python脚本的本地服务器之外的服务器上。有什么方法可以有效比较SQL Server和Postgres之间的数据一致性?

cb943527 回答:如何跨SQL Server和Postgres比较表中的数据?

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

然后,您可以对两个文件运行diff。

您还可以通过主键对它进行分块处理,这样就不必使用巨大的文件。

记录所有不相等的差异。 如果没有什么区别,您也可以只在两个文件块上运行MD5 / SHA1,如果是哈希宏,就没有区别,如果没有,就没有区别。

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

  • 位字段
  • text,ntext,varchar(MAX),nvarchar(MAX)字段
    (顺便说一句,它们映射到没有长度的varchar-编码UTF8)
  • varbinary,varbinary(MAX),图像(bytea []与LOB)
  • xml
  • 在将所有数据插入pgsql后,将重置所有主键的id串行生成器。

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

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

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进行比较。但是,如果采用其他方法削减了成本,则会大大减少所需的工作量。

,

您是否考虑过使用外部数据包装器(FDW)在Postgres中显示SQL Server数据?

https://github.com/tds-fdw/tds_fdw

我没有使用过FDW工具,但是总的来说,基本的FDW设置过程很简单。 FDW就像代理/别名一样,使您可以访问远程数据,就像它们存储在Postgres中一样。上面链接的工具不支持联接,因此您必须迭代执行比较,依此类推。根据设置,您必须检查性能是否足够。

请报告!

本文链接:https://www.f2er.com/3167361.html

大家都在问