Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Forums FAQ Tutoriels SQL Livres Access DB2 Firebird InterBase Mysql Oracle PostGreSQL SQL-Server Sybase


Attacher une base de données MS-SQL dont le journal de transactions est manquant

20 novembre 2005
MAJ: 15 janvier 2006

Par Fabien Celaia (Fadace)

Problématique et prérequis

Vous êtes administrateur d'un serveur SQL.

Une de vos bases de données doit être récupérée. Vous n'en aviez aucun backup, mais la copie du fichier de données (le MaBase.mpd). Malheureusement, vous n'aviez pas crû bon de sauvegarder le journal de transaction, ou le fichier .ldb est corrompu...
Le manque de fichier de transaction vous empêche t'utiliser un sp_attache_db, un create database ...attach... ou tout autre assistant de Microsoft SQL Enterprise Manager

Que faire ???

Solution

Créer deux bases de données : une MaBase et une db_recup.
Il est important que votre première base se nomme comme la base d'origine, ce nom apparaissant dans la table sysfiles.

Create database MaBase
Create database db_recup

Arrêter votre instance

shutdown


Via l'explorateur Windows, rempacer le fichier créé MaBase.mpd par votre fichier Mabase.mpd (renommer donc mabase.mpd en MaBase.mpd).


Ouvrez Microsoft Enterprise Manager,
allez sur les propriétés de votre instance arrêtée.
Dans l'onglet général, il y a un bouton Startup Parameters


Rajoutez-y le traceflag 3608 qui permet de redémarrer l'instance
en ne faisant la phase de récupération que de la base master.
En effet, si on s'avisait de remonter la base MaBase en l'état,
on pourrirait l'instance car cette base serait corrompue,
le journal de transaction ne correspondant pas du tout à celui que le serveur attend.

Redémarrons l'instance.

Créons ensuite sous Dos un fichier Transferts.sql comprenant les lignes suivantes:

set nocount on
GO

select 'SELECT INTO db_recup..'+name+' FROM MaBase..'+name
from MaBase..sysobjects
where type='U'
GO


Exécutons-le

isql -Usa -P*** -S VotreInstance -i transfert.sql -o transfert2.sql

Editons ensuite le fichier résultant transfert2.sql, supprimons toutes les lignes qui ne commencent pas par un 'select into'. Veillons à ce que le fichier se termine par un retour à la ligne.


Ensuite, exécutons les deux commandes suivantes

echo GO >> transfert2.sql
isql -Usa -P*** -S VotreInstance -i transfert2.sql

Cette dernière commande a dû recopier vos tables dans la base db_recup. Ne vous reste plus qu'à récupérer les ordres de création d'objets (procédures stockées, vues, triggers, ...) de MaBase via Microsoft Enterprise Manager et à les rejouer sur db_recup.

A la fin de cette opération,

  • Supprimez la base db_corrupt via drop database db_corrupt
  • Arrêtez l'instance via shutdown
  • supprimer le traceflag -T3608 des paramètres de démarrage
  • Redémarrez votre instance normalement

Copyright © Fadace. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique SQL & SGBD : Benjamin Gagneux et Frédéric Dubois - Contacter par EMail :
Vos questions techniques : forum d'entraide SQL & SGBD - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.