2011-10-06 2 views
1

Nous disposons d'une application Web où, entre autres, une archive détaillée des données de journaux provenant des périphériques intégrés est conservée. Nous souhaitons conserver ces données détaillées pour l'analyse interne, mais ces données ne sont pas nécessaires sur le serveur de production accessible au public pendant plus de trois mois. L'application Web insère uniquement de nouvelles données, il n'y a pas de mises à jour ou de suppressions sur les données détaillées. Nous voulons donc construire un système d'archivage qui reçoit régulièrement (par exemple quotidiennement) une copie des nouvelles données du serveur de production (y compris les trois derniers mois) et ensuite toutes les données plus anciennes que trois mois sont retirées du serveur de production .Archivage des données du serveur de production public vers le serveur d'archives interne

Malheureusement, certains de nos périphériques intégrés sont parfois hors ligne pendant un certain temps (de quelques jours à quelques semaines). Dans ce cas, il peut arriver que de nouvelles données soient ajoutées au système pour une heure déjà copiée/archivée. Sur le serveur de production public, nous utilisons SQL Server 2008 Standard Edition. Sur le système d'archivage interne, nous souhaitons utiliser SQL Server 2008 R2 Enterprise Edition pour bénéficier du partitionnement et de la compression de l'archive.

Au moment j'envisage les approches suivantes:

  1. réplication quotidienne des données de la production à système d'archivage. Lorsque les anciennes données sur la production sont supprimées, elles ne doivent pas être répliquées dans le système d'archivage. J'ai trouvé une option pour ignorer les opérations de suppression sur la cible de réplication.

  2. S'il n'y avait pas la nécessité de disposer également des données actuelles sur le système d'archivage, je déplacerais régulièrement toutes les données antérieures à une heure spécifique vers le système d'archivage. Mais je dois synchroniser les données actuelles et déplacer toutes les anciennes données. Peut-être que je dois utiliser une solution mixte: Réplication pour synchroniser les données actuelles entre archive et système de production et déplacer des anciennes données vers une table d'archivage sur le système d'archivage (en répliquant les suppressions pour les données archivées de la table en cours au système de production).

Qu'en pensez-vous? Avez-vous des recommandations ou connaissez-vous certaines des meilleures pratiques concernant ces problèmes? Ce sujet est-il couvert ailleurs (par exemple, les livres)?

Merci beaucoup d'avance. PS: Je ne suis pas sûr si cette question devrait être posée ici ou sur serverfault. Veuillez le déplacer si ma décision l'affichant ici était erronée. Merci.

Répondre

1

Une chose que vous pourriez faire est d'insérer votre application Web dans les deux DB simultanément. Cette archive de manière ne dépend pas de prod db. du tout.

Vous pouvez également envisager de partitionner le prod. DB de sorte que la suppression des données de la base de données prod est plus facile. (Mais puisque votre DB prod est une édition standard, ce n'est pas une option.) Dans ce cas, vous devrez peut-être supprimer des lignes de la base de données prod. Pour faire les suppressions, ne faites pas la suppression entière dans une transaction. Vous voudrez peut-être le décomposer en lots. Enfin, observez attentivement la croissance de votre tlog tout en effectuant les suppressions. Il peut grandir assez vite.

1

De combien de tables parlons-nous qui ont besoin d'être archivées?

Si ce n'est qu'une ou quelques tables, vous pouvez simplement exécuter du SQL régulièrement via SQL Server Agent.

Quelque chose comme cela (très simplifié):

-- 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()) 

Pour que cet exemple fonctionne, il doit être exécuté sur le serveur de production et le serveur d'archivage doit être configuré comme un linked server dans la serveur de production.

Bien sûr, ce petit exemple est loin d'être parfait (ou même prêt pour la production!).
C'était juste pour exprimer l'idée de base.

Dans le monde réel, vous souhaiterez probablement:

  • envelopper les deux requêtes ensemble dans une transaction si les données réelles ne soit pas supprimée si l'archivage ne fonctionne pas pour une raison
  • insérer uniquement les lignes qui sont vraiment nouveaux et mettre à jour ceux qui ont changé
  • et ainsi de suite ...
Questions connexes