Errore nel restore database sql server 2005

martedì 23 dicembre 2008 - 13.06

trinity Profilo | Guru

Salve ragazzi,
prima di tutto auguri di buone feste!!!

Allora ho creato in sql server 2005 sotto sistama operativo Vista un database chiamato "statistica".
Ho installato sqlexpress su un pc con piattaforma windows xp professional ho creato un file di backup del database chiamato: statistica.bak e volevo eseguire con un programmino in vb un restore in modo da caricare tutto compreso alcuni dati già presenti nel db.

il codice che lancio è il seguente:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ma poi mi genera il seguente errore riportato nell'immagine allegata. Mi potete dare una mano?

Grazie e ciao


792x512 52Kb

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Allora ho creato in sql server 2005 sotto sistama operativo Vista
>un database chiamato "statistica".
A 64 bit

>Ho installato sqlexpress su un pc con piattaforma windows xp
>professional ho creato un file di backup del database chiamato:
>statistica.bak e volevo eseguire con un programmino in vb un
>restore in modo da caricare tutto compreso alcuni dati già presenti
>nel db.
A 32 bit

>SqlCmd.CommandText = "RESTORE DATABASE [statistica] FROM DISK
>= N'" & My.Application.Info.DirectoryPath & "\backup\statistica.bak'
>WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10"
>
>ma poi mi genera il seguente errore riportato nell'immagine allegata.
>Mi potete dare una mano?

Devi specificare la clausola WITH MOVE per dichiarare il nuovo percorso del Master Data File (.mdf) e del Transaction Log (.ldf) dato che su Xp cambia il loro percorso (banalmente manca la Program Files (x86)...).
http://msdn.microsoft.com/en-us/library/ms186858.aspx

(Esempio "D. Restoring a database and move files". Nel tuo caso dato che hai eseguito un semplice Full Backup non occorre eseguire un primo RESTORE DATABASE...WITH NORECOVERY ed il successivo RESTORE LOG...WITH RECOVERY.)

>Grazie e ciao
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Il sistema da cui ho creato il backup è vista a 64bit ma dove deve essere ripristinato può variare da winn xp a 32 o 64...

cmq cosa intendi che non avrei bisogno di effettuare il restore?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Il sistema da cui ho creato il backup è vista a 64bit ma dove
>deve essere ripristinato può variare da winn xp a 32 o 64...
0 problemi, la struttura dei data files e del t-log è esattamente la stessa.

>cmq cosa intendi che non avrei bisogno di effettuare il restore?
Hai letto male
Ti ho solo fatto notare che l'esempio D sui BOL è costutuito da 2 restore (uno del db in modalità NO RECOVERY ed uno del t-log WITH RECOVERY).
Tu dovrai banalmente eseguire un solo RESTORE specificando la clausola WITH MOVE con il nuovo path dei file .mdf ed .ldf.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

in teoria mi basterebbe fare solo una cosa del genere:

RESTORE DATABASE TestDB
FROM AdventureWorksBackups
WITH MOVE 'AdventureWorks_Data' TO 'C:\MySQLServer\testdb.mdf',
MOVE 'AdventureWorks_Log' TO 'C:\MySQLServer\testdb.ldf';
GO

ma due domande:
1) si porta con se tutte le stored e funzioni? (penso di si)
2) come faccio a sapere il percorso in cui è stato installato sqlserver, potrebbe essere "C:\" oppure "D:" e così via e poi potrebbe che i miei clienti lo installino su winxp oppure su vista quindi il percorso cambia sempre...come faccio in questo caso?

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>in teoria mi basterebbe fare solo una cosa del genere:
>
>RESTORE DATABASE TestDB
> FROM AdventureWorksBackups
>WITH MOVE 'AdventureWorks_Data' TO 'C:\MySQLServer\testdb.mdf',
> MOVE 'AdventureWorks_Log' TO 'C:\MySQLServer\testdb.ldf';
>GO
Modificando il nome del device di backup sicuramente
Inoltre verifica che l'utente utilizzato per eseguire il servizio MSSQLServer abbia le permission di full control sulla directory nella quale andrai a depositare i files .mdf ed .ldf.

>ma due domande:
>1) si porta con se tutte le stored e funzioni? (penso di si)
Ovvio, stai eseguendo il restore di un full backup

>2) come faccio a sapere il percorso in cui è stato installato
>sqlserver, potrebbe essere "C:\" oppure "D:" e così via e poi
>potrebbe che i miei clienti lo installino su winxp oppure su
>vista quindi il percorso cambia sempre...come faccio in questo
>caso?
La directory dedicata ad ospitare i data files ed i t-log è scritta nel registry:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.MSSQLSERVER\Setup

Key SQLDataRoot

(almeno, questo in SQL Server 2008; per il 2005 il percorso sarà leggermente diverso)


>Ciao e grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

e se volessi effettuare il restore di un backup di un file .bak? come devo eseguirlo calcolando sempre che ho eseguito il backup su vista a 64 e devo repristinarlo su xp?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>e se volessi effettuare il restore di un backup di un file .bak?
Utilizzi il comando RESTORE DATABASE.

>come devo eseguirlo calcolando sempre che ho eseguito il backup
>su vista a 64 e devo repristinarlo su xp?
Mi pare di averti già detto che il formato dei db è indipendente dall'OS, quindi puoi fare tutte le combinazioni che vuoi

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

ok io ho eseguito la creazione di un backup chiamato statistica.bak poi vado in vb e con il codice eseguo il seguente comando:

SqlCmd.CommandText = "RESTORE DATABASE statistica FROM DISK = '" & My.Application.Info.DirectoryPath & "\backup\statistica.bak' WITH FILE = 1,REPLACE"

ecc...

lancio il mio programma di restore su xp e mi esce che devo utilizzare il comando With Move per i file .Mdf e .Lbf

ma ricordo che in passato questo stesso codice lo utilizzavo tranquillamente solo che questa volta il backup è stato eseguito su vista mentre le altre volte sempre su xp...

Io vorrei evitare di utilizzare il With move se è possibile

ah dimeticavo il file Log come faccio a compattarlo? il database è piccolo ed il file è oltre 300Mb

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Io vorrei evitare di utilizzare il With move se è possibile
Ma hai capito a cosa serve la clausola WITH MOVE?
Se il percorso originario dei files .mdf, .ldf ed .ndf è DIFFERENTE rispetto a quello del PC di destinazione, SEI OBBLIGATO ad utilizzare la clausola WITH MOVE specificando il NUOVO percorso.
Dato che ha eseguito un backup su un OS a 64bit, il path è necessariamente differente rispetto ad un OS a 32bit (banalmente i db si trovano sotto Program Files (x86)), quindi DEVI utilizzare la clausola WITH MOVE.

>ah dimeticavo il file Log come faccio a compattarlo? il database
>è piccolo ed il file è oltre 300Mb
http://www.dotnethell.it/tips/ShrinkTLOGSql2000.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

sono riuscito a fare questo comando e il programma mi ha detto che è andato tutto bene ecco il codice:

SqlCmd.CommandText = "RESTORE DATABASE [statistica] FROM DISK = N'" & My.Application.Info.DirectoryPath & "\backup\statistica.bak' With Move 'statistica' TO 'C:\Programmi\Microsoft Sql Server\MSSQL.1\MSSQL\data\statistica.mdf', Move 'statistica_log' TO 'C:\Programmi\Microsoft Sql Server\MSSQL.1\MSSQL\data\statistica.ldf'"

solo che se faccio una connessione semplice tramite un mio applicativo il risultato è che non si connette al database statistica, nella cartella di xp ci sono i file perfettamente trasferiti (almeno sembra)...devo eseguire qualcos'altro dopo il restore?


ho eseguito anche il comando : DBCC SHRINKFILE (statistica_log,10)
ma se vado nella cartella data le dimensioni del log non sono variate....perchè?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>devo eseguire qualcos'altro dopo il restore?
Che errore ottieni?
Hai verificato che il db abbia un owner valido?
Se utilizzi la SQL Server Authentication hai ridefinito le login riassociato ai tuoi user accounts con il comando
ALTER USER userName WITH LOGIN = loginName;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lbenaglia Profilo | Guru

>ho eseguito anche il comando : DBCC SHRINKFILE (statistica_log,10)
>ma se vado nella cartella data le dimensioni del log non sono
>variate....perchè?
Perché hai letto superficialmente il mio tip

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

In teoria ho settatto tutto sia user che pass ora installo sql management studio sul pc e provo a vedere se il database si riesce ad aprire e e ci sono tutti i dati, almeno così provo a vedere se il mio restore è andato a buonfine...
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

trinity Profilo | Guru

dovevo prima eseguire questo che scrivi:

.....Per rimuovere dal transaction log le transazioni scritte nel database durante il checkpoint, puoi utilizzare il comando T-SQL BACKUP LOG. Se non ti interessa creare un file di backup, puoi specificare le opzioni WITH NO_LOG oppure TRUNCATE_ONLY (sono sinonimi)....

e poi il comando DBCC SHRINKFILE ()...

Giusto?

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Giusto?
Giusto

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Ultima cosa, tempo fa mi dicevi in un post mi consigliavi di creare un database con il modello di recupero=registrazione minima. In modo tale da poter evitare di creare un .ldf enorme, ma ovviamente in caso di crash non potevo recuperare + tutti i dati avvenuti dopo il crash del database, (giusto)...mi consigli ancora questa politica tenendo in considerazione che il mio database avrà due tabella che saranno nel corso del tempo grandi come mole di dati. Secondo leggevo nelle opzioni che ci sono due voci impostate su False e sarebbero: "Chiusura automatica e compattazione automatica" mi consigli di lasciarli a false o impostarli su true?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

trinity Profilo | Guru

Ma ormai il file Ldf nella cartella data che è di 314mb non posso + ridurlo?

secondo il database che ho ripristinato con il move funziona tramite sql server management ora devo solo capire perchè non mi si apre con il comando:

Db.ConnectionString = " Data Source=LocalHost\SQLEXPRESS;Initial Catalog=statistica;Integrated Security=SSPI;"

Terzo c'è un modo di criptare il database oppure proteggerlo? Mi spiego qualsiasi persona che ha un pò di dimestichezza può scaricare ed ilnstallare Sql Server Menegement e così come è impostato il mio database, si può aprire tranquillamente, vedere e modificare tabelle, dati e stored...
Io vorrei evitarlo come si può mettere una password solamente al db così da evitare che si possa aprire dal Tool di sql server?

Ciao


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Ultima cosa, tempo fa mi dicevi in un post mi consigliavi di
>creare un database con il modello di recupero=registrazione minima.
>In modo tale da poter evitare di creare un .ldf enorme, ma ovviamente
>in caso di crash non potevo recuperare + tutti i dati avvenuti
>dopo il crash del database, (giusto)
Il Simple Recovery Model ti permette di recuperare il db all'ultimo backup (full + eventuali differenziali).

>...mi consigli ancora questa
>politica tenendo in considerazione che il mio database avrà due
>tabella che saranno nel corso del tempo grandi come mole di dati.
La mole di dati non ha niente a che vedere con il recovery model e le politiche di backup.
Sei tu che devi decidere cosa vuoi fare.

>Secondo leggevo nelle opzioni che ci sono due voci impostate
>su False e sarebbero: "Chiusura automatica e compattazione automatica"
>mi consigli di lasciarli a false o impostarli su true?
No, lasciale a false.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lbenaglia Profilo | Guru

>Ma ormai il file Ldf nella cartella data che è di 314mb non posso
>+ ridurlo?
Lo puoi ridurre fino al termine del logical log attivo:
http://msdn.microsoft.com/en-us/library/ms178037.aspx

>secondo il database che ho ripristinato con il move funziona
>tramite sql server management ora devo solo capire perchè non
>mi si apre con il comando:
>
>Db.ConnectionString = " Data Source=LocalHost\SQLEXPRESS;Initial
>Catalog=statistica;Integrated Security=SSPI;"
Se utilizzi localhost devi aver abilitato il protocolo TCP/IP.
Se non hai necessità di accedere al db da un client esterno, NON abilitare il protocollo TCP/IP e modifica la connection string nel seguente modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>Terzo c'è un modo di criptare il database oppure proteggerlo?
http://msdn.microsoft.com/en-us/library/bb510663.aspx

>Mi spiego qualsiasi persona che ha un pò di dimestichezza può
>scaricare ed ilnstallare Sql Server Menegement e così come è
>impostato il mio database, si può aprire tranquillamente, vedere
>e modificare tabelle, dati e stored...
Dipende, per autenticarsi all'istanza necessita di una apposita login, certo che se si autentica a Windows con un utente appartenente al gruppo locale Administrators...

>Io vorrei evitarlo come si può mettere una password solamente
>al db così da evitare che si possa aprire dal Tool di sql server?
No.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Lorenzo buongiorno e prima di tutto buon anno...
Ho fatto in questi giorni un pò di prove e letot i book, ci sono riuscito a compattare con DBCC SHRINKFILE il file log...leggevo ora come proteggere il database...ora ti chiedo veloce alcune cose:

1 come posso crittografare le stored mi ricordo che c'è una procedura anzi comando da inserire prima del codice della stored
2 io devo inviare ad un cliente un dabase di prova, se questo tizio è un esperto informatico basta che installa sql management server esegue una autenticazione windows ed entra nel database, giusto? se fosse così io devo evitare tutto ciò, cosa mi puoi consigliare? Tieni presente però che in teoria non dovrebbero installare nessun tool a meno che non lo faccio io ma sai nel nostro campo pur di provare a vedere come è stato progettando un db o software si cerca in ogni modo di accedere da ogni parte...
leggevo delle chiavi asimmetriche e simmetriche solo che io devo installare un db o su un sostema xp o vista, quindi in teoria dovrei scegliere anche quelle che funzionano su questi sistemi...queste chivi mi permettono di proteggere l'intero database o le tabelle (ovviamente la loro struttura e stored)

dimenticavo che se ovviamente il mio cliente o chi per esso sul computer dove installeranno il db ripristinato e il software fatto da me che gestisce il db, hanno le credenziali amministrative per il Server SQL posso mettere la password che voglio ma ci accederanno sempre con l'utente Windows, giusto? ecco perchè mi serivirebbe proprio che quando per esempio decidono di vedere la struttura delle tabelle o delel stored, queste siano criptate...
ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>1 come posso crittografare le stored mi ricordo che c'è una procedura
>anzi comando da inserire prima del codice della stored
Specifica la clausola WITH ENCRYPTION.

>2 io devo inviare ad un cliente un dabase di prova, se questo
>tizio è un esperto informatico basta che installa sql management
>server esegue una autenticazione windows ed entra nel database,
>giusto? se fosse così io devo evitare tutto ciò, cosa mi puoi
>consigliare?
Non puoi evitarlo dato che il tuo cliente sarà sicuramente sysadmin della SUA istanza, di conseguenza a avrà tutte le permission per curiosare nel SUO db (ed è giusto che sia così visto che il db nel momento in cui glielo vendi, diventerà di sua proprietà).

>Tieni presente però che in teoria non dovrebbero
>installare nessun tool a meno che non lo faccio io ma sai nel
>nostro campo pur di provare a vedere come è stato progettando
>un db o software si cerca in ogni modo di accedere da ogni parte...
Il cliente può fare quello che vuole con la SUA istanza.

>leggevo delle chiavi asimmetriche e simmetriche solo che io devo
>installare un db o su un sostema xp o vista, quindi in teoria
>dovrei scegliere anche quelle che funzionano su questi sistemi...queste
>chivi mi permettono di proteggere l'intero database o le tabelle
>(ovviamente la loro struttura e stored)
Solo i dati, non la struttura.

>dimenticavo che se ovviamente il mio cliente o chi per esso sul
>computer dove installeranno il db ripristinato e il software
>fatto da me che gestisce il db, hanno le credenziali amministrative
>per il Server SQL posso mettere la password che voglio ma ci
>accederanno sempre con l'utente Windows, giusto? ecco perchè
>mi serivirebbe proprio che quando per esempio decidono di vedere
>la struttura delle tabelle o delel stored, queste siano criptate...
Il body delle viste/udf/stored procedure puoi crittarlo con la clausola WITH ENCRYPTION, ma i dati e la struttura delle tabelle rimangono giustamente in chiaro.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

>>1 come posso crittografare le stored mi ricordo che c'è una procedura
>>anzi comando da inserire prima del codice della stored
>Specifica la clausola WITH ENCRYPTION.

una volta inserito la clausola WITH ENCRYPTION. la stored o la funzione posso sempre riaprirla con Sql server Management per poterla modificare?

Grazie per il resto delle risposte :-)
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>una volta inserito la clausola WITH ENCRYPTION. la stored o la
>funzione posso sempre riaprirla con Sql server Management per
>poterla modificare?
No, devi salvarti lo script in chiaro per eventuali editing futuri.

>Grazie per il resto delle risposte :-)
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

>>una volta inserito la clausola WITH ENCRYPTION. la stored o la
>>funzione posso sempre riaprirla con Sql server Management per
>>poterla modificare?
>No, devi salvarti lo script in chiaro per eventuali editing futuri.
ok grazie.

senti ma che tu sappia in vista a 32 o 64 bit la dir nel registro di configurazione di sql server per trovare la sqldataroot è sempre la stessa o cambia?

ciao
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>senti ma che tu sappia in vista a 32 o 64 bit la dir nel registro
>di configurazione di sql server per trovare la sqldataroot è
>sempre la stessa o cambia?

Rispondo "a naso" dato che non ho mai usato Vista a 64bit: i due percorsi dovrebbero essere identici a parità di nomenclatura dell'istanza.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5