1 votes

Serveur de basculement pour les erreurs de miroir de SQL Server après le redémarrage

J'ai configuré deux serveurs Windows Server 2008, qui exécutent tous deux SQL Server 2008 R2. L'un est utilisé comme base de données primaire, l'autre comme basculement miroir (deux bases de données de sites Web + ASPState pour les sessions). Tout fonctionne parfaitement jusqu'à ce que l'une des bases de données devienne la principale après que le serveur sur lequel elle fonctionne ait été redémarré. J'obtiens cette erreur :

Invalid object name 'tempdb.dbo.ASPStateTempSessions'.

Je suis capable de résoudre ce problème en exécutant la procédure stockée ASPState_Startup (qui exécute ASPState.dbo.CreateTempTables ), mais seulement si la BD est dans l'état "principal". Lorsqu'un serveur est redémarré, il revient toujours avec les bases de données dans un état "miroir/restauration", ce qui signifie que je ne peux pas exécuter ce SP au démarrage.

Avez-vous des suggestions sur la façon dont je peux contourner ce problème ?

0 votes

Il me semble qu'il y a un problème avec la mise en miroir. Plutôt que de mettre en place une solution de contournement, vous êtes-vous demandé pourquoi vous obtenez l'erreur en premier lieu ? Essayez dba.stackexchange.com

1 votes

La mise en miroir fonctionne bien ; c'est un choix délibéré car tempdb n'est pas et ne peut pas être mis en miroir. Ça ne peut pas faire de mal de le mettre sur dba.se.

1voto

Jason Cumberland Points 1559

Essayez de configurer une tâche SQL Agent qui s'exécute sur chaque instance, toutes les minutes, et exécute un script pour rechercher la base de données dans un état non restauré, vérifier la table et ensuite exécuter la procédure si elle n'existe pas. J'ai repris les noms d'objets de votre question donc il faudra peut-être les modifier s'ils sont décalés par rapport à votre environnement.

if exists ( select 1 from sys.databases where state_desc <> 'RESTORING' and 
[name] = 'ASPState' )
begin
    if ( object_id('tempdb.dbo.ASPStateTempSessions') is null )
    begin
        exec sp_executesql @stmt = N'exec ASPState.dbo.CreateTempTables'
    end
end

0 votes

Cela a fonctionné - juste un petit problème avec le code. 'exec ASPState.dbo.CreateTempTables' devrait être N'exec ASPState.dbo.CreateTempTables' . Merci !

0 votes

J'ai modifié la réponse pour refléter vos commentaires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X