2009-11-16 27 views
2

Dans SQL Server 2008, j'ai ma table parente dans une base de données et la table enfant dans une autre base de données, avec une relation FK gérée par des déclencheurs. Je ne peux pas le changer, je ne peux pas déplacer les deux tables dans une DB et avoir une contrainte FK régulière. Lorsque j'ai restauré les deux bases de données à partir de sauvegardes complètes, j'avais des orphelins dans ma table enfant, car les sauvegardes complètes n'étaient pas prises en même temps. J'ai aussi des journaux de transactions. En cas de reprise après sinistre, puis-je restaurer les deux bases de données exactement au même moment, afin que les deux bases de données soient cohérentes?Restauration simultanée de deux bases de données en même temps

Répondre

2

La restauration au même instant est possible tant que les bases de données sont en mode de récupération complète et que des sauvegardes de journal standard sont effectuées. See How to: Restore to a Point in Time (Transact-SQL).

Toutefois, la récupération à un moment donné n'assure pas la cohérence transactionnelle db seule, vous devez également avoir utilisé des transactions pour toutes les opérations qui ont franchi logiquement les limites de la base de données. Les déclencheurs ont probablement assuré cela pour les suppressions et les mises à jour car ils s'exécutent dans le contexte de l'opération parent, enveloppant ainsi implicitement l'opération cross db boundary dans une transaction, mais pour les insertions votre application doit généralement envelopper l'insert dans parent et l'insérer dans child dans une seule transaction.

La cohérence des opérations de récupération constitue le principal obstacle à la répartition des applications entre différentes bases de données.

+0

Remus, Même si je restaure à une heure précise avec une précision de 3 ms, beaucoup de données peuvent être validées pendant une milliseconde. Je pense qu'il peut encore y avoir des orphelins. –

+0

@SQL c'est à peu près mon point aussi: vous ne pouvez pas avoir une restauration fiable si la base de données est divisée. Les transactions DB croisées permettent de le réduire, mais ne peuvent pas l'appliquer. –

+0

Remus, merci pour la solution! –

0

Je ne vois pas la solution complète pour votre problème, mais vous pouvez utiliser des sauvegardes complètes avec des sauvegardes du journal des transactions. En premier lieu, vous restaurez les sauvegardes complètes sur les bases de poths avec l'option NORECOVERY, puis restaurez les sauvegardes du journal des transactions WITH STOPAT = 'xxxxxxxx' sur les deux bases. Vous pouvez donc restaurer les deux bases de données au même moment.

0

La meilleure façon de le faire est de le réparer au point où vous effectuez la sauvegarde. La plupart des applications multi-bases de données le font:

Avant la sauvegarde, exécutez une commande pour écrire une transaction marquée dans le journal des transactions de chaque base de données impliquée. (COMMENCER TRANSACTION AVEC MARK) Ensuite, faites les sauvegardes. De cette façon, vous pouvez faire plus tard une RESTORE WITH STOPAT MARK pour les obtenir tous au même moment. Ce n'est pas parfait mais plus proche que d'autres méthodes.

+0

Greg, Comment savoir quand marquer? Je dois restaurer après une catastrophe avec une perte de données minimale. Dois-je marquer fréquemment, comme toutes les 5 secondes? –

+0

Les applications multi-bases de données peuvent le faire juste avant de démarrer les sauvegardes. Avoir une étape de travail qui fait cela à chaque base de données. Ensuite, démarrez les sauvegardes. –

Questions connexes