Spostare database utente

Si applica a: SQL Server

In SQL Server è possibile spostare i file di dati, di log e del catalogo full-text di un database utente specificando il nuovo percorso 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, usare le operazioni di backup e ripristino o di collegamento e scollegamento.

Nota

Questo articolo riguarda lo spostamento di file di database dell'utente. Per lo spostamento dei file di database di sistema, vedere Spostare i database di sistema.

Considerazioni

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

Alcune funzionalità del motore di database di SQL Server comportano una modifica della modalità di archiviazione delle informazioni nei file 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 caratteristiche specifiche dell'edizione abilitate nel database corrente.

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

I cataloghi full-text sono integrati nel database anziché essere archiviati nel file system. I cataloghi full-text vengono spostati automaticamente quando si sposta un database.

Nota

Assicurarsi che l'account del servizio per gli account del servizio di Windows e le autorizzazioni dispongano delle autorizzazioni per il nuovo percorso del file system. Per altre informazioni, vedere Configurare le autorizzazioni del file system per l'accesso al motore di database.

Procedura di rilocazione pianificata

Per spostare un file di dati o di log nell'ambito di una rilocazione pianificata, 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. Eseguire la seguente istruzione per portare offline il database.

    ALTER DATABASE database_name
        SET OFFLINE;
    

    Questa azione richiede l'accesso esclusivo al database. Se un'altra connessione è aperta al database, l'istruzione ALTER DATABASE verrà bloccata fino alla chiusura di tutte le connessioni. Per sostituire questo comportamento, usare la clausola WITH <termination>. Ad esempio, per eseguire automaticamente il rollback e disconnettere tutte le altre connessioni al database, usare:

    ALTER DATABASE database_name
         SET OFFLINE
         WITH ROLLBACK IMMEDIATE;
    
  3. Spostare il file o i file nella nuova posizione.

  4. Eseguire l'istruzione seguente.

    ALTER DATABASE database_name
        SET ONLINE;
    
  5. Verificare la modifica ai file eseguendo la query riportata di seguito.

    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. Arrestare l'istanza di SQL Server o spegnere il sistema per eseguire la manutenzione. Per ulteriori informazioni, vedere Avviare, arrestare, sospendere, riprendere e riavviare i servizi SQL Server.

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

  4. Riavviare il servizio SQL Server per l'istanza del server. Per ulteriori informazioni, vedere Avviare, arrestare, sospendere, riprendere e riavviare i servizi SQL Server

  5. Verificare la modifica ai file eseguendo la query riportata di seguito.

    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.

Importante

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. Arrestare l'istanza di SQL Server, se già avviata.

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

  3. Per ogni file da spostare, usare i comandi sqlcmd oppure SQL Server Management Studio per eseguire la seguente istruzione.

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

    Per altre informazioni su come usare l'utilità sqlcmd, vedere Usare l'utilità sqlcmd.

  4. Uscire dall'utilità sqlcmd o da SQL Server Management Studio.

  5. Arrestare 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.

  8. Verificare la modifica ai file eseguendo la query riportata di seguito.

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

Esempi

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

  1. Assicurarsi di essere nel contesto del database master.

    USE master;
    GO
    
  2. Restituire il nome logico del file.

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';
    GO
    
  3. Impostare il database come offline.

    ALTER DATABASE AdventureWorks2022
        SET OFFLINE;
    GO
    
  4. Spostare fisicamente il dispositivo in una nuova posizione. Nell'istruzione seguente, modificare il percorso specificato in FILENAME nel nuovo percorso del file nel server.

    ALTER DATABASE AdventureWorks2022
        MODIFY FILE (NAME = AdventureWorks2022_Log, FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');
    GO
    
    ALTER DATABASE AdventureWorks2022
        SET ONLINE;
    GO
    
  5. Verificare la nuova posizione.

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';