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

8

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 il me dit:

la recherche de répertoire pour le fichier "D: {folderName} {filename} .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.

MxLDevs
la source

Réponses:

8

Ce n'est pas un problème d'accès. Le problème est que vous attachez la base de données à une version plus élevée de SQL Server que l'instance à laquelle elle .mdfétait attachée à l'origine et qu'elle 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 se trouve READ_ONLY(ce qui semble être le cas en fonction de vos messages d'erreur), vous avez besoin de tous les fichiers (journaux et données) pour les joindre conformément à la documentation de Technet . Si vous regardez sous la FOR ATTACHclause, elle 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 la FOR ATTACHclause.

Vous avez besoin de l'accompagnement .ldfpour la base de données. Je contacterais celui qui a fourni la base de données et je leur demanderais de fournir à la fois les fichiers .mdfet .ldf. 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_ONLYstatut 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 consiste à 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 base de données au lieu d'une pièce jointe.

Mike Fal
la source
1
L'utilisation LOG ONavec la correspondance ldfn'a pas résolu le problème pour moi
Mugen
25

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.

Jongleur de données
la source
9
  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"
Touhid Mustakhim. M. J
la source
merci, mes anciennes fenêtres ont disparu et je pense que ces fichiers sont verrouillés par ce système d'exploitation. mais il suffit de changer la permission
saber tabatabaee yazdi
1

Cliquez avec le bouton droit sur les fichiers .mdfet .ldf, un à la fois 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.

Subodh Pradhan
la source
1

Dans mon cas, la résolution était de se connecter à SSMS avec le 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 à partir de différents machine)

Ben F
la source
0

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)

Bigpa
la source
-1

J'ai également eu ce problème. J'ai aidé mon client en redémarrant le service SQL et j'ai pu attacher le MDF par procédure normale.

Chadwick Powell
la source
-2

1) Ouvrez Sql Server Configuration Manager

2) Sélectionnez Sql Server Services (volet gauche)

3) Double-cliquez sur votre SqlServer (volet droit)

4) Sélectionnez l'onglet Connexion

5) Sélectionnez le bouton radio intégré et modifiez le système local ou le service réseau dans la zone de liste déroulante.

6) Cliquez sur OK.

7) Joignez le fichier mdf dans le gestionnaire de serveur SQL.

Ali Osman Yavuz
la source
-2

Votre service SQL Server s'exécute probablement sous le compte NT Service \ MSSQLServer . Le changer de système local lui donnera accès.

Il est probablement préférable de créer un utilisateur et de lui accorder des autorisations complètes sur le dossier dans lequel se trouvent les fichiers.

kwiboo
la source