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