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

Fabien Celaia

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

- Auteur : Fabien Celaia

- Parution : 20 novembre 2005

- Mise à jour : 15 janvier 2006

- Public visé :

- Licence : Copyright ® 2006 Fabien Celaia. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Problématique et prérequis

- Solution

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, remplacer 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

Éditons 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.

À 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