1

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

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

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

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

4

2 回答 2

1

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

然后你可以对这两个文件运行 diff。

您也可以按主键运行此分块,这样您就不必处理大文件。

记录任何不相等的差异。如果没有什么区别,您也可以在两个文件块上运行 MD5/SHA1,如果哈希匹配,则没有区别,如果没有,则有。

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

  • 位域
  • text、ntext、varchar(MAX)、nvarchar(MAX) 字段
    (顺便说一下,它们映射到没有长度的 varchar - 编码 UTF8)
  • varbinary, varbinary(MAX), image (bytea[] vs. 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 进行比较。但是,如果以另一种方式削减它,则会大大减少所需的工作。

于 2019-11-04T12:28:22.910 回答
0

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

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

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

请回来报告!

于 2019-11-04T11:31:22.907 回答