Spostamento dei database utente

In SQL Server è possibile spostare i file di dati, di log e del catalogo full-text di un database definito dall'utente specificando la nuova posizione del file nella clausola FILENAME dell'istruzione ALTER DATABASE. Questo metodo è valido per lo spostamento dei file del database all'interno della stessa istanza di SQL Server. Per spostare un database in un'altra istanza di SQL Server o in un altro server, utilizzare le operazioni di backup e ripristino o di collegamento e scollegamento.

[!NOTA]

Alcune funzionalità del Motore di database di SQL Server comportano una modifica della modalità di archiviazione delle informazioni nei file di database da parte del Motore di database. Queste funzionalità sono disponibili solo in edizioni specifiche di SQL Server. Un database che contiene queste funzionalità non può essere spostato a un'edizione di SQL Server che non le supporta. Utilizzare la vista a gestione dinamica sys.dm_db_persisted_sku_features per ottenere un elenco di tutte le funzionalità specifiche dell'edizione abilitate nel database corrente.

Le procedure descritte in questo argomento richiedono il nome logico dei file di database. Per ottenere il nome, eseguire una query nella colonna name della vista del catalogo sys.master_files.

[!NOTA]

Quando si sposta un database in un'altra istanza del server, per garantire un sistema consistente a utenti e applicazioni, potrebbe essere necessario ricreare tutti i metadati del database o parte di essi. Per ulteriori informazioni, vedere Gestione dei metadati quando si rende disponibile un database in un'altra istanza del server.

Procedura di rilocazione pianificata

Per spostare un file di dati o di log nell'ambito di una rilocazione pianificata, eseguire la procedura seguente:

  1. Eseguire l'istruzione seguente.

    ALTER DATABASE database_name SET OFFLINE
    
  2. Spostare il file o i file nella nuova posizione.

  3. Per ogni file che si desidera spostare, eseguire l'istruzione seguente.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' )
    
  4. Eseguire l'istruzione seguente.

    ALTER DATABASE database_name SET ONLINE
    
  5. Verificare la modifica del file eseguendo la query seguente.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Rilocazione per una manutenzione pianificata del disco

Per rilocare un file nell'ambito di un processo di manutenzione pianificata del disco, eseguire la procedura seguente:

  1. Per ogni file che si desidera spostare, eseguire l'istruzione seguente.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
    
  2. Interrompere l'istanza di SQL Server o arrestare il sistema per eseguire la manutenzione. Per ulteriori informazioni, vedere Interruzione di servizi.

  3. Spostare il file o i file nella nuova posizione.

  4. Riavviare l'istanza di SQL Server o il server. Per ulteriori informazioni, vedere Avvio e riavvio di servizi.

  5. Verificare la modifica del file eseguendo la query seguente.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Procedura di recupero da errore

Se è necessario spostare un file a causa di un errore hardware, eseguire la procedura seguente per rilocare il file in una nuova posizione.

Nota importanteImportante

Se non è possibile avviare il database, ovvero se il database è in modalità sospetta o in stato non recuperato, il file può essere spostato solo dai membri del ruolo predefinito sysadmin.

  1. Interrompere l'istanza di SQL Server, se avviata.

  2. Avviare l'istanza di SQL Server in modalità di recupero del solo database master digitando uno dei comandi seguenti al prompt dei comandi.

    • Per l'istanza predefinita (MSSQLSERVER), eseguire il comando seguente.

      NET START MSSQLSERVER /f /T3608
      
    • Per un'istanza denominata, eseguire il comando seguente.

      NET START MSSQL$instancename /f /T3608
      

    Per ulteriori informazioni, vedere Procedura: Avvio di un'istanza di SQL Server (comandi net).

  3. Per ogni file che si desidera spostare, utilizzare i comandi sqlcmd oppure SQL Server Management Studio per eseguire l'istruzione seguente.

    ALTER DATABASE database_name MODIFY FILE( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
    

    Per ulteriori informazioni sull'utilizzo dell'utilità sqlcmd, vedere Utilizzo dell'utilità sqlcmd.

  4. Chiudere l'utilità sqlcmd o SQL Server Management Studio.

  5. Interrompere l'istanza di SQL Server.

  6. Spostare il file o i file nella nuova posizione.

  7. Avviare l'istanza di SQL Server. Ad esempio, eseguire: NET START MSSQLSERVER. NET START MSSQLSERVER.

  8. Verificare la modifica ai file eseguendo la query seguente.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Spostamento dei cataloghi full-text

Per spostare un catalogo full-text, eseguire la procedura seguente. Si noti che quando si specifica la nuova posizione del catalogo, viene specificato solo new_path anziché new_path/os_file_name.

  1. Eseguire l'istruzione seguente.

    ALTER DATABASE database_name SET OFFLINE
    
  2. Spostare il catalogo full-text nella nuova posizione.

  3. Eseguire l'istruzione seguente, dove logical_name è il valore nella colonna name di sys.database_files e new_path è la nuova posizione del catalogo.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path')
    
  4. Eseguire l'istruzione seguente.

    ALTER DATABASE database_name SET ONLINE
    

In alternativa, è possibile utilizzare la clausola FOR ATTACH dell'istruzione CREATE DATABASE per spostare un catalogo full-text. Nell'esempio seguente viene creato un catalogo full-text nel database AdventureWorks. Per spostare il catalogo full-text in una nuova posizione, il database AdventureWorks viene scollegato e il catalogo full-text viene spostato fisicamente nella nuova posizione. È quindi necessario collegare il database specificando la nuova posizione del catalogo full-text.

USE AdventureWorks;
CREATE FULLTEXT CATALOG AdvWksFtCat AS DEFAULT;
GO
USE master;
GO
--Detach the AdventureWorks database.
sp_detach_db AdventureWorks;
GO
--Physically move the full-text catalog to the new location.
--Attach the AdventureWorks database and specify the new location of the full-text catalog.
CREATE DATABASE AdventureWorks ON 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_Data.mdf'), 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_log.ldf'),
    (FILENAME = 'c:\myFTCatalogs\AdvWksFtCat')
FOR ATTACH;
GO

Esempi

Nell'esempio seguente il file di log del database AdventureWorks viene spostato in una nuova posizione nell'ambito di una rilocazione pianificata.

USE master;
GO
-- Return the logical file name.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks')
    AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks SET OFFLINE;
GO
-- Physically move the file to a new location.
-- In the following statement, modify the path specified in FILENAME to
-- the new location of the file on your server.
ALTER DATABASE AdventureWorks 
    MODIFY FILE ( NAME = AdventureWorks_Log, 
                  FILENAME = 'C:\NewLoc\AdventureWorks_Log.ldf');
GO
ALTER DATABASE AdventureWorks SET ONLINE;
GO
--Verify the new location.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks')
    AND type_desc = N'LOG';