Как я могу синхронизировать один набор данных с другим? - PullRequest
1 голос
/ 30 марта 2010

У меня есть старая база данных и новая база данных. Старые записи были недавно преобразованы в новую базу данных. Все наши старые приложения продолжают указывать на старую базу данных, но новые приложения указывают на новую базу данных.

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

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

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

Это самый простой способ сделать это?

Ответы [ 4 ]

1 голос
/ 30 марта 2010

Этот метод двойного сравнения станет громоздким, если у вас очень большой объем. Если у вас нет большого объема, то делать полную замену каждую ночь "проще".

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

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

В качестве альтернативы ваша система базы данных, вероятно, имеет журнал (журнал повторов, журнал транзакций и т. Д.), В котором есть запись каждой транзакции базы данных. Если у вас есть доступ к этому журналу, то вы могли бы запрашивать его каждую ночь для транзакций с предыдущей ночи. Затем примените эти транзакции к новой базе данных.

0 голосов
/ 31 марта 2010

Поскольку старую структуру данных можно «преобразовать» в новую структуру данных, у вас есть много вариантов. Вот один из них для рассмотрения.

Создать представление (я) на старых данных / таблицах. Вместо преобразования данных «в память», создайте представления базы данных старых данных, которые выполняют эти преобразования. Затем используйте tSQL 2005 и более поздние предложения EXCEPT с объединением, чтобы получить все изменения. Сохраните результаты запроса ниже в таблице #temp или в @tableVariable. Затем выполните удаления, вставки и / или обновления.

select 'inOldOnly' as whichServer, old.*
from OldDb.dbo.vwOldStructureTransformed as old

EXCEPT

select 'inOldOnly' as whichServer, new.*
from NewDb.dbo.NewStructure as new

UNION 

select 'inNewOnly' as whichServer, new.*
from NewDb.dbo.NewStructure as new

EXCEPT

select 'inNewOnly' as whichServer, old.*
from OldDb.dbo.vwOldStructureTransformed as old

Этот подход довольно гибкий. На практике я рекомендую перечислять столбцы (вместо использования *). Если бы мы знали больше о размере старых и новых баз данных, мы могли бы прокомментировать, есть ли какая-либо выгода от фильтрации строк в предложении WHERE.

0 голосов
/ 30 марта 2010

Я согласен с Пауло, но в зависимости от того, сколько времени потребуется, чтобы все приложения указали на новую БД, на которую вы могли бы обратить внимание, используя инструмент для этого, вы можете взглянуть на SQL Data Compare http://www.red -gate.com/products/SQL_Data_Compare/index.htm это отличный инструмент, и я использую его для синхронизации данных между серверами dev / pre-prod / prod.

0 голосов
/ 30 марта 2010

Я не знаю, является ли это самым простым , но, безусловно, в вашей ситуации это самый безопасный .

А если вы используете SQL2005 или 2008, я бы реализовал это в службах Integration Services.

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