Come posso spostare i file di database di SQL Server?


103

Ho un database e voglio spostare i file .mdfe .ldfin un'altra posizione. Ma non voglio interrompere il MSSQLSERVERservizio e non voglio esportare su un altro server.

Come posso fare questo?

Risposte:


155

Non è necessario arrestare il servizio SQL Server per spostare i file di database, ma è necessario portare offline il database specifico. Ciò è dovuto al fatto che non è possibile spostare i file mentre sono accessibili e la disattivazione del database interrompe l'utilizzo dei file dall'applicazione SQL Server.

Il processo per spostarli è abbastanza semplice. Stacca / Collega era già stato descritto, ma non è quasi così complesso.

Cambia i percorsi dei file con un ALTER DATABASEcomando:

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

Nota, non è necessario dichiarare la vecchia posizione in questo comando. La modifica di questo percorso non ha effetto immediato, ma verrà utilizzata al successivo avvio del database.

Imposta il database offline

(Uso WITH ROLLBACK IMMEDIATEper eliminare tutti e ripristinare tutte le transazioni attualmente aperte)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Sposta / copia i file nella nuova posizione

Basta copiare i file usando il tuo metodo preferito (Click 'n Drag, XCopy, Copy-Item, Robocopy)

Porta il database online

ALTER DATABASE foo SET ONLINE;

Puoi vederlo descritto in modo più dettagliato qui .


13
Questo ha funzionato per me. Nel mio caso ho anche dovuto spostare anche il file LDF usando il primo comando: es. USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
Dewi Rees,

1
Inoltre, può essere utilizzato per spostare i file dell'indice di testo completo semplicemente aggiornando il nome del file in modo che corrisponda a quello che vedi nella finestra di dialogo dei file.
DShook,

24
Dopo aver spostato i file di database, assicurarsi che l'utente "NT SERVICE \ MSSQLSERVER" disponga delle autorizzazioni o si verifichino errori quando si tenta di riportare il database in linea.
Demonslay335,

Quale dovrebbe essere il "nome"? Nella documentazione ha "nome_logico". Cosa vogliono dire?
johnny,

2
@mlhDev In realtà nel mio caso l' MODIFY FILEordine è modificabile. Se esegui MODIFY FILE per primo, ti dirà che il comando viene eseguito correttamente e la posizione verrà modificata dopo un'operazione offline-online (la formulazione è diversa ma ottieni l'idea). L'ordine Offline-> Sposta file-> Online è importante, tuttavia, per ovvie ragioni. Contrassegna anche la nota di Demonslay335. L'autorizzazione del file è importante.
Lionet Chen,

50

I file MDF e LDF sono protetti e non possono essere spostati mentre il database è online.

Se non ti dispiace interrompere il funzionamento del database, puoi DETACHfarlo, spostare i file e poi ATTACH.

  • Fare clic con il tasto destro sul nome del database
  • Selezionare Properties
  • Vai alla Filesscheda
  • Prendere nota del Pathe FileNamedei file LDF e MDF . Questo passaggio è importante nel caso in cui non si desideri finire per cercare file mancanti ...
  • Fare clic con il tasto destro sul nome del database
  • Selezionare Tasks -> Detach
  • Sposta i file dove vuoi
  • Fare clic con il tasto destro sul Databasesnodo del server
  • Selezionare Attach
  • Clicca sul Addbottone
  • Indica la nuova posizione
  • Clic OK

Dovresti essere a posto ora. Informazioni sul processo DETACH- ATTACHsono disponibili qui .

Nel link about DETACH- ATTACHvi è una raccomandazione di usare ALTER DATABASEstatement se si mantiene il database nella stessa istanza di SQL Server. Ulteriori riferimenti in Sposta database utenti .

Se vuoi mantenerlo in funzione mentre ti muovi, fai un BACKUP- RESTORE. Nel processo di ripristino è possibile definire la nuova posizione dei file del database.


3
Consiglio di aprire SQL Management Studio come amministratore per evitare problemi di accesso ai file durante il ricollegamento
Simon_Weaver

6

Per spostare i file del database di sistema, attenersi alla seguente procedura:

  1. Accedi come utente in SSMS

  2. Effettuare un backup del database creato dall'utente per sicurezza.

  3. Uccidi tutte le sessioni connesse al server da SSMS.

  4. Eseguire il comando seguente per verificare la posizione del file corrente dei database di sistema:

    USE master;
    SELECT * FROM sys.master_files;

Identificare il percorso e annotare il percorso corrente dei file.

  1. Utilizzare TSQL per modificare il percorso del file per tutto il database tranne master:

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

Per esempio:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

Ora il percorso del file è stato modificato.

Assicurati di spostare sia i file ldf che mdf

  1. In SSMS fare clic con il pulsante destro del mouse sul server e selezionare le proprietà. All'interno delle proprietà vai su Impostazioni database. Modificare le posizioni predefinite del database per Dati e Registro nel percorso di destinazione. Disconnettersi dal server.

    Ad esempio: passare C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\aE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Arresta l'istanza di SQL Server.

  3. Copia il file o i file nella nuova posizione. Utilizzare Robocopy per spostare i file per copiare le autorizzazioni di accesso nella cartella di destinazione. Apri cmd ed esegui come amministratore e usa il comando seguente:

    robocopy / sec sourceCartella destinazioneCartella

È meglio andare alla posizione di origine per eseguire il comando. Elimina altri file diversi dai file di database di sistema che vengono copiati. Per esempio:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(Qui stiamo spostando tutti i file del database di sistema in una nuova posizione.)

  1. Dal menu Start, scegliere Tutti i programmi, Microsoft SQL Server, Strumenti di configurazione e quindi Gestione configurazione SQL Server.

Eseguire le seguenti operazioni in Gestione configurazione SQL Server:

Nel nodo Servizi SQL Server, fare clic con il pulsante destro del mouse sull'istanza di SQL Server (ad esempio, SQL Server (MSSQLSERVER)) e selezionare Proprietà. Nella finestra di dialogo Proprietà di SQL Server (nome_istanza), fare clic sulla scheda Parametri di avvio. Nella casella Parametri esistenti, selezionare il parametro –d per spostare il file di dati principale. Fai clic su Aggiorna per salvare la modifica. Nella casella Specificare un parametro di avvio, modificare il parametro nel nuovo percorso del database master. Nella casella Parametri esistenti, selezionare il parametro –l per spostare il file di registro principale. Fai clic su Aggiorna per salvare la modifica. Nella casella Specificare un parametro di avvio, modificare il parametro nel nuovo percorso del database master.

Il valore del parametro per il file di dati deve seguire il parametro -d e il valore per il file di registro deve seguire il parametro -l. L'esempio seguente mostra i valori dei parametri per l'ubicazione predefinita del file di dati master.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Se il trasferimento pianificato per il file di dati master è E: \ SQLData, i valori dei parametri verrebbero modificati come segue:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Arrestare l'istanza di SQL Server facendo clic con il pulsante destro del mouse sul nome dell'istanza e selezionando Arresta. Riavviare l'istanza di SQL Server.

  1. Accedi come sautente in SSMS e verifica la posizione dei file del database eseguendo la seguente query:

    USE master;
    SELECT * FROM sys.master_files;

Tutto fatto.


È possibile utilizzare la funzione SQL in per automatizzare compiti per tutti i database: stackoverflow.com/a/19505918/439524
amuliar

3

Fai passo dopo passo:

  1. chiudi tutte le connessioni
    ALTER DATABASE MyDB SET SINGLE_USER CON ROLLBACK IMMEDIATO

  2. imposta database con stato offline
    ALTER DATABASE MyDB SET OFFLINE

  3. Al nuovo percorso
    ALTER DATABASE MyDB MODIFY FILE (Nome = MyDB, Nome file = 'N: \ DATA \ MyDB.MDF')

  4. impostare database con stato online
    ALTER DATABASE MyDB SET ONLINE

  5. imposta multiutente
    ALTER DATABASE MyDB SET MULTI_USER


3

C'è un modo per spostare i file di dati del database (non sono ancora sicuro se esiste un modo per farlo per i file di registro) senza portare il database offline.

Dejan Nakarada-Kordic ha una spiegazione + script per questo metodo qui: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

La versione breve è che si aggiunge un altro file di database nella nuova posizione e quindi si utilizza DBCC Shrinkfile, con l'opzione EMPTYFILE per spostare i dati dal vecchio file al nuovo file. Al termine, è possibile rimuovere il vecchio file di dati.

Non era la mia soluzione, cercavo anch'io questa soluzione e la trovavo molto utile per il nostro ambiente di produzione.

Thorfinn


1

Segui questi semplici 4 passaggi:

  1. Apri SSMS e seleziona l' opzione Nuova query nella parte superiore della finestra. Quindi copia ed esegui la seguente query per trovare il percorso del database che vogliamo spostare nel nuovo percorso e osserva quel percorso che mostri nella CurrentLocationcolonna.

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. Ora vai a quel percorso e osserva il nome dei file Database_Name.mdf e Database_Name_log.ldf . Quindi eseguire le seguenti due query per spostare il database in una posizione specifica.

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. Ora, arrestare il server facendo clic con il tasto destro del mouse su Server_Nameche è possibile visualizzare in Esplora oggetti (lato sinistro).

    inserisci qui la descrizione dell'immagine

  2. Quindi spostare entrambi i file dal vecchio percorso al nuovo percorso e avviare nuovamente il server facendo clic con il pulsante destro del mouse su Server_Name. Confermare il nuovo percorso del database eseguendo nuovamente la query del 1 ° passaggio.


0

Non sono sicuro che questo sia il modo migliore (gradirei qualsiasi commento per dirmi come non lo è), ma è molto semplice (e veloce se si dispone di un piccolo database):

Innanzitutto, eseguire il backup del database in un file .bak. Quindi, ripristinare il database dallo stesso file .bak, scegliendo le nuove posizioni dei file .mdf e .ldf nelle opzioni del file per l'attività di ripristino.

Non lo farei in un ambiente di produzione al di fuori di una finestra di manutenzione, poiché non è possibile accedere al database durante il ripristino. Altri metodi che ho visto sopra avrebbero però degli svantaggi simili. Al termine dell'attività di ripristino, non è necessario eliminare il vecchio file. Viene fatto automaticamente.


1
Questo scenario presenta alcuni inconvenienti. Durante il ripristino, il DB originale deve essere sovrascritto o rinominato. Per database di grandi dimensioni, il metodo introduce un grave sovraccarico di IO. Lo spostamento dei file come descritto nei metodi di scollegamento o modifica dei db è molto più rapido. Se i file vengono spostati all'interno della stessa partizione NTFS, è solo un'operazione di metadati.
vonPryz,

@Ali - Backup e ripristino. Potrebbe richiedere più tempo, ma è generalmente un percorso più sicuro. Vedi l'analisi di Aaron Bertrand su: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups Anche: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

Per database di grandi dimensioni, questo approccio (e l'approccio distacco / collegamento) introduce tempi di fermo sostanziali. Per evitare ciò, posizionare il database di origine in modalità di ripristino completo, quindi eseguire il ripristino iniziale del backup con il DB di destinazione lasciato non operativo. Quindi eseguire il backup / ripristino di uno o più registri delle transazioni. Il database dovrà essere inattivo solo durante il backup / ripristino finale del registro delle transazioni, che può contenere tempi e dimensioni arbitrariamente piccoli. Ovviamente dovrai anche ripristinare un nome diverso e quindi eseguire uno scambio di nomi. Questo approccio equivale all'incirca al log shipping.
Brian,

0

Per integrare le risposte esistenti: ecco uno script per creare le ALTER DATABASE ... MOVE ...dichiarazioni per tutti i database:

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

Nota:

  • Sostituisci REPLACE(f.physical_name, 'C:\', 'D:\')con qualsiasi trasformazione tu voglia apportare ai percorsi dei file.

  • masterè esente, poiché il suo percorso è determinato dalle opzioni di avvio di SQL Server (vedere, ad esempio, questa risposta per i dettagli).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.