2012-04-05 3 views
0

У меня есть производственная база данных и база данных архива во втором экземпляре SQL Server.Архивирование производственной базы данных Вставка/обновление с SQL Server 2008

Когда я вставляю или обновляю (НЕ УДАЛИТЬ) данные в производственной базе данных, мне нужно вставить или обновить одни и те же данные в архивной базе данных.

Каков хороший способ сделать это?

Благодаря

+0

Напишите триггер по архиву db ON ПОСЛЕ ВСТАВКИ в Prod db – Teja

+0

@ Vutukuri Что делать, если в его базе данных много транзакций? Будет ли это правильным решением? – rvphx

ответ

1

Если они находятся в одной и той же БД, например, триггер будет тривиальным при условии, что это не очень много таблиц.

Если размер этого продукта растет, вы, вероятно, захотите изучить репликацию SQL Server. Microsoft потратила много времени и денег, чтобы сделать это правильно.

+0

Я не хочу, чтобы данные, удаленные из базы данных, удалялись из архива db, я могу делать с репликацией? – Maxime

+0

Исправить. Вы можете настроить одностороннюю репликацию, Production -> Archive. Изменения в архивных данных не будут влиять на производство. –

+0

Если я удалю запись в производственной БД, мне нужно сохранить эту запись в Архиве. Данные всех таблиц в db производства будут удалены в начале каждого дня ... Это так? – Maxime

0

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

0

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

CREATE TRIGGER TR_MyTable_ToArchive ON MyTable FOR INSERT, UPDATE AS 
BEGIN 
    SET ROW_COUNT OFF 
    -- First inserts 
    SET IDENTITY_INSERT ArchiveDB..MyTable ON -- Only if identity column is used 
    INSERT INTO ArchiveDB..MyTable(MyTableKey, Col1, Col2, Col3, ...) 
    SELECT MyTableKey, Col1, Col2, Col3, ... 
    FROM inserted i LEFT JOIN deleted d ON i.MyTableKey = d.MyTableKey 
    WHERE d.MyTableKey IS NULL 
    SET IDENTITY_INSERT ArchiveDB..MyTable OFF -- Only if identity column is used 

    -- then updates 
    UPDATE t SET Col1 = i.col1, col2 = i.col2, col3 = i.col3, ... 
    FROM ArchiveDB..MyTable t INNER JOIN inserted i ON t.MyTableKey = i.MyTableKey 
     INNER JOIN deleted d ON i.MyTableKey = d.MyTableKey 
END 

Это предполагает, что база данных архива находится на том же сервере, что и базы данных. Если это не так, вам нужно создать запись связанного сервера, а затем заменить ArchiveDB..MyTable на ArchiveServer.ArchiveDB..MyTable, где ArchiveServer - имя связанного сервера.

Если у вас уже есть большая нагрузка на вашу производственную базу данных, помните, что это удвоит ее. Чтобы обойти это, вы можете добавить поле флажка обновления в каждой из своих таблиц и запустить запланированную задачу в то время, когда загрузка базы данных будет минимальной, например, 1am. Затем ваш триггер установил поле I для вставки или U для обновления в производственной базе данных, и запланированная задача будет выполнять обновление или вставку в базу данных архива в зависимости от значения этого поля, а затем сбросить поле до NULL после его завершения.

Смежные вопросы