Как сравнить данные в таблицах по SQL Server и Postgres? - PullRequest
1 голос
/ 04 ноября 2019

Я переношу данные из SQL Server 2017 в Postgres 10.5, т. Е. Все таблицы, хранимые процедуры и т. Д.

Я хочу сравнить согласованность данных между базами данных SQL Server и Postgres после переноса данных.

Все, что я могу думать сейчас, - это использовать Python Pandas и загружать таблицы в кадры данных из SQL Server, а также Postgres и сравнивать кадры данных.

Но данные примерно равны 6GB , который занимает много времени для загрузки таблицы во фрейм данных, а также размещается на сервере, который не является локальным для того места, где я запускаю скрипт Python. Есть ли способ эффективно сравнить согласованность данных в SQL Server и Postgres?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Да, вы можете упорядочить данные по первичному ключу, а затем записать данные в файл json или xml.

Затем вы можете запустить diff для двух файлов.

Вы также можете запустить этот блок по первичному ключу, чтобы вам не приходилось работать с огромным файлом.

Записать любой дифференциал, который не отображается как равный. Если не имеет значения, в чем разница, вы также можете просто запустить MD5 / SHA1 на двух чанках файла, и, если хэш-патчи, нет разницы, если это не так, есть.

Исходя из опыта работы с nhibernate, вам нужно следить за тем, чтобы:

  • битовые поля
  • text, ntext, varchar (MAX), nvarchar (MAX)) поля(кстати, они сопоставляются с varchar без длины - кодировка UTF8)
  • varbinary, varbinary (MAX), изображение (bytea [] и LOB)
  • xml
  • что последовательный генератор идентификатора всех первичных ключей сбрасывается после того, как вы вставили все данные в pgsql.

Еще одна вещь, на которую следует обратить внимание, это какой часовой пояс использует 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 с последовательным доступом для сравнения. Но если его обрезает другой способ, это значительно сокращает требуемую работу.

0 голосов
/ 04 ноября 2019

Рассматривали ли вы возможность сделать ваши данные SQL Server видимыми в Postgres с помощью Обертки внешних данных (FDW)?

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

Я не использовал этот инструмент FDW, но в целом, основной процесс установки FDW прост. FDW действует как прокси / псевдоним, позволяя вам получать доступ к удаленным данным, как если бы они были размещены в Postgres. Приведенный выше инструмент не поддерживает объединения, поэтому вам придется выполнять итеративные сравнения и т. Д. В зависимости от настроек вам придется проверить, достаточна ли производительность.

Пожалуйста, сообщите!

...