web-dev-qa-db-fra.com

La base de données ne peut pas être mise à niveau car elle est en lecture seule ou contient des fichiers en lecture seule. Rendre la base de données ou les fichiers accessibles en écriture et relancer la récupération

J'ai reçu un fichier de base de données et les instructions pour le charger consistent à installer SQL Server 2005, puis à le joindre à l'aide de SQL Server Management Studio.

Après avoir tout installé, j'ai essayé de joindre le fichier MDF mais ensuite il me dit:

la recherche de répertoire pour le fichier "D: {nom_dossier} {nom de fichier} .LDF" a échoué avec l'erreur 21 du système d'exploitation (erreur introuvable)

Un fichier LDF n'était pas fourni avec la base de données, il est donc probable qu'il devrait être généré automatiquement.

Maintenant, le lecteur D est l'endroit où se trouve mon lecteur de CD, donc il ne trouvera rien. Il n'aura pas non plus de chance d'essayer de créer quoi que ce soit là-bas.

  1. Pourquoi essaie-t-il de rechercher un fichier journal à un chemin spécifique? Pourquoi pas où se trouve le fichier de base de données?

  2. Comment puis-je joindre cette base de données?

J'ai réalisé que lorsque je sélectionne une base de données à joindre, trois entrées apparaissent sous "Détails de la base de données". un MDF, NDF et LDF. Le "chemin du fichier actuel" du LDF pointe vers le chemin du lecteur D ci-dessus, donc je l'ai supprimé.

Cette fois, lorsque je clique sur "OK", j'obtiens un message d'erreur différent:

La base de données ne peut pas être mise à niveau car elle est en lecture seule ou contient des fichiers en lecture seule.
Rendez la base de données ou les fichiers accessibles en écriture et relancez la récupération.

Échec de l'activation du fichier. Le nom physique D: {dossier} {fichier} .LDF est peut-être incorrect.
Un nouveau fichier journal "..." a été créé. (Microsoft SQL Server, erreur: 3415)

Alors maintenant, il crée un nouveau fichier journal dans le même dossier que le fichier de base de données, ce qui est génial, mais il semble qu'il y ait des problèmes de sécurité.

Information additionnelle:

  • Les instructions m'obligent à utiliser le nom de connexion "sa", qui semble être le compte sysadmin. Je suis connecté à mon instance SQL Server à l'aide de cette connexion.

  • J'ai vérifié les propriétés du fichier qu'il n'est pas en lecture seule. Le répertoire n'est pas non plus en lecture seule. Tous les ACL sont autorisés.

  • Je ne parviens pas à joindre la base de données. Lorsque j'essaie de le joindre, il envoie un message d'erreur avec "Échec de la connexion à la base de données".

  • La fermeture de SSMS et sa réouverture en tant qu'administrateur n'ont fait aucune différence.

  • select SERVERPROPERTY('ProductVersion') renvoie 9,00.4035.00. Il y a un autre fichier fourni avec la base de données appelée "dbdata.ini" qui dit "IsSql2000 = 1" donc il est vraisemblablement destiné à être chargé dans SQL Server 2000. Je vais voir si je peux le faire fonctionner sur 2000.

8
MxLDevs

Ce n'est pas un problème d'accès. Le problème est que vous attachez la base de données à une version supérieure de SQL Server que l'instance .mdf était à l'origine attaché à et il est en lecture seule. SQL Server tente de mettre à niveau la base de données dans le cadre de la pièce jointe et ne peut pas car la base de données est en mode lecture seule.

Si votre base de données est dans READ_ONLY (ce qui semble être le cas en fonction de vos messages d'erreur), alors vous avez besoin de tous les fichiers (journal et données) pour les joindre selon la documentation Technet . Si vous regardez sous le FOR ATTACH, il décrit explicitement que:

... pour une base de données en lecture seule, le journal ne peut pas être reconstruit car le fichier principal ne peut pas être mis à jour. Par conséquent, lorsque vous attachez une base de données en lecture seule dont le journal n'est pas disponible, vous devez fournir les fichiers journaux ou les fichiers dans le FOR ATTACH clause.

Vous avez besoin de l'accompagnement .ldf pour la base de données. Je contacterais celui qui a fourni la base de données et je leur demanderais de fournir à la fois .mdf et .ldf des dossiers. Ensuite, vous pouvez le joindre avec la syntaxe suivante:

CREATE DATABASE [foo]
ON (FILENAME='<<path to mdf>>')
LOG ON (FILENAME='<<path to ldf>>')
FOR ATTACH;

Le READ_ONLY l'état ne peut pas être supprimé de la base de données sans le joindre car il est stocké dans les métadonnées de la base de données. Pour le modifier, la base de données doit être en ligne et jointe.

Une autre alternative est de demander une sauvegarde de la base de données. Vous pouvez contourner certains de ces problèmes plus facilement si vous effectuez une restauration de la base de données au lieu d'une pièce jointe.

8
Mike Fal

Je viens de trouver un article qui a répondu à cette question:

Cela peut ne pas fonctionner dans tous les cas, mais j'essayais d'installer la base de données de recherche sémantique et j'ai eu la même erreur.

Vous devez exécuter SQL Server Management Studio en tant qu'administrateur et cela fonctionne.

25
Data Juggler
  1. Ouvrez mon ordinateur.
  2. Recherchez le dossier principal dans lequel vous avez conservé les fichiers ".mdf" et ".ldf".
  3. Faites un clic droit sur le dossier, cliquez sur "Propriétés".
  4. Dans la fenêtre des propriétés, cliquez sur "Sécurité"
  5. Cliquez sur le bouton "Modifier"
  6. Activez "Lire et exécuter", "Lire", "Écrire" pour les utilisateurs répertoriés et appliquez les modifications aux dossiers suivants jusqu'aux fichiers de base de données.
  7. Essayez de joindre le fichier ".mdf"

Cliquez avec le bouton droit sur .mdf et .ldf fichiers, un par un et cliquez sur "Propriétés", puis en bas, où il est indiqué "ce fichier provient d'un autre ordinateur et peut être bloqué pour aider à protéger cet ordinateur", cliquez sur le bouton de déblocage.

Cliquez ensuite avec le bouton droit de la souris, -> propriétés, -> onglet sécurité -> bouton modifier et sélectionnez "utilisateurs" et donnez l'autorisation de contrôle total.

1
Subodh Pradhan

Dans mon cas, la résolution était de se connecter à SSMS avec mode d'authentification Windows au lieu de l'utilisateur sql qui a le rôle d'administrateur système. assurez-vous simplement que l'utilisateur que vous avez utilisé en mode d'authentification Windows dispose d'une autorisation appropriée (mon cas était sysadmin) .Je suppose que l'utilisateur sql n'a pas l'autorisation appropriée. (Je rencontre ce problème lorsque je migre/copie des fichiers mdf et ldf de différents machine)

1
Ben F

Pas d'autorisations dans notre cas, c'était la version de SSMS!

(c'était 2012 localement où nous avons eu l'erreur, mais cela a fonctionné lorsque nous avons utilisé SSMS 17+ à partir d'une boîte distante)

0
Bigpa