Services e Backup/Restore

mercoledì 13 ottobre 2010 - 14.14

vittosss Profilo | Junior Member

Ciao a tutti,
parliamo di sql server 2000 sp4 (ma prossimamente dovrebbe essere 2008).

vorrei fare uno script schedulato in modo tale che, ogni notte, un comando mi disattivi 2 services di windows, venga fatto un backup di un db e il suo restore su un altro db quindi riattivazione dei servizi windows.
naturalmente il grosso dubbio riguarda i servizi. da cmd net start e net stop attivano e disattivano i servizi. ok. ma come farli girare magari all'interno di un job schedulato sql server?
ricordo un osql...
sqlscmd?

grazie a tutti
V.

lbenaglia Profilo | Guru

>Ciao a tutti,
>parliamo di sql server 2000 sp4 (ma prossimamente dovrebbe essere
>2008).
>
>vorrei fare uno script schedulato in modo tale che, ogni notte,
>un comando mi disattivi 2 services di windows, venga fatto un
>backup di un db e il suo restore su un altro db quindi riattivazione
>dei servizi windows.
Perché? il comando di BACKUP DATABASE è una operazione online e garantisce una copia consistente del db anche a servizi avviati.
Oltre ai datafile verrà copiata anche una porzione del t-log. In fase di restore verrà utilizzata durante il recovery per propoagare ai datafile eventuali transazioni non ancora commitate ed annullando quelle in corso ma mai terminate.

>naturalmente il grosso dubbio riguarda i servizi. da cmd net
>start e net stop attivano e disattivano i servizi. ok. ma come
>farli girare magari all'interno di un job schedulato sql server?
>ricordo un osql...
>sqlscmd?
Come ho scritto sopra il tuo è un non problema

>grazie a tutti
Prego.

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

vittosss Profilo | Junior Member

solo perchè il db viene tenuto bloccato dal servizio e questo me ne impedisce il restore.

lbenaglia Profilo | Guru

>solo perchè il db viene tenuto bloccato dal servizio e questo
>me ne impedisce il restore.
Il restore di un backup si esegue con il comando RESTORE DATABASE.
Se stai tentando di sovrascrivere un db esistente è sufficiente specificare la clausola WITH REPLACE.

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

vittosss Profilo | Junior Member

Lorenzo ciao,
perdonami ma non so se ho capito bene.
ho un'applicazione non microsoft che usa questi db. una sorta di "ascoltatore" del db. 1 servizio per n db. se io prendo il primo db, ne faccio un backup e lo voglio restorare sul secondo db mi viene detto che non è possibile perchè è in uso. se entro nei services di windows, disattivo il mio servizio e lancio il restore, a questo punto, funziona.

il db è già esistente si ma la clausula "with replace" non sembra funzionare nel mio caso.

ciao e grazie per l'attenzione che mi stai dedicando.

V.

lbenaglia Profilo | Guru

>ho un'applicazione non microsoft che usa questi db. una sorta
>di "ascoltatore" del db. 1 servizio per n db. se io prendo il
>primo db, ne faccio un backup e lo voglio restorare sul secondo
>db mi viene detto che non è possibile perchè è in uso. se entro
>nei services di windows, disattivo il mio servizio e lancio il
>restore, a questo punto, funziona.
>
>il db è già esistente si ma la clausula "with replace" non sembra
>funzionare nel mio caso.

Prima di tutto intendiamoci sui termini: io con db intendo database, con istanza una installazione di SQL Server.
Ora, puoi spiegare meglio qual è la tua esigenza?

Per eseguire backup e restore di database non è richiesto di arrestare alcun servizio relativo a SQL Server.

>ciao e grazie per l'attenzione che mi stai dedicando.
Prego.

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

vittosss Profilo | Junior Member

ma io non ho parlato, mi sembra, di servizi sql ma di servizi windows.
vado a rileggermi che magari ho scritto boiate.

comunque si, anche io intendo db come database legato a istanza.

comunque immagina di avere un applicativo appoggiato su db sql. questo applicativo ha dei suoi servizi windows. se non arresto questi servizi il db rimane in stato lock.
devo arrestare i servizi della mia applicazione per poter fare un restore.

lbenaglia Profilo | Guru

>ma io non ho parlato, mi sembra, di servizi sql ma di servizi
>windows.
I servizi di SQL Server sono servizi Windows

>comunque immagina di avere un applicativo appoggiato su db sql.
>questo applicativo ha dei suoi servizi windows. se non arresto
>questi servizi il db rimane in stato lock.
>devo arrestare i servizi della mia applicazione per poter fare
>un restore.
Il comando di restore di un full backup può essere eseguito solo se la login amministrativa che sta eseguendo il comando è l'unica connessa al db (quindi non possono esserci altre connessioni al db).
Per "stroncare" tutte le altre connessioni puoi eseguire il comando:

ALTER DATABASE <nome db> SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

A questo punto puoi procedere con il restore (specificando la clausola WITH REPLACE).
Una volta terminato il restore puoi riabilitare la multiutenza con il comando:

ALTER DATABASE <nome db> SET MULTI_USER;

Ora, in base a come sono stati scritti gli applicativi client, può essere che riaprano automaticamente la connessione, altrimenti ciccia e ti tocca riavviarli

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

vittosss Profilo | Junior Member

ciao lorenzo,
grazie mille per la risposta.
dunque, devo onestamente provare la soluzione da te proposta in quanto, te la spiego terra terra, ho questo servizio di windows della mia applicazione che continua a tenere in "ascolto" il db.
ti faccio un esempio. vado sul db, tasto destro, task, detach... li vedo le connessioni attive sul db. se le tiro giù (kill) il secondo dopo tornano su perchè il servizio windows li riaggancia al db.
disattivo dunque il servizio, levo le eventuali connessioni appese, e faccio il restore. questo è l'iter manuale che faccio ogni volta. questo è quello che vorrei fare in maniera automatizzata.
non sono sicurissimo, ma devo provare, che settando il db come single user funzioni. ma stai pure certo certo che provo.

stavo anche verificando come fare il restore via script (perdonami, mi vergogno ma da script non l'ho mai fatto). devo fare il Backup di A e restorarlo su B. backup di A non è un problema. portarlo su B qualche rogna me la da.

declare @file varchar(2000)
set @file = 'c:\Temp\A.bak'
restore filelistonly from disk=@file
restore database B from disk=@file
with
replace,
move 'A_Data' to 'c:\MSSQL\MSSQL$SL7\Data\B.mdf',
move 'A_Log' to 'c:\MSSQL\MSSQL$SL7\Data\B_log.ldf'

ti torna?

e ancora grazie mille

lbenaglia Profilo | Guru

...

vittosss Profilo | Junior Member

sto solo cercando di arrivare da un punto all'altro senza conoscerne la strada.

in ogni caso, grazie per il supporto
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5