2009-09-01 9 views
22

J'ai une base de données SQL2005 Express que je voudrais créer une copie de sur la même instance. Comment allez-vous faire cela avec un script?Comment sauvegarder et restaurer une base de données en tant que copie sur le même serveur?

J'ai déjà un script pour générer la sauvegarde, mais la restauration est un échec ...

ERREUR:

Msg 3234, Level 16, State 2, Line 2 Logical file 'MyDB_data' is not part of database 'MyDB_Test'. Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 2 RESTORE DATABASE is terminating abnormally.

LA RÉSOLUTION:

RESTORE DATABASE [MyDB_Test] 
FROM DISK = 'C:\temp\SQL\MyDB.bak' 
WITH 
MOVE 'MyDB' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDB_Test.mdf' 
, MOVE 'MyDB_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDB_Test_log.ldf' 
, REPLACE; 

LA RAISON:
Je n'ai pas identifié correctement le chemin logique lors de ma première tentative.

+0

Ceci n'est pas une erreur de serveur stion J'écris une application qui va faire ce travail ... – RSolberg

+1

Juste mis à jour ma réponse après avoir vu les modifications que vous avez faites. –

Répondre

38

RESTORE FILELISTONLY est une commande d'information et n'est pas nécessaire d'effectuer une restauration. Un utilisateur peut l'utiliser pour déterminer les noms logiques des fichiers de données, qui peuvent être utilisés avec les commandes MOVE pour restaurer la base de données dans un nouvel emplacement.

Comme suggéré par le message d'erreur, vous devez utiliser RESTORE FILELISTONLY pour voir quels sont les noms logiques de la base de données. Votre commande de restauration a tort.

Voici un exemple concret de ce que vous devez faire:

--backup the database 
backup database test1 to disk='c:\test1_full.bak' 

-- use the filelistonly command to work out what the logical names 
-- are to use in the MOVE commands. the logical name needs to 
-- stay the same, the physical name can change 
restore filelistonly from disk='c:\test1_full.bak' 
-------------------------------------------------- 
| LogicalName |   PhysicalName   | 
-------------------------------------------------- 
| test1   | C:\mssql\data\test1.mdf   | 
| test1_log  | C:\mssql\data\test1_log.ldf  | 
------------------------------------------------- 

restore database test2 from disk='c:\test1_full.bak' 
with move 'test1' to 'C:\mssql\data\test2.mdf', 
move 'test1_log' to 'C:\mssql\data\test2.ldf' 
Questions connexes