Как добиться быстрой синхронизации базы данных.с источником только для чтения? - PullRequest
1 голос
/ 18 октября 2010

У меня есть исходная база данных (Sybase), которая доступна только для чтения, и вы можете записать в базу данных файл импорта.Другая сторона - моя собственная база данных (MSSQL), которая не имеет ограничений.

Основная проблема заключается в том, что в первой базе данных нет меток времени, и у меня нет доступа для изменения исходной базы данных.Так есть ли двигатель / решение для получения этой синхронизации.сделано?

1 Ответ

1 голос
/ 18 октября 2010

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

По сути, вы должны были бы сделать полное извлечение данных согласованным и стабильным способом (т. Е. Два таких извлечения без изменений дали бы одинаковый результат.)

Затем вы сравниваете это с предыдущим извлечением, которое вы сделали, и затем вы можете найти все изменения. Потребовалось бы что-то более умное, чем простой текстовый diff, чтобы определить, что строки были не просто удалены + вставлены, а фактически обновлены.

К сожалению, если нет способа спросить исходную базу данных о последних изменениях, как вы уже отмечали, из-за отсутствия временных меток или аналогичных механизмов, то я не понимаю, как можно улучшить ситуацию. чем полная выписка каждый раз.

Теперь я не так много знаю Sybase, но в MS SQL Server вы могли бы потенциально создать другую базу данных, которая отражает первую, и в этой второй базе данных вы могли бы внести любые необходимые изменения.

Однако, если вы можете создать такую ​​базу данных в Sybase и использовать SQL для одновременного доступа к ним, вы сможете выполнять запросы, которые приводят к различиям.

Например, что-то вроде:

SELECT S.*
FROM sourcedb..sourcetable1 AS S
    FULL JOIN clonedb..sourcetable1 AS C
    ON S.pkvalue = C.pkvalue
WHERE S.pkvalue IS NULL OR C.pkvalue IS NULL

Это приведет к появлению строк, которые вставляются или удаляются.

Чтобы найти те, которые изменились, вам понадобится предложение WHERE:

WHERE S.column1 <> C.column1
   OR S.column2 <> C.column2
   OR ....

Поскольку таблицы объединяются, предложение WHERE отфильтровывает все строки, в которых предыдущий экстракт и текущее состояние отличаются.

Теперь, это может не работать быстро, вам нужно проверить, чтобы убедиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...