web-dev-qa-db-fra.com

Questions sur le groupe de disponibilité Lisible Secondaire

Récemment, j'ai rencontré un problème dans mon serveur SQL. Veuillez conseiller le concept et le mécanisme derrière le cluster TOUWONON.

arrière-plan :
[.____] Nous avons construit un cluster peinton avec 1 noeud principal dbs1 et 1 noeud secondaire dbs2. Étant donné qu'ils ont configuré à la fois lisible secondaire comme "intention de lecture seulement". Ils ont également créé la liste de routage en lecture seule. Toutes les connexions spécifiant "ApplicationIntent=ReadOnly "sera redirigé vers dbs2.

numéro :
[.____] Le même travail d'agent (pour insérer des données de MSSQL à MySQL) s'exécutant sur dbs2 est instable - réussir soudainement et échouez soudainement. Pour le cas de réussite, la session de l'agent sera affichée sur dbs1 à la place de dbs2.

Pour un cas échoué, il affichait une erreur qui

"Impossible de se connecter à SQL Server '(local)'" - Historique des tâches de l'agent

"La base de données cible est dans un groupe de disponibilité et est actuellement accessible pour les connexions lorsque l'intention de l'application est définie sur la lecture seule". - Journal d'erreur SQL

Mais lorsque nous avons changé le secondaire lisible pour être "oui", le travail de l'agent peut toujours fonctionner avec succès avec la session sur dbs2.

Mes questions :

1) Quel est le comportement de l'intention de lecture seulement? Pourquoi l'emploi de l'agent a échoué?

2) Même cela réussir, pourquoi la session est sur dbs1 à la place de dbs2, étant donné que le travail de l'agent était défini sur dbs2? Est-ce que cela concerne la commande Insérer/Supprimer/Mettre à jour dans le script?

3) Quelle est la différence entre l'intention de lecture seulement et l'option Oui sur le secondaire lisible? J'ai testé que le routage réadonnement dans cette dernière option toujours valable après avoir spécifié "ApplicationIntent= readonly "

Je suis vraiment curieux de leurs mécanismes. S'il vous plaît n'hésitez pas à commenter et à discuter. Merci.

Informations supplémentaires (nouvelle mise à jour le 4 août 2017) :

Vous trouverez ci-dessous le script de mon agent. Puis-je spécifier "ApplicationIntent=ReadOnly "Sur-il? Et je suis confondre que ce T-SQL n'a écrit aucune donnée dans la table SQL Server, mais écrivez sur une autre base de données MySQL. Pourquoi le groupe de disponibilité ne me laissait pas passer? Merci spécial à Ben et sqlworldwide Commentaire et commentaires!

EXECUTE ( 'TRUNCATE TABLE MySQL_Table' ) AT MySQL_Server;

INSERT INTO MySQL_Server...MySQL_Table  (c1,c2,c3)  SELECT c1,c2,c3 FROM [dbs2].[SQL_Database].[dbo].[SQL_Table];
5
Owen Kiwi
  1. "Quel est le comportement de la lecture-intention seulement? Pourquoi l'emploi de l'agent a échoué?" Vous faites une promesse sur le serveur que cette connexion n'essaiera pas d'écrire des données à la base de données dans le groupe de disponibilité. Si vous do Essayez d'écrire, cette écriture échouera car la base de données ne peut pas être écrite. Je pense que vous devez passer par l'auditeur de groupe de disponibilité pour obtenir ce comportement, cependant. Vous avez configuré votre secondaire pour accepter les connexions uniquement des clients que a) passer par l'écoute et B) Spécifiez l'intention de l'application réadonnée. Puisque votre erreur dit qu'il tente de se connecter à (local), Je soupçonne que cela se connecte à l'instance directement.
  2. Je crois que cela concerne également la manière dont vous avez configuré votre emploi de l'agent. Que spécifiez-vous pour la chaîne de connexion? Si cela n'a pas spécifié ApplicationIntent=ReadOnly (ou quelque chose de similaire), il sera dirigé vers le primaire.

    Si tout est lu, votre chaîne de connexion ne spécifie probablement pas la base de données. Il doit inclure le nom de la base de données afin que SQL Server puisse indiquer quelle liste de routage à utiliser (votre serveur pourrait avoir plusieurs groupes de disponibilité en cours d'exécution). Voir: toujours lisible secondaire - Impossible de se connecter avec ApplicationIntent = Readonly

  3. "Quelle est la différence entre l'intention de lecture seulement et l'option Oui sur le secondaire lisible?" La différence entre "l'intention de lecture seulement" et "tout" pour une base de données dans le rôle secondaire détermine les types de connexions qu'il acceptera. Le premier dit que cela n'acceptera que les connexions des clients que Pinky jurit de ne rien écrire (c'est-à-dire préciser ApplicationIntent=ReadOnly). "N'importe quel" dit que ça va prendre n'importe quoi (les écrivies échoueront toujours, mais l'exigence du client dit qu'ils ne vont pas écrire quoi que ce soit est détendu).


Vous avez demandé dans un commentaire:
[.____] puis-je spécifier la chaîne de connexion AppicationIntent=ReadOnly Dans SQL Agent Job T-SQL Script? De plus, je suis toujours un peu confus par ces comportements, étant donné que ma déclaration d'insertion ciblait en effet la plate-forme MySQL au lieu de SQL Server. Pourquoi les paramètres "Lecture de l'intention seulement" ne peuvent pas me laisser partir, surtout je n'essaie pas de se connecter à (local)?

Cela dépend du type de travail de l'agent SQL que vous avez. Par exemple, j'ai utilisé ApplicationIntent=ReadOnly Dans les packages SSIS, mais je ne sais pas comment spécifier cela pour des choses comme un travail de SQL de transaction standard. Quant à la raison pour laquelle il a échoué, si vous avez configuré votre secondaire pour uniquement accepter les connexions qui définissent explicitement leur ApplicationIntent sur ReadOnly et votre travail ne l'a pas fait, il sera rejeté (même si Vous Sachez que cela ne va pas faire d'écrit).

4
Ben Thul