#sql-server #sql-server-2008 #archiving
#sql-сервер #sql-server-2008 #архивирование
Вопрос:
У нас есть веб-приложение, в котором, помимо прочего, хранится подробный архив лог-данных со встроенных устройств. Мы хотим сохранить эти подробные данные для внутреннего анализа, но эти данные не нужны на общедоступном рабочем сервере дольше трех месяцев. Веб-приложение только вставляет новые данные, подробные данные не обновляются и не удаляются.
Итак, мы хотим создать архивную систему, которая регулярно (например, ежедневно) получает копию новых данных с производственного сервера (включая последние три месяца), а затем все данные старше трех месяцев удаляются с производственного сервера.
К сожалению, иногда некоторые из наших встроенных устройств некоторое время находятся в автономном режиме (от нескольких дней до нескольких недель). В этом случае может случиться так, что новые данные будут добавлены в систему за уже скопированное / архивированное время.
На общедоступном рабочем сервере мы используем SQL Server 2008 Standard Edition, во внутренней архивной системе мы хотим использовать SQL Server 2008 R2 Enterprise Edition, чтобы воспользоваться разделением и сжатием архива.
На данный момент я рассматриваю следующие подходы:
-
Ежедневная репликация данных из производственной системы в архивную систему. При удалении старых производственных данных их не следует реплицировать в архивную систему. Я нашел возможность игнорировать операции удаления для цели репликации.
-
Если бы не было требования также иметь текущие данные в архивной системе, я регулярно перемещал бы все данные старше определенного времени в архивную систему. Но я должен синхронизировать текущие данные и переместить все старые данные.
Возможно, мне придется использовать смешанное решение: репликацию для синхронизации текущих данных между архивом и производственной системой и перемещение старых данных в архивную таблицу в архивной системе (при репликации удалений для архивных данных из текущей таблицы в производственную систему).
Что вы думаете? Есть ли у вас какие-либо рекомендации или какие-либо рекомендации по решению таких проблем? Рассматривается ли эта тема где-либо еще (например, в книгах)?
Заранее большое вам спасибо.
PS: Я не уверен, следует ли задавать этот вопрос здесь или на serverfault. Пожалуйста, переместите его, если мое решение опубликовать его здесь было неправильным. Спасибо.
Ответ №1:
Единственное, что вы могли бы сделать, это вставить ваше веб-приложение в обе базы данных одновременно. Таким образом, архивирование не зависит от prod db. вообще.
Вы также можете рассмотреть возможность разделения продукта. DB, чтобы упростить удаление данных из prod DB. (Но поскольку ваша prod DB является стандартной версией, это не вариант.) В этом случае вам может потребоваться удалить строки из prod DB. Чтобы выполнить удаление, не выполняйте полное удаление за одну транзакцию. Возможно, вы захотите разбить его на пакеты.
Наконец, внимательно следите за ростом вашего журнала tlog во время выполнения удалений. Он может быстро увеличиваться.
Ответ №2:
О скольких таблицах мы говорим, которые необходимо архивировать?
Если это только одна или несколько таблиц, вы можете просто регулярно запускать некоторый SQL через агент SQL Server.
Что-то вроде этого (очень упрощенное):
-- copy to archive database
insert into ArchiveServer.dbo.ArchiveTable (Column1, Column2, ...)
select Column1, Column2, ...
from ProductionTableOnThisServer
where DateColumn < dateadd(m, -3, getdate())
-- delete in production database
delete from ProductionTableOnThisServer
where DateColumn < dateadd(m, -3, getdate())
Чтобы этот пример работал, его необходимо запустить на рабочем сервере, а архивный сервер должен быть настроен как связанный сервер на рабочем сервере.
Конечно, этот маленький пример далек от совершенства (или даже от готовности к производству!).
Это было просто для выражения основной идеи.
В реальном мире вы, вероятно, также захотите:
- объедините оба запроса в транзакцию, чтобы реальные данные не удалялись, если архивирование по какой-либо причине не сработало
- вставляйте только действительно новые строки и обновляйте те, которые изменились
- и так далее…