SQL Server dans un état de confusion: la base de données existe-t-elle ou non?

8

Vous avez un problème vraiment étrange et ennuyeux. D'une manière ou d'une autre, l'instance de SQL Server 2008 R2 s'exécutant sur notre serveur a été quelque peu corrompue.

Tout d'abord, nous avons remarqué que la base de données que nous avons créée hier manquait. Donc, nous avons regardé autour de nous et avons constaté qu'il était toujours là, mais détaché. Donc, nous avons essayé de joindre le mdf mais avons reçu un message qui ressemblait à quelque chose The file is currently in use.

Je pensais que c'était étrange, alors j'ai redémarré SQL Server. Même chose ... d'accord, il est temps de prendre des mesures drastiques ... alors, j'ai arrêté le service, zippé le mdf, démarré le service, décompressé puis essayé de le restaurer. Le message ci-dessus avait disparu, mais j'ai ensuite:

Impossible de joindre une base de données portant le même nom qu'une base de données existante

Aie. Bien sûr, il ne s'affiche pas dans l'explorateur de base de données, donc aucune idée de ce qui se passe ... en dernier recours:

DROP DATABASE [DatabaseName]

Bien sûr, cela n'a pas fonctionné .. cela me dit que la base de données n'existe pas. Donc, je suis bloqué ... à un moment donné, SQL Server pense que la base de données existe et à un autre moment, il pense que la base de données n'existe pas. Évidemment, elle est dans un état de confusion.

Quelqu'un a-t-il déjà vu cela avant? Vous avez des idées sur la façon de le réparer?

Mat
la source
Donc, les fichiers physiques ne sont plus là, non? Voyez-vous toujours votre base de données dans sys.databases?? Par exemple, affiche-t-il SELECT * FROM sys.databasestoujours votre base de données?
marc_s
@Josien remercie pour l'astuce .. Je l'ai mis là aussi
Matt
@marc_s J'ai essayé ça maintenant, mais ça ne s'affiche pas quand j'exécute cette requête
Matt
Que SELECT name, user_access_desc, state_desc FROM sys.databasesrévèle-t-il?
Mark Storey-Smith
Pourquoi diable voudrait-on voter pour ce poste? Quelqu'un pourrait-il développer? Sérieusement ...
Matt

Réponses:

5

Bon .. Je l'ai compris .. un clown ici (qui ne s'en rendra pas compte) a renommé la base de données pour que son nom dans SSMS soit différent des noms de fichiers mdf et ldf .. et pas juste un peu différent .. . complètement différent. LOL. Merci à tous pour vos suggestions utiles de toute façon.

Mat
la source
4
Pour être prudent, refusez l'autorisation ALTER sur la base de données à tout le monde sauf 'sa', changez le mot de passe 'sa' et soyez sélectif lorsque vous donnez le mot de passe aux 'clowns'
Carol Baker West
4

Si vous n'aviez pas l'autorisation de voir la base de données, ce serait exactement les symptômes. La base de données n'apparaîtra pas dans vos vues. Êtes-vous sûr de ne pas avoir simplement zappé le ou les fichiers d'une base de données à laquelle vous n'aviez pas accès? Êtes-vous un administrateur système?

Mise à jour


La base de données était-elle détachée ou hors ligne ? Quand vous dites de So, we looked around and found that it was still there, but detachedquoi parlez-vous exactement? avez-vous regardé, qu'avez-vous trouvé? Identifier qu'une base de données a été «détachée» (par opposition à, disons, supprimée) n'est pas anodin.

Remus Rusanu
la source
Je suis en effet un administrateur système
Matt
2
Depuis que vous l'avez mentionné, j'ai un script sur mon blog qui détecte les fichiers de base de données non attachés dans les dossiers de données / journaux par défaut: volontairedba.com/post/2012/08/21/…
Jon Seigel
Merci, j'essaierai plus tard quand je serai au bureau.
Matt
@ JonSeigel, gentil, mais malheureusement cela ne m'a rien donné. J'ai aussi essayé autre chose .. redémarrez le serveur et ensuite créer une nouvelle base de données avec ce nom .. ne me laisserais pas le faire .. très ennuyeux. Je pense que je vais devoir ignorer cette situation et créer un nouveau db avec un nom différent.
Matt
3

Recherchez sys.databases. Il se pourrait que la base de données ait été créée avec un espace à la fin de son nom. Exécutez le code ci-dessous et notez que vous ne pouvez créer qu'une des bases de données, et peu importe celle que vous créez en premier, vous ne pouvez créer que celle-ci.

create database [test]
create database [test ]
mrdenny
la source
Je pense que c'est un bug, non?
AK
Probablement pas. Je suppose que SQL fait un TRIM sur le nom de la base de données lorsqu'il vérifie si la valeur existe. Cela devrait être intentionnel, donc c'est probablement par conception.
mrdenny
@mrdenny, merci, mais aucune aide là-bas .. la base de données ne s'affiche pas du tout, avec une variation de nom que ce soit .. et il n'y a qu'une poignée de bases de données sur ce serveur, donc je le repérerais immédiatement s'il était là . Merci quand même
Matt
0

Exécutez 'DBCC CHECKDB' sur le maître, msdb et la base de données pour voir ce qu'il dit. Il peut être nécessaire de mettre le système en mode mono-utilisateur pour que dbcc s'exécute en mode réparation avec perte de données. Ou restaurez simplement vos sauvegardes de master et msdb selon le cas.

Ian P
la source
L'exécution de cela sur le maître et msdb n'a pas aidé et je ne peux pas l'essayer sur la base de données elle-même, car je ne peux pas voir la base de données dans le studio de gestion ...
Matt
0

Pour moi, cela a été résolu en actualisant les bases de données. J'ai fait une récupération infructueuse et j'ai vu db, qui n'a pas pu être supprimé avec le même message d'erreur: "La base de données n'existe pas sur le serveur."

Raduga
la source
2
Vous voudrez peut-être expliquer comment vous procédez exactement à "l'actualisation des bases de données".
mustaccio
0

J'avais ce même problème en utilisant SQL Server 2008r2.

J'essayais de dupliquer une base de données (versioning foo) et j'ai fini par confondre le serveur SQL. SQL Server Management Studio pensait que la base de données existait (le MDF et le LDF l'ont fait) mais la base de données master ne pensait pas que la base de données existait (n'apparaissait pas dans sys.databases)

L'astuce consistait à renommer les fichiers MDF et LDF, puis à créer la base de données à partir de SQL create database [db name here]puis à supprimer la base de données et enfin à attacher les fichiers MDF et LDF d'avant.

John Pycroft
la source