web-dev-qa-db-fra.com

Comment récupérer la base de données de MDF dans SQL Server 2005?

J'ai un MDF Fichier et aucun fichier LDF pour une base de données créée dans MS SQL Server 2005. Lorsque j'essaie de joindre le fichier MDF fichier sur un autre serveur SQL , Je reçois le message d'erreur suivant.

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

Je voudrais accomplir l'une des options suivantes:

  1. Joignez la base de données sans perte de données (improbable mais sauveriez-moi un peu de temps).
  2. Joignez la base de données avec une perte de données (quelles que soient les transactions ouvertes sont perdues).
  3. Récupérez le schéma uniquement (pas de données) à partir du fichier MDF fichier.

Quelles commandes SQL puis-je essayer d'obtenir ma base de données à nouveau?

15
Martin

J'ai trouvé le document suivant sur Experts Exchange .

patrikt: Vous aurez une perte de données mais cela peut être fait.

1. Détachez la base de données et déplacez votre MDF pour économiser de l'emplacement. [.____] 2. Créez une nouvelle base de données du même nom, des mêmes fichiers, même emplacement de fichier et la même taille de fichier. [.____] 3. Stop SQL Server. 
 4. Echangez le fichier MDF de simplement créé dB à votre sauvegarde. 
 5. Démarrer SQL. DB ira soupçonner. 
 6. Alter base de données yourdb définissez l'urgence [.____] 7. Alter base de données yourdb set unique_user [.____] 8. DBCC CheckDB (yourdb, réparateur_allow_data_loss) [.____] 9. Alter base de données yourdb définissez MULTI_USER [.____] 10. Alter base de données yourdb set en ligne [.____]
21
Martin

Voici des détails qui couvrent les pièces 2) et 3) dans le cas où la création de journal ne fonctionne pas, ce qui peut arriver si MDF fichier est corrompu.

Vous pouvez récupérer des données et une structure uniquement en lisant MDF avec un seul outil de tiers pouvant décoder ce qui est écrit en tant que données binaires, mais même avec de tels outils, vous ne pouvez toujours pas toujours faire le travail.

Dans de tels cas, vous pouvez essayer Apexsql Recover . De ce que je sais, c'est le seul outil qui peut faire ce genre de travail, mais c'est assez cher.

Beaucoup meilleure idée est d'essayer de les récupérer de toutes les vieilles sauvegardes si vous en avez.

11
George Ober

D'après un post sur les forums SQL Server Joindre MDF sans LDF :

Si vous souhaitez attacher un MDF sans LDF, vous pouvez suivre les étapes ci-dessous, il est testé et fonctionne bien

  1. Créez une nouvelle base de données avec le même nom et les mêmes fichiers MDF et LDF

  2. Arrêtez SQL Server et renommez le MDF existant à un nouveau et copiez l'original MDF à cet emplacement et supprimez les fichiers LDF.

  3. Démarrer SQL Server

  4. Maintenant, votre base de données sera marquée Suspective 5. Mettez à jour les sysdatabases pour mettre à jour en mode d'urgence. Cela n'utilisera pas de fichiers journaux dans le démarrage

Sp_configure "allow updates", 1
go
Reconfigure with override
GO
Update sysdatabases set status = 32768 where name = "BadDbName"
go
Sp_configure "allow updates", 0
go
Reconfigure with override
GO
  1. Redémarrez SQL Server. Maintenant, la base de données sera en mode d'urgence

  2. Maintenant, exécutez le DBCC non documenté pour créer un fichier journal

DBCC Rebuild_log (dbname, 'c:\dbname.ldf') - étape non documentée pour créer un nouveau fichier journal.

(remplacez le nom du fichier dbname et journal en fonction de votre condition de votre condition)

  1. Exécuter SP_RESETStatus

  2. Redémarrez SQL Server et voir la base de données est en ligne.

Mise à jour: DBCC Rebuild_Log n'existe pas SQL2005 et plus. Cela devrait fonctionner:

USE [master]
GO
CREATE DATABASE [Test] ON 
    (FILENAME = N'C:\MSSQL\Data\Test.mdf')
    FOR ATTACH_REBUILD_LOG
GO
9
Jose Basilio

avez-vous essayé d'ignorer le LDF et d'attacher simplement le MDF:

sp_attach_single_file_db [@dbname =] 'dbname', [@physname =] 'Nom physique'

je ne sais pas exactement ce qui va arriver à vos transactions ouvertes (probablement simplement perdues), mais cela pourrait récupérer vos données en ligne.

-enfiler

5
Don Dickinson
2
SQLMenace

J'avais juste ce problème moi-même, mais aucune des réponses ci-dessus n'a fonctionné pour moi.

Mais au lieu de cela, j'ai trouvé cela qui a travaillé un régal et j'ai donc pensé que je partageais cela pour tout le monde:

http://www.kodyaz.com/articles/sql-server-attach-database-mdf-file.aspx

1
Brett Rigby

Trouvé une autre façon qui fonctionne complètement:

  1. Créez une nouvelle base de données avec le même nom sur l'emplacement de la base de données par défaut.
  2. Stop SQL Server.
  3. Copiez un ancien fichier MDF pour écraser le fichier MDF nouvellement créé et supprimer un nouveau fichier LDF
  4. Démarrez SQL Server, la base de données sera en mode d'urgence
  5. Détacher la base de données de mode d'urgence
  6. Copiez le fichier LDF d'origine sur l'emplacement de la base de données par défaut (où le nouveau fichier LDF tel que créé et supprimé en vertu de l'étape 3 ci-dessus.
  7. Joignez la base de données MDF fichier.

J'ai eu une base de données de travail après avoir essayé tout ce qui précède qui a échoué pour moi.

1
folbaj

J'espère que c'est facile de le faire,

  1. Ouvrez SQL Server
  2. Cliquez sur Nouvelle requête
  3. Exécutez la requête suivante

    sp_attach_single_file_db @ dbname = 'dbname', @ physname = 'c:\base de données\dbname.mdf'

dbname est que vous souhaitez montrer dans l'explorateur d'objets, où @physname est l'emplacement local de FilePath de votre fichier MDF.

J'espère que cela aidera quelqu'un, j'ai fait par ci-dessus, a obtenu la structure et aussi des données.

Testé dans SQL Server 2000 et 2008. Dans SQL Server 2000, cela ne fonctionne pas, mais fonctionne parfaitement en 2008.

0
Abdul Rahman