Risposte:
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 DATABASE
comando:
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 IMMEDIATE
per 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 .
MODIFY FILE
ordine è 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.
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 DETACH
farlo, spostare i file e poi ATTACH
.
Properties
Files
schedaPath
e FileName
dei file LDF e MDF . Questo passaggio è importante nel caso in cui non si desideri finire per cercare file mancanti ...Tasks -> Detach
Databases
nodo del serverAttach
Add
bottoneOK
Dovresti essere a posto ora. Informazioni sul processo DETACH
- ATTACH
sono disponibili qui .
Nel link about DETACH
- ATTACH
vi è una raccomandazione di usare ALTER DATABASE
statement 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.
Per spostare i file del database di sistema, attenersi alla seguente procedura:
Accedi come utente in SSMS
Effettuare un backup del database creato dall'utente per sicurezza.
Uccidi tutte le sessioni connesse al server da SSMS.
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.
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
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\
Arresta l'istanza di SQL Server.
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.)
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.
Accedi come sa
utente in SSMS e verifica la posizione dei file del database eseguendo la seguente query:
USE master;
SELECT * FROM sys.master_files;
Tutto fatto.
Fai passo dopo passo:
chiudi tutte le connessioni
ALTER DATABASE MyDB SET SINGLE_USER CON ROLLBACK IMMEDIATO
imposta database con stato offline
ALTER DATABASE MyDB SET OFFLINE
Al nuovo percorso
ALTER DATABASE MyDB MODIFY FILE (Nome = MyDB, Nome file = 'N: \ DATA \ MyDB.MDF')
impostare database con stato online
ALTER DATABASE MyDB SET ONLINE
imposta multiutente
ALTER DATABASE MyDB SET MULTI_USER
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
Segui questi semplici 4 passaggi:
CurrentLocation
colonna.
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
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');
Ora, arrestare il server facendo clic con il tasto destro del mouse su Server_Name
che è possibile visualizzare in Esplora oggetti (lato sinistro).
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.
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.
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).
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