2008-08-15 8 views
0

C'est un problème que j'ai vu d'autres personnes que moi, et je n'ai pas trouvé une bonne explication.Pourquoi les plans de maintenance Sql Server 2005 utilisent-ils la mauvaise base de données pour dbcc checkdb?

Disons que vous avez un plan d'entretien avec une tâche de vérifier la base de données, quelque chose comme ceci:

USE [MyDb] 
GO 
DBCC CHECKDB with no_infomsgs, all_errormsgs 

Si vous allez regarder dans vos journaux après exécution de la tâche, vous pouvez voir quelque chose comme ceci:

08/15/2008 06:00:22,spid55,Unknown,DBCC CHECKDB (mssqlsystemresource) executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 0 minutes 0 seconds. 
08/15/2008 06:00:21,spid55,Unknown,DBCC CHECKDB (master) executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 0 minutes 0 seconds. 

Au lieu de vérifier MyDb, il vérifiait master et msssqlsystemresource.

Pourquoi?

Ma solution est de créer un agent Sql Server Job avec ceci:

dbcc checkdb ('MyDb') with no_infomsgs, all_errormsgs; 

qui fonctionne toujours bien.

08/15/2008 04:26:04,spid54,Unknown,DBCC CHECKDB (MyDb) WITH all_errormsgs<c/> no_infomsgs executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 26 minutes 3 seconds. 

Répondre

1

Pour commencer, rappelez-vous toujours que GO est pas un mot clé SQL; c'est simplement un séparateur de lots qui est (généralement) implémenté/reconnu par le client, pas le serveur. Donc, selon le contexte et le client, il n'y a aucune garantie que la base de données actuelle est préservée entre les lots.

1

Si vous utilisez un plan de maintenance, il serait probablement préférable d'utiliser la tâche d'intégrité de la base de données de contrôle. Si vous voulez vraiment exécuter votre propre maintenance écrite dans t-sql, exécutez-le en utilisant une étape dans un travail, pas dans un plan de maintenance et le code ci-dessus fonctionnera bien. Comme Stu dit que l'instruction GO est une directive client, pas un mot clé sql et semble seulement être respecté par les clients isql, wsql, osql, etc, et l'agent sql. Je pense que cela fonctionne dans les paquets DTS. Évidemment, pas en DTSX, cependant.

0

Vous avez une tâche d'analyse de base de données d'intégrité et vous double-cliquez dessus, choisissez MyDb et lorsque le plan s'exécute, il vérifie seulement maître ?? bizarre. Êtes-vous sûr de ne pas avoir un autre plan en cours d'exécution?