Gestione dei File MDF e Collegamento di Database in SQL Server

La gestione dei database in SQL Server differisce significativamente da quella di sistemi basati su file, come ad esempio Microsoft Access. La prima cosa da imparare è che SQL Server NON è un database server basato su file, ma è basato su un servizio. Di conseguenza, SQL Server non crea direttamente dei file, ma crea e gestisce dei database come oggetti logici. È compito del servizio di SQL Server gestire a basso livello i file fisici che compongono questi database.

Questi file fisici hanno tipicamente estensioni come .mdf o .ndf per i file di dati, e .ldf per i file di registro delle transazioni. Inoltre, tutti i filegroup dei dati FILESTREAM, se presenti, devono essere inclusi e disponibili per un corretto funzionamento.

Cosa Sono i File MDF, NDF e LDF in SQL Server?

Un database di SQL Server è un oggetto logico, mentre i file MDF, NDF e LDF sono gli oggetti fisici che lo costituiscono. Ogni database è composto da almeno due file, che vengono creati e gestiti direttamente dal servizio SQL Server:

  • File MDF (Master Data File): È il file di dati primario di un database. Contiene le informazioni di avvio del database, i puntatori ad altri file di dati e tutti i dati utente e gli oggetti di sistema di SQL Server. Ogni database ha un solo file MDF.
  • File NDF (Secondary Data File): Sono file di dati secondari opzionali. Un database può avere zero o più file NDF, che consentono di distribuire i dati su più dischi o volumi per migliorare le prestazioni o la capacità di archiviazione.
  • File LDF (Log Data File): Contiene il registro delle transazioni per il database. Ogni database deve avere almeno un file LDF. Il registro delle transazioni registra tutte le modifiche apportate al database, essenziale per il recupero dei dati e per garantire l'integrità.

Oltre a questi, in caso di utilizzo di funzionalità avanzate, possono esserci anche filegroup dedicati ai dati FILESTREAM, che gestiscono dati BLOB (Binary Large Object) archiviati direttamente nel filesystem di Windows, ma gestiti dal motore di database.

Di seguito una tabella riassuntiva dei tipi di file principali:

Estensione File Descrizione Tipo di Dati
.mdf File di dati primario del database Dati, oggetti di schema
.ndf File di dati secondario (opzionale) Dati, oggetti di schema
.ldf File di registro delle transazioni Log delle transazioni
FILESTREAM Dati FILESTREAM (archiviati nel filesystem) Dati BLOB non strutturati

Creazione dei File di Database

I file di database vengono creati implicitamente quando si emette il comando CREATE DATABASE. Non si può eseguire un comando CREATE FILE direttamente, poiché non avrebbe alcun senso nel contesto di SQL Server.

Il database si crea pertanto con il comando CREATE DATABASE (la sintassi completa è disponibile nel Books Online di SQL Server), ed è il servizio stesso che posiziona, dimensiona e assegna altri attributi ai file secondo impostazioni predefinite, salvo scelta esplicita in fase di creazione del database. Puoi impartire a SQL Server il comando CREATE DATABASE specificando la posizione, le dimensioni iniziali, il fattore di crescita e altri attributi per ciascuno dei file che costituiranno il database.

Collegamento e Scollegamento di un Database: Panoramica

Questo articolo descrive come associare (collegare) un database in SQL Server tramite SQL Server Management Studio (SSMS) o Transact-SQL. Il processo di collegamento è l'atto di rendere un database, composto da file .mdf, .ndf e .ldf, disponibile per un'istanza di SQL Server.

Quando un database viene scollegato o collegato, il motore di database tenta di rappresentare l'account di Windows della connessione che esegue l'operazione per garantire che l'account disponga dell'autorizzazione per accedere al database e ai file di log. Solo l'account che esegue l'operazione ha queste autorizzazioni.

Quando Utilizzare il Collegamento e lo Scollegamento

Il collegamento e lo scollegamento sono operazioni utili principalmente nel caso in cui venga spostato un database da un'istanza di SQL Server a un'altra. In tale scenario, il database deve prima essere scollegato da qualsiasi istanza di SQL esistente. Se si tenta di collegare un database che non è stato scollegato correttamente, verrà restituito un errore.

Quando Evitare il Collegamento e lo Scollegamento

È importante notare che le operazioni di collegamento e scollegamento non sono consigliate per il backup e il ripristino dei database. Per queste finalità, esistono procedure di backup e ripristino più robuste e affidabili. Inoltre, quando si spostano file di database all'interno della stessa istanza di SQL Server, è consigliabile spostare i database usando la procedura di rilocazione pianificata ALTER DATABASE, che è più sicura e gestisce meglio la coerenza dei dati rispetto alle operazioni di scollegamento e collegamento.

Requisiti e Considerazioni Importanti

Durante il collegamento di un database è necessario che siano disponibili tutti i file di dati del database, inclusi i file .mdf, eventuali .ndf e il file .ldf del registro delle transazioni. Inoltre, tutti i filegroup dei dati FILESTREAM (se presenti) devono essere presenti e disponibili affinché l'operazione vada a buon fine. È fondamentale assicurarsi di tenere conto di tutti i file associati al database prima di procedere con le operazioni di scollegamento, spostamento e collegamento.

Le autorizzazioni di accesso ai file vengono impostate durante l'esecuzione di diverse operazioni del database, inclusi il collegamento e lo scollegamento.

Sicurezza e Affidabilità

È vivamente consigliabile evitare di collegare o ripristinare database provenienti da origini sconosciute o non attendibili. Tali database possono contenere codice dannoso che potrebbe eseguire codice Transact-SQL indesiderato o causare errori modificando lo schema o la struttura fisica del database. Prima di utilizzare un database da un'origine sconosciuta o non attendibile, è fondamentale eseguire un DBCC CHECKDB sul database in un server non di produzione ed esaminare attentamente il codice contenuto nel database, come le stored procedure o altro codice definito dall'utente, per garantirne la sicurezza.

Preparazione al Collegamento: Identificazione dei File del Database

Prima di scollegare e spostare un database, è essenziale conoscere la posizione e il nome di tutti i file che lo compongono. Se si sta spostando un database, prima che venga scollegato dall'istanza di SQL Server esistente, è possibile usare la vista del catalogo di sistema sys.database_files per esaminare i file associati al database e i relativi percorsi correnti.

Copiare lo script Transact-SQL seguente nell'editor di query e selezionare Esegui. Lo script consentirà di visualizzare il percorso dei file fisici del database:

SELECT name AS LogicalFileName, physical_name AS CurrentLocation, state_descFROM sys.database_filesWHERE database_id = DB_ID('NomeDelTuoDatabase');

Sostituire 'NomeDelTuoDatabase' con il nome effettivo del database che si intende spostare. Assicurarsi di tenere conto di tutti i file associati al database prima di scollegare, spostare e collegare. Procedere quindi con i passaggi di scollegamento, copia file e collegamento del database nelle sezioni successive.

Collegare un Database tramite SQL Server Management Studio (SSMS)

SQL Server Management Studio offre un'interfaccia grafica intuitiva per collegare un database. Ecco i passaggi principali:

  1. Aprire SQL Server Management Studio e connettersi all'istanza di SQL Server desiderata.
  2. Nella finestra Esplora oggetti, fare clic con il pulsante destro del mouse su Database e selezionare Collega... dal menu contestuale.
  3. How to Connect to a Database via SQL Server Management Studio (SSMS)

  4. Nella finestra di dialogo Collega database, selezionare Aggiungi per specificare il file principale del database (il file .mdf) da collegare.
  5. Si aprirà una nuova finestra di dialogo che consente di individuare i file principali del database necessari. Selezionare il file .mdf e fare clic su OK.
  6. Nella griglia Dettagli database della finestra "Collega database", verranno visualizzati i nomi dei file da collegare. Questa griglia consente di visualizzare anche un'icona che indica lo stato dell'operazione di collegamento per ciascun oggetto. Ad esempio, un'icona può indicare che l'operazione di collegamento non è stata avviata o che può essere sospesa per questo oggetto, o che si è verificato un errore durante l'operazione.
  7. Se un file non esiste nella posizione prevista, nella colonna Messaggio verrà visualizzato "Non trovato". Se non viene trovato un file di log, potrebbe esistere in un'altra directory o essere stato eliminato. È necessario aggiornare il percorso del file nella griglia Dettagli database in modo che indichi la posizione corretta oppure rimuovere il file di log dalla griglia se non è più necessario o recuperabile.
  8. Nella colonna Percorso corrente, viene visualizzato il percorso del file di database selezionato. Assicurarsi che tutti i percorsi siano corretti e che l'istanza di SQL Server abbia le autorizzazioni necessarie per accedervi.
  9. Fare clic su OK per avviare l'operazione di collegamento.

Collegare un Database tramite Transact-SQL

È possibile collegare un database anche tramite script Transact-SQL, utilizzando l'istruzione CREATE DATABASE ... FOR ATTACH. Questa è la modalità consigliata e più robusta per le operazioni di collegamento, specialmente in ambienti automatizzati o di produzione.

È importante notare che in passato era possibile utilizzare le stored procedure sp_attach_db o sp_attach_single_file_db. Tuttavia, queste stored procedure verranno eliminate nelle versioni future di Microsoft SQL Server. È quindi consigliabile evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata, preferendo l'uso di CREATE DATABASE ... FOR ATTACH.

Il database potrebbe avere file di dati aggiuntivi (comunemente, .mdf o .ndf) e richiedere file aggiuntivi da includere nell'istruzione CREATE DATABASE ... FOR ATTACH. Inoltre, tutti i filegroup dei dati FILESTREAM (se applicabile) devono essere inclusi anch'essi nell'istruzione.

Copiare e incollare l'esempio seguente nella finestra di query di SSMS e selezionare Esegui, dopo aver sostituito i placeholder con i percorsi e i nomi dei file effettivi del tuo database:

CREATE DATABASE [NomeDelTuoDatabase]ON(FILENAME = 'C:\Percorso\Al\Tuo\Database\NomeDelTuoDatabase.mdf'),(FILENAME = 'C:\Percorso\Al\Tuo\Database\NomeDelTuoDatabase_log.ldf')-- Aggiungi qui altri file NDF se presenti-- (FILENAME = 'C:\Percorso\Al\Tuo\Database\NomeDelTuoDatabase_ndf.ndf')FOR ATTACH;

Aspetti Post-Collegamento e Aggiornamento del Database

Una volta aggiornato utilizzando il metodo di collegamento, il database viene reso immediatamente disponibile per l'uso. Il database verrà aggiornato automaticamente al livello di versione interno della nuova istanza di SQL Server a cui è stato collegato.

Se il database include indici full-text, questi vengono importati, reimpostati o ricompilati dal processo di aggiornamento, a seconda dell'impostazione della proprietà del server Opzione di aggiornamento full-text. È importante sapere che se l'opzione di aggiornamento è impostata su Importa o Ricompila, gli indici full-text non sono disponibili durante l'aggiornamento. A seconda della quantità di dati indicizzati, l'importazione può richiedere diverse ore, mentre la ricompilazione può risultare fino a 10 volte più lunga.

Dopo l'aggiornamento, il livello di compatibilità del database rimane al livello di compatibilità prima dell'aggiornamento, a meno che il livello di compatibilità precedente non sia supportato nella nuova versione di SQL Server. In tal caso, il livello di compatibilità del database aggiornato viene impostato sul livello di compatibilità più basso supportato nella nuova istanza. Ad esempio, se si collega un database che aveva un livello di compatibilità pari a 90 prima del collegamento a un'istanza di SQL Server 2019 (15.x), dopo l'aggiornamento il livello viene impostato su 100, ovvero il livello di compatibilità supportato più basso in SQL Server 2019 (15.x).

Risoluzione dei Problemi Comuni e Approccio Corretto a SQL Server

Molti utenti alle prime armi con SQL Server, specialmente quelli abituati a sistemi come Access, si trovano di fronte a difficoltà nel comprendere come "aprire" o "accedere" a un database. L'errore comune "Ricerca del file "C:\Documents and Settings\Cello\Desktop\Progetto_meka\pegaso.MDF" nella directory non riuscita" evidenzia una lacuna fondamentale nella comprensione di SQL Server.

Per lo stesso motivo (database basato su servizio e non su file), per connetterti a un database Access identifichi un file; per connetterti a un database SQL Server devi referenziare un'istanza (un servizio) e all'interno di essa scegliere un database (oggetto logico). Non puoi fare una connessione diretta a un file .mdf, ignorando le "User Instance" che non sono considerate una pratica standard o consigliata. È fondamentale "sganciarsi da Access e porsi in "SQL Server mode"" per comprendere appieno il funzionamento e la gestione dei database in questo ambiente.

Se hai installato SQL Server Express Edition e SQL Server Management Studio e riesci solo a connetterti al server SQL del tuo PC, ma non a "aprire il database in questione", è probabile che il database non sia ancora collegato all'istanza del server. Una volta collegato seguendo i passaggi descritti in precedenza, potrai accedere al database e fare le tue operazioni di insert, update e select tramite le query SQL.

tags: #infomrazioni #su #mdf #sql