tips & tricks


Calendario
aprile 2024
lmmgvsd
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

Spostare i database di un'istanza sql2005

 Hai cannato l'installazione di un'istanza sql e non hai cambiato il default dove andare a piazzare il DB?

In effetti è abbastanza facile sbagliare il percorso di installazione del db perchè sql di default ti propone un percorso e non ti chiede se vuoi cambiarlo ma lo devi capire tu nel wizzard, chiaramente se non sei un esperto è facile farselo sfuggire. Il percorso che ti propone lui di default è "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data" che se propio vogliamo vedere non è molto corretto, perchè i dati non centrano un cazzo nella cartella dei programmi, e se un giorno devo formattare o reistallare qualcosa devo spostare il db o recuperare i dati. Mentre l'ideale è creare i file di db su un'altro disco, insieme hai backup.

Cmq ora il danno è fatto...parlo per esperienza personale, per recuperare e spostare il db da un'altra parte bisogna seguire una procedura abbastanza delicata.              
Per prima cosa bisogna mandare offline i DB che si vogliono spostare per farlo si può usare questo script:

use master
go

declare @status nvarchar(10);
--set @status = 'offline'
set @status = 'online'

declare stmts cursor local fast_forward for
  select 'alter database ' + quotename(name) + ' set ' + @status
  from sys.databases
  where owner_sid <> 0x01

open stmts

declare @sql nvarchar(max)
while 1 = 1
  begin
    fetch stmts into @sql
    if @@fetch_status <> 0 break

    print @sql
    execute(@sql)
  end

close stmts
deallocate stmts
go

Dopo di chè quando i DB sono offline posso cambiargli il puntamento. Se per caso non riesco a mandarli offline è probabilmente perchè c'è qualche processo che li blocca e quindi prima bisogna killare questi processi usando la sp_who2, per capire chi stà loccando il DB ,e lanciare il comando kill.

Per cambiare il puntamento dei DB posso usare questo script:

use master
go

declare @path nvarchar(250); set @path = 'E:\DataBase'
declare @inst_name nvarchar(250); set @inst_name = 'ins02'

declare stmts cursor local fast_forward for
  select
/*'!!dir ' + replace(
          @path + '\' + @inst_name +  '\' + d.name 
          + case mf.type
              when 4 then ''
              else + '\' + right(physical_name,charindex('\',reverse(physical_name))-1)
            end
          ,'''', '''''')
*/
'alter database ' + quotename(d.name)
       + ' modify file (name = ' + quotename(mf.name)
       + ', filename = ''' + replace(
          @path + '\' + @inst_name +  '\' + d.name 
          + case mf.type
              when 4 then ''
              else + '\' + right(physical_name,charindex('\',reverse(physical_name))-1)
            end
          ,'''', '''''')
       + ''')'
  from
       sys.master_files mf
  join sys.databases    d
    on mf.database_id = d.database_id
  where d.owner_sid <> 0x01

open stmts

declare @sql nvarchar(max)
while 1 = 1
  begin
    fetch stmts into @sql
    if @@fetch_status <> 0 break

    --print(@sql)
    execute(@sql)
  end

close stmts
deallocate stmts
go

E infine fatti i dovuti controlli posso rimettere i DB online.

Categoria: SQLServer
venerdì, 18 lug 2008 Ore. 11.54
Archivio Posts
Anno 2020

Anno 2018

Anno 2015

Anno 2013

Anno 2011

Anno 2010

Anno 2009

Anno 2008
Statistiche
  • Views Home Page: 13.370
  • Views Posts: 56.120
  • Views Gallerie: 2.837
  • n° Posts: 117
  • n° Commenti: 1
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003