Che cos'è il distacco o l'attacco e come funzionano?
Inizieremo con il distacco. Quando si scollega un database in SQL Server, lo si porta offline e lo si rimuove dall'istanza di SQL Server da cui lo si sta staccando. I dati del database e i file di registro rimangono intatti e vengono lasciati in uno stato coerente, quindi è possibile collegare il database in un secondo momento o in un'altra istanza di SQL Server. Allega collega i dati e i file di registro da un database che è stato correttamente staccato (o che è stato copiato da un'istanza di SQL Server arrestata in modo pulito) a un'istanza di SQL Server e porta il database online.
Come scollegare un database?
È possibile farlo in T-SQL o dalla GUI di SQL Server Management Studio.
Nella GUI, fai clic con il pulsante destro del mouse sul database che desideri staccare, seleziona All Tasks
e fai clic su Detach
. Da lì otterrai la finestra di dialogo di distacco. Puoi scegliere di eliminare prima le connessioni per disconnettere forzatamente tutte le connessioni attive e il lavoro di rollback che erano nel mezzo dell'esecuzione. Puoi anche scegliere di aggiornare le statistiche prima del distacco.
In T-SQL:
-- You don't want to be in the database you are trying to detach
USE Master
GO
-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO
Per la procedura memorizzata nel sistema sp_detach_db ci sono due parametri che è possibile passare facoltativamente:
@skipchecks
- input accettabile è 'True'
o 'False'
se'True'
, SQL Server aggiornerà le statistiche prima del distacco. Se ' False'
, non lo farà. Se non si specifica nulla qui, le statistiche verranno aggiornate in SQL Server 2005 o versione successiva.
@keepfulltextindexfile
- L'impostazione predefinita è 'True'
: se impostato su true, i metadati dell'indice di testo completo non verranno eliminati durante il distacco.
Per vedere molto di più sul distacco e altri dettagli sui rischi che mostro di seguito, l' articolo di Books Online persp_detach_db
è un buon punto di partenza.
Come si allega un database?
È inoltre possibile farlo in T-SQL o dalla GUI di SQL Server Management Studio.
( NOTA: se si dispone di dati e file di registro da un database che non è stato correttamente staccato, il collegamento potrebbe non funzionare. Quando si verifica il distacco, il database viene portato offline e i file di registro e dati vengono messi in uno stato coerente. Anche questo accade quando un servizio viene chiuso in modo pulito. )
Nella GUI, fai clic con il pulsante destro del mouse sulla Databases
cartella di livello superiore per la tua istanza e seleziona Attach
. Nella finestra di dialogo successiva, selezionare il file di dati primario (.MDF) del database che si desidera allegare e assicurarsi di aver selezionato gli altri file e di specificarne le posizioni appropriate, quindi fare clic su OK, allegando il database.
In T-SQL il modo migliore per eseguire questa operazione in SQL Server 2005 e versioni successive è tramite il CREATE DATABASE
comando. Questo è il metodo supportato oltre SQL Server 2012. Se vuoi vedere come usare sp_attach_db
, puoi vederlo negli articoli online dei libri per [sp_attach_db][3]
o[sp_attach_single_file_db][4]
Quando il file di registro e i file di dati sono disponibili e sono coerenti, questo è l'approccio T-SQL:
- Utilizzo di Crea Database e della clausola FOR ATTACH da allegare
CREATE DATABASE DatabaseName
ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
(FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
(FILENAME = 'FilePath\SecondaryDataFile.ndf) -- Optional - any secondary data files
FOR ATTACH
GO
Puoi vedere di più sul Crea Database nei libri online.
Come si scollega / si collega in SQL Server Express?
In realtà è lo stesso. Se si utilizza SQL Server Management Studio Express, è possibile utilizzare la finestra di dialogo scollega / collega nella GUI sopra descritta o anche i passaggi T-SQL tramite SSMS Express sopra descritti. Nessuna differenza con Express lì.
Se non si dispone di SSMS Express, è possibile scaricarlo ( qui la versione di SQL Server 2012 Express).
Di te puoi entrare in a SQLCMD
sessione e usare gli stessi costrutti T-SQL sopra descritti.
Quando devo prendere in considerazione la possibilità di staccare o collegare?
Innanzitutto una parola su ciò che si stacca e collega non è destinato a essere utilizzato per: Backup e ripristino Scollega è un modo per eseguire il backup del database a fini di ripristino di routine. Non ci sono backup del registro delle transazioni in questo modo, mette il database in uno stato in cui i file del database possono essere eliminati accidentalmente e non è affatto un buon modo per questo scopo.
Detto questo, staccare e allegare sono utili per alcuni casi d'uso (non esaustivi, sentiti libero di modificare per aggiungere o creare una nuova risposta con più):
- A volte per le migrazioni (anche se preferisco il backup / ripristino per quelli come discusso nella mia risposta qui )
- Quando si desidera rimuovere un database che non viene più utilizzato attivamente ma è possibile collegarlo in seguito, se necessario.
- In alcune situazioni di risoluzione dei problemi, questo può essere richiesto
- Non ho lo spazio per il backup o per ripristinare sia i dati che i file di registro in un altro ambiente (non dovresti mai essere qui, ma a volte l'ho usato per spostare i database degli sviluppatori negli ambienti .. Non volevo o non avevo bisogno il registro così ha fatto un allegato / ricostruzione del file di registro)
Rischi e avvertenze
Ancora una volta, i libri online sono una buona risorsa qui , ma chiamerò alcune considerazioni specifiche da tenere a mente con il distacco o il collegamento di un database:
Staccare
- Stai portando offline il tuo database. Non sarà più accessibile. Questo dovrebbe essere ovvio, ma vale la pena chiamarlo. Questo è il motivo per cui non è un'ottima opzione di backup.
- Quando il database è online, SQL Server blocca i file. Non consiglierei di provare questo per dimostrarmi che mi sbaglio, perché potrebbe esserci qualche altra situazione in gioco, ma in genere non è possibile eliminare un file di database (dati, dati secondari o file di registro) mentre SQL Server è online. Questa è una buona cosa. Quando ti stacchi, non hai tale protezione - questa può essere una brutta cosa.
- Se hai a che fare con la corruzione del database e trovi qualche articolo in qualche posto che ha un primo passo di Staccare - è sbagliato - se stacchi un database corrotto, potrebbe essere quello. È possibile che non si colleghi di nuovo quel database.
- Tagliare e incollare i file del database di produzione in tutta la rete è un modo per introdurre potenzialmente la corruzione a livello di file. Un'altra ragione per cui preferisco il backup / ripristino durante le migrazioni.
- Potrebbe causare il fallimento di un piano di manutenzione. La situazione è che, come ho fatto io, hai impostato un piano di manutenzione per eseguire backup regolari di tutti i database senza verificare le migliori pratiche. Funziona bene, quindi smetti di pensarci. Qualcun altro decide quindi di prendere un database che non sta usando offline. Il piano di manutenzione non funzionerà da quel momento in avanti fino a quando non si modifica il piano di manutenzione selezionando l'opzione "ignora database il cui stato non è in linea" nella finestra di dialogo "Database (s)". Si noti che non si limiterà a fallire per il database offline - il piano di manutenzione fallirà con un errore nel momento in cui tenta di eseguire il backup del database offline, quindi è possibile che non venga eseguito il backup di alcuni database online. (autore diverso per questo punto, quindi trattalo con sospetto)
Allega
- Proprio come non dovresti eseguire script da Internet o accettare pacchetti da estranei in aeroporto, non dovresti allegare un database ottenuto da qualcun altro senza alcuni passaggi per verificarlo. Questo database potrebbe contenere codice all'interno di trigger, stored procedure, ecc. Che potrebbero compromettere l'ambiente. È necessario rivedere un database che si desidera collegare in un ambiente sicuro e protetto da firewall, non il proprio sistema di produzione.
Che dire di diverse versioni o edizioni di SQL Server?
Queste non sono diverse dalle regole relative al ripristino dei database tra le versioni. In genere è possibile ripristinare fino alla versione successiva per 3 versioni (da SQL Server 2008 a SQL Server 2012, ad esempio, funzionerà. Da SQL Server 2000 a SQL Server 2012 no). Non è possibile tornare indietro tramite backup / ripristino o scollegamento / collegamento: è necessario eseguire lo script degli oggetti e degli script gli inserimenti e farlo manualmente o con uno strumento che lo fa. Per le edizioni, in genere è possibile spostarsi tra le SKU principali di SQL Server, ad esempio è possibile spostare un database da Standard a Enterprise senza ulteriore lavoro. Se si utilizzano le funzionalità Enterprise (ad esempio, compressione o partizionamento), è necessario disabilitare tali funzionalità prima di effettuare lo spostamento. Puoi farti un'idea delle funzionalità che