Est-il possible d'avoir le serveur secondaire disponible en lecture seule dans un scénario d'expédition du journal?

StackOverflow https://stackoverflow.com/questions/1832848

Question

Je suis à la recherche en utilisant l'envoi de journaux dans un environnement SQL Server 2005. L'idée était de mettre en place l'envoi de journaux souvent à un serveur secondaire. Le but:. Utilisez le serveur secondaire pour gérer les requêtes de rapport, déchargeant ainsi le serveur principal db

Je suis tombé sur ce sur un sqlservercentral fil forum :

Lorsque vous créez le journal que vous avez 2 choix d'expédition. Vous pouvez configurer l'opération de restauration du journal à faire avec norecovery ou avec option d'attente. Si vous utilisez l'option norecovery, vous ne pouvez pas émettre des instructions de sélection sur elle. Si au lieu de norecovery vous utilisez l'option de veille, vous pouvez exécuter des requêtes sélection sur la base de données. Gardez à l'esprit avec l'option de veille lorsque des restaurations de fichiers de journal se produisent les utilisateurs seront expulsés sans avertissement par le processus de restauration. Lorsque vous configurez vivement l'envoi de journaux avec option d'attente, vous pouvez également choisir entre 2 choix - tuer tous les processus dans la base de données secondaire et effectuer journal de restauration ou ne pas effectuer journal de restauration si la base de données est utilisée. Bien sûr, si vous sélectionnez la deuxième option, l'opération de restauration pourrait ne jamais exécuter si quelqu'un ouvre une connexion à la base de données et ne pas le fermer, il est donc préférable d'utiliser la première option.

Alors mes questions sont:

  • Est-ce vrai ce qui précède? Pouvez-vous vraiment pas l'utilisation d'expedition connecter la façon dont je compte?
  • S'il est vrai, quelqu'un pourrait-il expliquer pourquoi vous ne pouvez pas exécuter des instructions SELECT à une base de données alors que le journal des transactions est en cours de restauration?

EDIT:

Première question est double de cette question serverfault . Mais je voudrais encore la deuxième réponse à votre question: Pourquoi est-il pas possible d'exécuter des instructions SELECT alors que le journal des transactions est en cours de restauration

Était-ce utile?

La solution

  

quelqu'un pourrait expliquer pourquoi vous ne pouvez pas   exécuter des instructions SELECT à une   base de données tandis que le journal des transactions est   en cours de restauration?

Réponse courte est cette déclaration prend RESTORE un verrou exclusif sur la base de données en cours de restauration.

Pour les écritures, je l'espère, il n'y a pas besoin pour moi d'expliquer pourquoi ils sont incompatibles avec une restauration. Pourquoi il ne permet pas non plus se lit? Tout d'abord, il n'y a aucun moyen de savoir si une session qui a un verrou sur une base de données va faire une lecture ou une écriture. Mais même s'il serait possible, restaurer (log ou sauvegarde) est une opération qui met à jour directement les pages de données dans la base de données. Étant donné que ces mises à jour vont directement à l'emplacement physique (la page) et ne suivez pas la hiérarchie logique (métadonnées partition pages-ligne), ils ne seraient pas honorer les verrous d'intention possibles d'autres lecteurs de données, et donc la possibilité de changer les structures comme ils sont lus . Une analyse de la table SELECT suivant la page suivante pointeurs-prev serait jeté dans le désarroi, entraînant une lecture corrompue.

Autres conseils

Eh bien oui et non.

Vous pouvez faire exactement ce que vous voulez faire dans la mesure où vous pouvez délester la charge de travail d'établissement de rapports sur un serveur secondaire en configurant Log Shipping à une copie en lecture seule d'une base de données. J'ai mis ce type d'architecture sur plusieurs reprises auparavant et il fonctionne très bien.

La mise en garde est que pour effectuer une restauration d'un journal des transactions fichier de sauvegarde, il doit y avoir aucune autre connexion à la base de données en question. D'où les deux choix étant, lorsque le processus de restauration est lancée, elle soit échouer, priorité ainsi les connexions utilisateur, ou il réussira en déconnectant toutes les connexions utilisateur afin d'effectuer la restauration.

En fonction de votre fréquence de restauration ce n'est pas nécessairement un problème. Vous instruisez simplement vos utilisateurs sur le fait que, par exemple toutes les heures à 10 minutes après l'heure, il est possible que votre rapport peut échouer. Si cela se produit simplement re-exécuter le rapport.

EDIT: Vous pouvez également évaluer les solutions de architeciture alternatives à vos besoins d'affaires. Par exemple, la réplication transactionnelle ou Database Mirroring avec une base de données Snapshot

Si vous avez la version d'entreprise, vous pouvez utiliser la base de données en miroir + instantané pour créer en lecture seule copie de la base de données, disponible pour les rapports, etc. Mirroring utilise « continue » log expédition « sous le capot ». Il est fréquemment utilisé dans le scénario que vous avez décrit.

Oui, il est vrai.

Je pense que ce qui suit se produit:
Alors que le journal des transactions est en cours de restauration, la base de données est verrouillée, comme une grande partie de celui-ci sont mises à jour.
Ceci est pour des raisons de performance plus de quoi que ce soit d'autre.

Je vois deux options:

  1. Base de données de mise en miroir.
  2. Planifiez l'expédition du journal de se produire que lorsque le système de rapports ne sont pas en cours d'utilisation.

confusion légère en ce que le drapeau norecovery sur la restauration signifie que votre base de données ne va pas être fait sortir d'un état de récupération et dans un état en ligne - c'est pourquoi les instructions select ne fonctionneront pas - la base de données est hors ligne. Le drapeau sans reprise est là pour vous permettre de restaurer plusieurs fichiers journaux dans une rangée (dans un scénario de type DR) sans apporter la base de données en ligne.

Si vous ne voulez pas vous connecter navire / avoir les inconvénients que vous pourriez échanger à une façon réplication transactionnelle, mais les frais généraux / set-up sera globalement plus complexe.

travaillerais de réplication peer-to-peer. Ensuite, vous pouvez exécuter des requêtes sur une instance et ainsi d'économiser la charge sur l'instance d'origine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top