Erreur de restauration de la base de données SQL Server: la conversion spécifiée n'est pas valide. (SqlManagerUI)

91

J'utilise SQL Server 2008 R2 Standard (version 10.50.1600.1) pour mon site Web de production et l'édition SQL Server Express avec Advanced Services (v10.50.1600.1) pour mon hôte local en tant que base de données.

Il y a quelques jours, mon serveur SQL s'est écrasé et j'ai dû installer une nouvelle version 2008 R2 Express sur mon hôte local. Cela a bien fonctionné lorsque j'ai restauré certaines versions plus anciennes tirées de l'édition Express, mais lorsque j'essaie de restaurer la base de données à partir d'un .bakfichier qui est extrait du serveur de production, cela provoque l'erreur suivante:

Erreur: la distribution spécifiée n'est pas valide. (SqlManagerUI)

et quand j'essaye de restaurer la base de données en utilisant la commande

Use Master
Go
RESTORE DATABASE Publications
FROM DISK = 'C:\Publications.bak'
WITH MOVE 'Publications' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS2008R2\MSSQL\DATA\Publications.mdf',--adjust path
MOVE 'AlPublications_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS2008R2\MSSQL\DATA\Publications.ldf'

Cela génère une erreur différente

Msg 3154, niveau 16, état 4, ligne 1
Le jeu de sauvegarde contient une sauvegarde d'une base de données autre que la base de données «Publications» existante.
Msg 3013, niveau 16, état 1, ligne 1
RESTORE DATABASE se termine anormalement.

J'ai vérifié les versions. Ils semblent tous correspondre à moi, comme le montre l'image ci-dessous

Auparavant, je pouvais restaurer une base de données de la version standard à l'édition express, mais maintenant cela échoue. J'ai supprimé la base de données et essayé de la recréer. Cela échoue aussi.

Je ne suis pas sûr de ce que je fais de mal. J'apprécierais de l'aide à ce sujet concernant

Le problème a été résolu car il semble que le fichier .bak était corrompu. Quand je l'ai essayé avec un fichier différent, cela a fonctionné.

Apprentissage
la source
Je ne suis pas pro dans cette question, mais rapide, est-ce que l'architecture x86 et x64 dans la base de données est compatible?
Gustav Klimt
J'avais une base de données de restauration précédente à ce moment-là, je n'ai rencontré aucun problème de ce type. pour une raison quelconque, il génère maintenant des erreurs, je ne suis pas sûr si le classement du serveur de base de données crée des problèmes
Apprendre
Essayez d'ajouter ,REPLACEà la commande T-SQL pour écraser la base de données AlHabtoorPublications existante.
SchmitzIT
J'ai rencontré le même problème au travail aujourd'hui. On dirait que la vérification de la taille du fichier après le transfert FTP n'est pas suffisante. On dirait que le fichier est très sensible. Résolution du problème en compressant le fichier avant d'exécuter le transfert.
rofans91
Scenerio J'ai pris une sauvegarde de la base de données sur SQL SERVER 2008 et j'ai essayé de la restaurer sur SQL SERVER 2008 R2. Idéalement, cela devrait fonctionner correctement, mais lors de la sélection du fichier de sauvegarde, SQL Management Studio 2208 R2 a généré l'erreur «Le cast spécifié n'est pas spécifié. (SqlManagerUI)». Raison et dépannage Cela était dû à la corruption du fichier .BAK pendant le transfert FTP (le mode de transfert est défini sur ASCII). N'oubliez pas de définir le mode de transfert FTP sur BINARY lors du transfert du fichier .BAK de la base de données.
Rohan Sarkar

Réponses:

40

L'interface graphique peut parfois être inconstante. L'erreur que vous avez obtenue lors de l'utilisation de T-SQL est que vous essayez d'écraser une base de données existante, mais que vous n'avez pas spécifié d'écraser / remplacer la base de données existante. Les éléments suivants peuvent fonctionner:

Use Master
Go
RESTORE DATABASE Publications
  FROM DISK = 'C:\Publications_backup_2012_10_15_010004_5648316.bak'
  WITH 
    MOVE 'Publications' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS2008R2\MSSQL\DATA\Publications.mdf',--adjust path
    MOVE 'Publications_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS2008R2\MSSQL\DATA\Publications.ldf'
, REPLACE -- Add REPLACE to specify the existing database which should be overwritten.
SchmitzIT
la source
Bizarre, j'ai réutilisé votre déclaration originale. Dans tous les cas, la seule chose que j'ai ajoutée était la dernière ligne: , REPLACE
SchmitzIT
1
En fait, le Failed: 38indique reached end of the file. (Dans une fenêtre de commande, exécutez NET HELPMSG 38). Cela indique généralement une sauvegarde corrompue: stackoverflow.com/questions/5656363/…
SchmitzIT
J'ai testé la restauration avec un fichier .bak un peu plus ancien qui a été restauré sans aucun problème. Il semble que ce fichier .bak particulier soit corrompu
Apprendre
Cela pourrait être le résultat de l'accident. Cela pourrait avoir bâclé des parties du lecteur. Heureux d'apprendre que vous avez réussi à résoudre le problème avec une sauvegarde différente :)
SchmitzIT
Votre script génère l'erreur suivante Msg 3203, niveau 16, état 1, ligne 1 La lecture sur «C: \ Publications.bak» a échoué: 38 (impossible de récupérer le texte de cette erreur. Raison: 15105) Msg 3013, niveau 16, état 1 , La ligne 1 RESTORE DATABASE se termine anormalement.
Apprentissage du
163

Cela peut être dû à la restauration du fichier de sauvegarde de la version de SQL Server 2012 dans SQL Server 2008 R2 ou même moins.

Subhash Makkena
la source
4
Il faudrait à la place utiliser "Generate Script".
kroiz
4
C'était mon problème. Il semble qu'il ne serait pas trop difficile pour la SEP de donner un message plus utile pour certains de ces cas.
John Gilmer
Pinal Dave explique les raisons ici - blog.sqlauthority.com/2015/06/01/…
shrivb
15

Enfin, cette erreur a disparu lors d'une restauration. Je suis passé à SQL2012 par frustration, mais je suppose que cela fonctionnerait probablement toujours sur 2008R2. J'ai dû utiliser les noms logiques:

RESTORE FILELISTONLY
FROM DISK = location of your.bak file

Et à partir de là, j'ai exécuté une instruction de restauration en MOVEutilisant des noms logiques.

RESTORE DATABASE database1
FROM DISK = '\\database path\database.bak'
WITH
MOVE 'File_Data' TO 'E:\location\database.mdf',
MOVE 'File_DOCS' TO 'E:\location\database_1.ndf',
MOVE 'file' TO 'E:\location\database_2.ndf',
MOVE 'file' TO 'E:\location\database_3.ndf',
MOVE 'file_Log' TO 'E:\location\database.ldf'

Une fois la restauration terminée, j'ai presque pleuré de joie.

Bonne chance!

Sara Anderson Noonan
la source
4

Vous trouverez ci-dessous 2 raisons à ce problème:

  1. La sauvegarde effectuée sur SQL 2012 et la restauration en-tête ont été effectuées dans SQL 2008 R2

  2. Le support de sauvegarde est corrompu.

Si nous exécutons la commande ci-dessous, nous pouvons toujours trouver une erreur réelle:

restore headeronly
from disk = 'C:\Users\Public\Database.bak'

Donnez l'emplacement complet de votre fichier de base de données dans le quot

J'espère que ça aide

Keren Caelen
la source