SQL Server: Tipi di dati e ottimizzazione risorse

La progettazione di un database è un’arte che bilancia funzionalità e prestazioni. Spesso, nella fretta di rendere un’applicazione operativa, si tende a trascurare uno degli aspetti più critici per la salute a lungo termine di un database SQL Server: la scelta dei tipi di dato. Questa decisione, apparentemente di poco conto, può avere un impatto profondo e duraturo sull’efficienza, la velocità e il costo di mantenimento del nostro sistema. In questo articolo esploreremo come una selezione attenta e consapevole dei tipi di dato non sia solo una buona pratica, ma una vera e propria strategia di ottimizzazione delle risorse, in grado di prevenire sprechi di memoria e di migliorare le performance complessive.

Tipi di dato errati: un costo nascosto per il DB

Quando si definisce la struttura di una tabella, la tentazione di utilizzare tipi di dato generici e sovradimensionati è forte. Scegliere un NVARCHAR(MAX) per un campo di testo o un BIGINT per un identificativo numerico può sembrare una scorciatoia sicura per evitare futuri problemi di troncamento o overflow. Tuttavia, questa “sicurezza” ha un costo nascosto e significativo. SQL Server, infatti, alloca lo spazio su disco e in memoria non solo in base alla dimensione effettiva dei dati inseriti, ma anche in base alla dimensione potenziale del tipo di dato scelto. Un campo BIGINT, ad esempio, occuperà sempre 8 byte per riga, anche se il valore memorizzato è semplicemente “1”.

Questo spreco di spazio su disco è solo l’inizio del problema. L’impatto più grave si manifesta a livello di memoria RAM, la risorsa più preziosa per le performance di un database. SQL Server lavora caricando dal disco alla memoria (nel cosiddetto buffer pool) delle unità di dati chiamate “pagine”, che hanno una dimensione fissa di 8KB. Se i tipi di dato sono più grandi del necessario, ogni pagina potrà contenere un numero inferiore di righe. Di conseguenza, per soddisfare una query, il motore del database sarà costretto a leggere un numero maggiore di pagine dal disco, un’operazione intrinsecamente lenta (I/O) che rallenta l’esecuzione e aumenta la pressione sulla memoria cache.

L’effetto a catena si estende inevitabilmente anche agli indici. Un indice è una struttura fondamentale per accelerare le operazioni di ricerca, ma la sua efficienza è legata alla sua compattezza. Se le colonne indicizzate utilizzano tipi di dato sovradimensionati, anche le chiavi dell’indice diventeranno più grandi. Questo porta a indici più “larghi” e “profondi”, che richiedono più letture e più cicli di CPU per essere attraversati. Non solo le query di SELECT diventano più lente, ma anche le operazioni di scrittura (INSERT, UPDATE, DELETE) subiscono un rallentamento, poiché SQL Server deve impiegare più risorse per mantenere aggiornate queste strutture dati più ingombranti.

Ottimizzare lo spazio: tipi di dato a confronto

Per evitare questi problemi, è fondamentale analizzare la natura dei dati che si andranno a memorizzare e scegliere il tipo di dato più piccolo e appropriato. Partiamo dai numeri interi: SQL Server offre una gamma di opzioni. Se una colonna deve contenere l’età di una persona, che realisticamente non supererà mai il valore 255, il tipo TINYINT (1 byte) è la scelta perfetta, al posto di un INT (4 byte) o di un BIGINT (8 byte). Se si tratta di un campo “stato” con un numero limitato di valori (es. 0, 1, 2), TINYINT è ancora una volta la soluzione ottimale. Questo piccolo accorgimento, moltiplicato per milioni di righe, si traduce in un risparmio di megabyte, se non gigabyte, di spazio.

Passando ai dati di tipo testo, la scelta principale è tra VARCHAR e NVARCHAR. La differenza è cruciale: NVARCHAR utilizza 2 byte per carattere per supportare lo standard Unicode (necessario per lingue con alfabeti complessi o simboli speciali), mentre VARCHAR ne utilizza 1 (per la maggior parte dei set di caratteri occidentali). Se si ha la certezza di memorizzare solo testo in italiano o inglese, utilizzare VARCHAR dimezza istantaneamente lo spazio occupato. Inoltre, è sempre meglio preferire tipi a lunghezza variabile (VARCHAR) a quelli a lunghezza fissa (CHAR), a meno che i dati non abbiano una dimensione costante. Un CHAR(100) occuperà sempre 100 byte, anche per memorizzare la parola “Ciao”, mentre VARCHAR(100) occuperà solo lo spazio necessario alla stringa più un piccolo overhead.

Infine, non dimentichiamo altri tipi di dato specialistici che offrono grandi vantaggi. Per i valori booleani (vero/falso, sì/no), il tipo BIT è imbattibile: consuma solo 1 bit e SQL Server è in grado di raggruppare fino a 8 campi BIT in un singolo byte. Per i dati finanziari o scientifici dove la precisione è fondamentale, è d’obbligo usare DECIMAL o NUMERIC, che garantiscono l’esattezza del valore, a differenza di FLOAT e REAL che sono tipi approssimati e possono portare a errori di arrotondamento. La regola d’oro è semplice: interrogarsi sempre sul dominio dei propri dati. Qual è il valore massimo possibile? È richiesta la precisione assoluta? Servirà il supporto a caratteri internazionali? Rispondere a queste domande è il primo passo per un database performante.

In conclusione, la scelta del tipo di dato in SQL Server è tutt’altro che un dettaglio tecnico di secondaria importanza. È una decisione strategica che influenza direttamente lo spazio su disco, l’utilizzo della memoria, le operazioni di I/O e, in definitiva, la reattività dell’intero sistema. Un approccio consapevole e meticoloso durante la fase di progettazione, volto a selezionare il tipo di dato più piccolo e adeguato per ogni colonna, si traduce in un database più snello, veloce e scalabile. Investire tempo in questa analisi iniziale ripaga ampiamente nel lungo periodo, garantendo prestazioni ottimali e riducendo i costi di infrastruttura e manutenzione.

Rimappare unità rete al riavvio di SQL Server

La volta precedente abbiamo visto come mappare un’unità di rete in Sql Server in modo da poter effettuare backup o posizionare i database in unità di rete. Ora vedremo come fare per rimappare le unità di rete al riavvio di SQL Server

Questa operazione può essere utile se hai dei database o dei file di backup su unità di rete e vuoi assicurarti che siano sempre accessibili dopo un riavvio del server.

Una stored procedure è un gruppo di istruzioni SQL che viene compilato una volta e può essere eseguito più volte. Le stored procedure possono accettare dei parametri di input e restituire dei valori di output. Le stored procedure possono anche essere impostate per l’esecuzione automatica all’avvio di un’istanza di SQL Server, usando l’opzione sp_procoption.

Per creare una stored procedure per rimappare le unità di rete al riavvio di SQL Server, segui questi passi:

  1. Apri SQL Server Management Studio e connettiti al server dove vuoi creare la stored procedure
  2. Espandi il nodo Programmabilità e fai clic con il pulsante destro del mouse su Stored Procedure. Seleziona Nuova stored procedure dal menu contestuale
Rimappare le unità di rete al riavvio di SQL Server
  • Nella finestra di query, sostituisci il testo predefinito con il seguente codice:
    • CREATE PROCEDURE sp_RemapNetworkDrives
      AS
      BEGIN
      — Rimuove le eventuali unità di rete già mappate
      EXEC xp_cmdshell ‘net use * /delete /y’
      — Mappa le unità di rete desiderate con i percorsi e le credenziali corrette
      EXEC xp_cmdshell ‘net use Z: \\ServerName\ShareName /user:DomainName\UserName Password’
      — Ripete il passo precedente per ogni unità di rete da mappare
      END
  • Modifica il codice sostituendo i nomi delle unità, i percorsi e le credenziali con quelli effettivi che vuoi usare
  • Esegui il codice premendo F5 o facendo clic sul pulsante Esegui nella barra degli strumenti. Dovresti vedere un messaggio che conferma la creazione della stored procedure
  • Per impostare la stored procedure per l’esecuzione automatica all’avvio di SQL Server, esegui il seguente codice:
    • EXEC sp_procoption ‘sp_RemapNetworkDrives’, ‘startup’, ‘on’
  • Per verificare che la stored procedure funzioni correttamente, riavvia il server e controlla che le unità di rete siano mappate correttamente.

Come mappare unità di rete su SQL Server

Mappare un’unità di rete su SQL Server è un’operazione utile per accedere a file o cartelle condivise da altri computer o server nella stessa rete. In questo modo si può sfruttare la potenza e la flessibilità di SQL Server per gestire e manipolare i dati presenti in queste risorse esterne. In altre parole avremmo la possibilità di posizionare i file del database su unità di rete (ad esempio un NAS)

Per mappare un’unità di rete su SQL Server, ci sono due metodi principali: usare il comando xp_cmdshell o creare una stored procedure con il codice Transact-SQL appropriato.

Metodo 1: usare il comando xp_cmdshell

Il comando xp_cmdshell è una funzione integrata di SQL Server che consente di eseguire comandi del sistema operativo direttamente da una query SQL, tuttavia, per usare questo comando, bisogna avere i permessi necessari e abilitare l’opzione xp_cmdshell nella configurazione di SQL Server.

Per abilitare l’opzione xp_cmdshell, si può usare il seguente codice:

EXEC sp_configure ‘show advanced options’, 1
RECONFIGURE
EXEC sp_configure ‘xp_cmdshell’, 1
RECONFIGURE

Dopo l’esecuzione del comando si dovrebbe ottnere un messaggio simile a questo:

L’impostazione 0 dell’opzione di configurazione ‘show advanced options’ è stata sostituita con 1. Per eseguire l’installazione, utilizzare RECONFIGURE.
L’impostazione 0 dell’opzione di configurazione ‘xp_cmdshell’ è stata sostituita con 1. Per eseguire l’installazione, utilizzare RECONFIGURE.

mappare unità di rete su SQL Server con comando xp_cmdshell

Una volta abilitata l’opzione xp_cmdshell, si può usare il comando NET USE per mappare un’unità di rete su SQL Server. Il comando NET USE ha la seguente sintassi:

NET USE [driveletter:] [\\computername\sharename] [password | *] [/USER:[domainname\]username] [/PERSISTENT:{YES | NO}]
Dove:

– driveletter: è la lettera dell’unità di rete da creare (ad esempio Z:)
– computername: è il nome del computer o del server che condivide la risorsa (ad esempio SERVER01)
– sharename: è il nome della risorsa condivisa (ad esempio una cartella)
– password: è la password per accedere alla risorsa condivisa (se richiesta)
– /USER: è il nome utente per accedere alla risorsa condivisa (se richiesto)
– /PERSISTENT: è l’opzione per rendere permanente o meno la mappatura dell’unità di rete

Per esempio, per mappare un’unità di rete Z: che punta alla cartella condivisa \\SERVER01\DATA, si può usare il seguente codice:

EXEC xp_cmdshell ‘NET USE Z: \\SERVER01\DATA’

Se la mappatura ha avuto successo, si dovrebbe ottenere un messaggio simile a questo:

The command completed successfully.

Se invece si verifica un errore, si dovrebbe ottenere un messaggio simile a questo:

System error 53 has occurred.
The network path was not found.

In questo caso, bisogna verificare che il nome del computer o del server sia corretto, e che la risorsa condivisa sia accessibile e che le credenziali fornite siano valide.

Per verificare che l’unità di rete sia stata mappata correttamente, si può usare il comando DIR per elencare i file e le cartelle presenti nell’unità di rete, per esempio

EXEC xp_cmdshell ‘DIR Z:’

In conclusione, se l’unità di rete è stata mappata correttamente, si dovrebbe ottenere un output simile a questo:

Volume in drive Z is DATA
Volume Serial Number is 1234-5678

Directory of Z:\

01/01/2020 12:00 <DIR> .
01/01/2020 12:00 <DIR> ..

La prossima volta vi mostrerò come mappare le unità di rete tramite una stored procedure, dopodiché come fare per rimapparle auomaticamente al riavvio di SQL Server

Database in modalità Restoring

Cosa fare quando il database è in modalità RESTORING?

Durante il ripristino di un backup di un database SQL Server, probabilmente vi è capitato che il questo rimanesse in modalità RESTORING.

Questa modalità indica che il database è in fase di ripristino da un backup o da una serie di backup. Questa fase può durare da pochi minuti a diverse ore a seconda della dimensione del database, del numero e del tipo di backup da applicare, e delle prestazioni del sistema.

In questa modalità il database non è accessibile e non è possibile eseguire altre operazioni di backup o ripristino sullo stesso database.

Perché il database è in modalità RESTORING?

Quando si ripristina un backup completo del database, il processo di ripristino copia i dati dal backup al database e applica le transazioni registrate nel log delle transazioni. Questo garantisce che il database sia consistente e rifletta lo stato al momento del backup.

Tuttavia, se si vuole ripristinare anche uno o più backup differenziali o del log delle transazioni, è necessario specificare l’opzione WITH NORECOVERY nel comando RESTORE DATABASE. Questa opzione impedisce al processo di ripristino di terminare e di rendere il database accessibile. In questo modo, si può applicare il backup successivo nella sequenza senza perdere le modifiche registrate nel log delle transazioni.

Database in modalità Restoring -RESTORE DATABASE WITH RECOVERY

Quando si applica l’ultimo backup della sequenza, si deve specificare l’opzione WITH RECOVERY nel comando RESTORE DATABASE. Questa opzione segnala al processo di ripristino di terminare e di rendere il database accessibile. Se non si specifica questa opzione, il database rimane in modalità RESTORING finché non si esegue manualmente il comando RESTORE DATABASE WITH RECOVERY.

Come uscire dalla modalità RESTORING?

Se il database è in modalità RESTORING perché si sta applicando una sequenza di backup, basta eseguire il comando RESTORE DATABASE WITH RECOVERY sull’ultimo backup della sequenza per uscire dalla modalità RESTORING e rendere il database accessibile.

Se invece il database è in modalità RESTORING perché si è interrotto il processo di ripristino o perché si è verificato un errore, si possono seguire due strade:

  • Riprendere il processo di ripristino applicando il backup successivo nella sequenza con l’opzione WITH NORECOVERY, fino a raggiungere l’ultimo backup con l’opzione WITH RECOVERY.
  • Annullare il processo di ripristino eseguendo il comando RESTORE DATABASE WITH RECOVERY. Questa operazione riporta il database allo stato precedente al ripristino, ma può causare la perdita dei dati modificati dopo l’ultimo backup.

In conclusione, la modalità RESTORING indica che il database è in fase di ripristino da uno o più backup. Per uscire da questa modalità e rendere il database accessibile, è necessario specificare l’opzione WITH RECOVERY nell’ultimo comando RESTORE DATABASE della sequenza. Se invece si vuole annullare il processo di ripristino, si può eseguire lo stesso comando senza specificare alcun backup.

Database in stato di Recovery

Se avete mai lavorato con SQL Server, probabilmente vi siete imbattuti in una situazione in cui un database ha lo stato RECOVERING. Questo significa che il database è in fase di ripristino dopo un’operazione di backup, restore, failover o altro evento che richiede la ricostruzione dei dati. In questo post, vedremo cosa succede durante il processo di ripristino, come verificare lo stato di un database e come risolvere eventuali problemi.

Database in stato Recovery

Il processo di ripristino

Quando un database SQL Server ha lo stato RECOVERING, significa che il motore di database sta eseguendo una serie di passaggi per riportare il database in uno stato consistente e pronto per l’uso. Questi passaggi sono:

  • Analysis: il database ha completato le transazioni e le ha analizzate nel log del motore di database per determinare quali erano valide e quali no. Questo passaggio serve a preparare i passaggi successivi e a stimare il tempo necessario per il ripristino.
  • Redo: il motore di database applica le modifiche al database che sono state registrate nel log delle transazioni ma non ancora scritte sul disco. Questo passaggio serve a ripristinare il database allo stato in cui si trovava prima dell’evento che ha causato il ripristino.
  • Undo: il motore di database annulla le modifiche al database che sono state registrate nel log delle transazioni ma non ancora confermate. Questo passaggio serve a eliminare le transazioni incomplete o non valide che potrebbero compromettere l’integrità del database.

Durante il processo di ripristino, il database non è accessibile agli utenti o alle applicazioni. Il tempo necessario per il ripristino dipende da diversi fattori, come la dimensione del log delle transazioni, il numero e la complessità delle transazioni da ripetere o annullare, le prestazioni del sistema e altri eventi concorrenti.

Tuttavia, in alcuni casi, il database può rimanere bloccato nello stato RECOVERING per un tempo eccessivo o indefinito, impedendo l’accesso ai dati. Questo può accadere per vari motivi, come ad esempio:

  • Il backup è incompatibile con la versione del server SQL Server.
  • Il backup è corrotto o incompleto.
  • Il database ha subito un arresto anomalo o una perdita di energia durante il ripristino.
  • Altri database hanno delle dipendenze sul database che non hanno ripristinato.
  • Il database ha delle opzioni di configurazione che impediscono il ripristino completo.

Per risolvere questi problemi, si possono provare le seguenti soluzioni:

  • Verificare la compatibilità del backup con la versione del server SQL Server e usare un backup adeguato o un server diverso.
  • Verificare l’integrità del backup e ripetere l’operazione di ripristino con un backup valido.
  • Interrompere e riavviare il servizio SQL Server per forzare il ripristino del database.
  • Eliminare il database con problemi e ripristinarlo nuovamente.
  • Ripristinare tutti i database correlati al database con problemi, mantenendo la stessa sequenza temporale dei backup.
  • Modificare le opzioni di configurazione del database, come ad esempio il recovery model o l’opzione RESTRICTED_USER, per consentire il ripristino completo.

Queste sono alcune delle possibili soluzioni per risolvere i problemi se un database SQL Server ha lo stato RECOVERING. Si consiglia di eseguire sempre un backup dei dati prima di effettuare qualsiasi operazione di ripristino e di consultare la documentazione ufficiale di SQL Server per maggiori dettagli e istruzioni.

Database in modalità Emergency

Se il vostro database SQL Server è danneggiato o non avviabile, potete provare a ripristinarlo usando la modalità EMERGENZA. Questa modalità consente di accedere al database anche se è in uno stato inconsistente, e di eseguire operazioni di riparazione o di recupero dei dati.

La modalità EMERGENZA si attiva impostando lo stato del database a 1 con il comando ALTER DATABASE. Ad esempio:

ALTER DATABASE MioDatabase SET EMERGENCY;

SQL Server in modalità EMERGENZA-

Una volta attivata la modalità EMERGENZA, il database diventa accessibile solo ai membri del ruolo sysadmin. Inoltre, il database viene aperto in sola lettura e non viene eseguita alcuna operazione di rollback o di recupero.

Per ripristinare il database, è necessario eseguire i seguenti passi:

1) Verificare l’integrità fisica del file di dati e del file di log del database con il comando DBCC CHECKDB. Questo comando restituisce un report con gli eventuali errori rilevati e le possibili azioni di riparazione. Ad esempio:

DBCC CHECKDB (MioDatabase) WITH NO_INFOMSGS, ALL_ERRORMSGS;

SQL Server in modalità EMERGENZA- DBCC CHECKDB

2) Se il comando DBCC CHECKDB non restituisce errori, significa che il database è integro e può essere riportato in modalità normale con il comando ALTER DATABASE. Ad esempio:

ALTER DATABASE MioDatabase SET ONLINE;

SQL Server in modalità EMERGENZA- SET ONLINE

3) Se invece il comando DBCC CHECKDB restituisce errori, significa che il database è danneggiato e richiede una riparazione. La riparazione può essere eseguita con il comando DBCC CHECKDB con l’opzione REPAIR_ALLOW_DATA_LOSS. Questa opzione consente di eliminare le pagine o le righe corrotte dal database, ma comporta una perdita di dati. Ad esempio:

DBCC CHECKDB (‘MioDatabase’, REPAIR_ALLOW_DATA_LOSS);

4) Dopo aver eseguito la riparazione, è necessario verificare nuovamente l’integrità del database con il comando DBCC CHECKDB. Se il comando non restituisce errori, significa che la riparazione è stata effettuata con successo e il database può essere riportato in modalità normale con il comando ALTER DATABASE. Ad esempio:

ALTER DATABASE MioDatabase SET ONLINE;

SQL Server in modalità EMERGENZA- SET ONLINE

5) Se invece il comando DBCC CHECKDB restituisce ancora errori, significa che la riparazione non è stata sufficiente e il database è irrecuperabile. In questo caso, l’unica soluzione è ripristinare il database da un backup valido.

La modalità EMERGENZA è un’ultima risorsa per tentare di recuperare un database SQL Server danneggiato. Si raccomanda di usarla solo dopo aver esaurito tutte le altre opzioni e di essere consapevoli dei rischi di perdita di dati. Inoltre, si raccomanda di effettuare sempre dei backup regolari del database e di verificarne la validità.

Database in modalità Suspect

Ora vedremo come ripristinare un database sql server in suspect mode. Un database sospetto è un database ritenuto compromesso da SQL Server che, per ragioni di sicurezza, imposta il flag “sospetto” ed impedisce l’accesso ai dati. Le possibili possono essere:

  1. file fisici sul file system corrotti (i motivi potrebbero essere di natura software (virus) o hardware (hard disk danneggiato))
  2. spazio libero su disco insufficiente
  3. Memoria RAM insufficiente
  4. i file risultano aperti da un altro software quindi con accesso negato
  5. uno spegnimento inaspettato del computer o l’arresto inaspettato dei servizi di SQL Server
  6. Il sistema non riesce ad aprire il dispositivo in cui risiedono i dati o il file di registro del server SQL
  7. Il server SQL si arresta in modo anomalo o si riavvia nel mezzo di una transazione, risultando in un file di registro delle transazioni corrotto o inaccessibile
  8. SQL Server tenta di aprire un database e il file appartenente a quel database è già aperto dal software antivirus installato sul sistema
  9. SQL non può completare un’operazione di rollback o rollforward.

Per eseguire le operazioni di ripristino utilizzeremo Microsoft Sql Server Managment Studio con i comandi T-SQL. Il primo tentativo è quello di togliere il flag di sospetto al database. Dopo aver effettuato la connessione al motore di database, apriamo la finestra per eseguire una nuova query e digitiamo il seguente coamndo :

exec sp_resetstatus DBNAME

Questa operazione, purtroppo, difficilmente risolve il nostro problema, pertanto sarà necessario compiere altre operazioni. Il passo successivo è impostare il database in emergenza. In questa modalità i dati del database, se non corrotti, torneranno ad essere accessibili, poi, tramite il comando DBCC, sarà possibile effettuare un check degli oggetti del database. Lanciare i comandi sotto indicati uno alla volta in modo da analizzare sempre l’output restituito.

alter database DBNAME set emergency

dbcc checkdb(‘DBNAME’) alter database DBNAME set SINGLE_USER with ROLLBACK IMMEDIATE

dbcc checkdb(‘DBNAME’,REPAIR_ALLOW_DATA_LOSS)

alter database DBNAME set MULTI_USER

Come ripristinare un database

Database in Recovery Pending

Ripristinare un database in modalità’ “Ripristino in sospeso”

Ora vedremo come ripristinare un database SQL Server in modalità’ “Ripristino in sospeso”. La modalità “Ripristino in sospeso” è uno dei vari stati in cui può trovarsi un database e indica che questo non può avviare il processo di ripristino in caso di arresto anomalo del sistema.

Ciò è dovuto al fatto che SQL Server non è in grado di accedere alla pagina di avvio nel file di dati primario (MDF) per determinare se è necessario un ripristino in caso di arresto anomalo del sistema ma non è stato possibile avviare il processo di ripristino (ad esempio, perché il file di registro delle transazioni è mancante o danneggiato).

Cause e soluzioni


Altre cause possono essere lo spazio di archiviazione su disco o memoria insufficiente, o il danneggiamento del file MDF. I motivi potrebbero essere problemi del sottosistema del disco, problemi della piattaforma, un guasto hardware oppure un attacco di virus e così via.


Nel caso in cui il ripristino del database non può essere avviato a causa di spazio di archiviazione su disco insufficiente bisogna innanzitutto aumentare lo spazio su disco, dopodiché impostare il database in modalità “Online” ed eseguire il comando CheckDB.

ALTER DATABASE [DBNAME] SET ONLINE;
DBCC CHECKDB(‘DBNAME’) WITH NO_INFOMSGS;

ripristinare un database in “Ripristino in sospeso”

Il log degli errori può mostrare che il database non è stato ripristinato correttamente.

La causa porebbe essere un file di registro mancante del database che potrebbe essere eliminato, rinominato o danneggiato. In questo caso metti il database in modalità di emergenza, poi scollega il database (metti in modalità OFFLINE) dopodiché allegalo di nuovo (portalo online).


I comandi da eseguire sono i seguenti:

ALTER DATABASE [DBNAME] SET EMERGENCY;
ALTER DATABASE [DBNAME] set multi_user;
EXEC sp_detach_db ‘DBNAME’;
EXEC sp_attach_single_file_db @DBName = ‘DBNAME’, @physname = N’MDF_FILE_FULL_PATCH’;

Questa immagine ha l'attributo alt vuoto; il nome del file è EMERGENCY.jpg

In alcuni casi è possibile risolvere errori di database utilizzando le opzioni Repair, ma solo come ultima risorsa.
Microsoft consiglia sempre un ripristino utente dall’ultimo backup valido noto come metodo principale per il ripristino da errori segnalati da DBCC CHECKDB.

Problemi del database

Un database di Microsoft SQL Server si trova sempre in uno stato specifico dal sistema. Ora vedremo i vari stati e problemi di SQL SERVER.

Stati di un database SQL Server

Il database SQL Server può assumere diversi stati in base alle attività in esecuzione. Ecco un elenco completo dei possibili stati di un database SQL Server:

  1. Online – il database è in esecuzione e disponibile per le connessioni.
  2. Offline – il database non è disponibile per le connessioni e non può essere utilizzato.
  3. In riparazione – il database è in fase di riparazione a causa di problemi di integrità dei dati.
  4. In ripristino – il database è in fase di ripristino da un backup.
  5. In recupero – il database è in fase di recupero dopo un incidente di sistema.
  6. In ripristino di emergenza – il database è in fase di ripristino di emergenza per recuperare i dati in caso di problemi critici.
  7. In ripristino di transazioni – il database è in fase di ripristino di transazioni per ripristinare i dati alle transazioni precedenti.
  8. In stato di sospensione – il database è in stato di sospensione e non può essere utilizzato
  9. In stato di sospensione con rollback – il database è in stato di sospensione e sta eseguendo un rollback di transazioni.
  10. In stato di sospensione con ripristino – il database è in stato di sospensione e sta eseguendo un ripristino.

Modificare lo stato del database

Per modificare lo stato del database, è possibile utilizzare i comandi ALTER DATABASE per impostare lo stato di connessione o di ripristino. Ad esempio, per portare un database offline, si utilizzerebbe il comando ALTER DATABASE “nome_database” SET OFFLINE.

Per verificare lo stato attuale del database, è possibile utilizzare il comando SELECT state_desc FROM sys.databases WHERE name = ‘nome_database’.

Possiamo controllare rapidamente lo stato corrente di un database SQL che esegue la query riportata di seguito. Lo stato corrente di un database può essere verificato tramite state_desc.

Andiamo nel Management Studio di Sql Server dove, dopo avere selezionato “Nuova Query”, andremo a digitare i seguenti comandi:

SELECT name, state_desc from sys.databases

come conoscere gli stati e problemi dstati e problemi di SQL SERVER

Come risultato della query otterremo l’elenco dei database collegati ed il loro stato

In generale, è importante prestare attenzione allo stato del database e gestirlo correttamente per garantire la disponibilità e l’integrità dei dati.

L’identificazione dello stato del database e del modo in cui un database può essere spostato tra questi diversi stati consente di risolvere i problemi del database.

Questi stati includono ONLINE, OFFLINE, RESTORING, RECOVERING, SUSPECT, EMERGENCY e RECOVERY PENDING.

Dopo aver individuato i vari stati e soprattutto i problemi di SQL SERVER, vedremo come risolverli.

Sql Server e Linux

Installare Sql Server in ambiente Linux

In questo articolo vedremo come installare Sql Server in ambiente Linux, in particolare la versione 2022 di Sql Server in una distribuzione Ubuntu

Per prima cosa importiamo la chiave di sicurezza GPG del repository pubblico digitando il seguente comando :

$ wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add –

repository pubblico

dopodiché registriamo SQL Server 2022 nel repository Ubuntu e scriviamo :

sudo add-apt-repository “$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-preview.list)”

registrare SQL Server 2022 nel repository Ubuntu

ora aggiornarniamo i repository di Ubuntu.

sudo apt-get update

aggiornamento del repository di Ubuntu

Installazione di Sql Server

A questo punto scarichiamo e andiamo ad installare Sql Server in ambiente Linux. Questo passaggio potrebbe richiedere del tempo poiché installerà pacchetti di dipendenze come gawk, libatomicl , libc++1. Scaricherà anche l’installazione di SQL Server 2022 dal registro Microsoft e avvierà il processo di installazione.

sudo apt-get install -y mssql-server

Installazione Sql Server
Installazione Sql Server

L’installazione di SQL una volta completata richiede di eseguire l’utilità mssql-conf per la configurazione. Questa utility mssql-conf richiede input utente specifici.

sudo /opt/mssql/bin/mssql-conf setup

Edizione SQL Server : inserire il numero di serie dell’edizione SQL Server 2022 che si desidera utilizzare. Per questa demo, sceglierò la prima opzione, Valutazione

  1. Evaluation
  2. Developer
  3. Express
  4. Web
  5. Standard
  6. Enterprise
  7. Enterprise Core
  8. BYOB (richiede la tua licenza)

Accetta i termini della licenza di SQL Server e scegli la lingua di SQL Server. Inserisco il valore 5 per l’installazione in italiano.

termini della licenza di SQL Server

Una volta installato SQL Server 2022, viene visualizzato il messaggio: l’installazione è stata completata correttamente. SQL Server è ora in fase di avvio ed è consigliabile controllare lo stato del servizio.

systemctl status mssql-server –no-pager

controllare lo stato del servizio

Per la connessione a SQL Server 2022 Linux, sono necessari strumenti da riga di comando come SQLCMD o Azure Data Studio, SQL Server Management Studio. Se desideri connetterti in remoto da un computer Windows, puoi installare SSMS dal collegamento.

SSMS è un’applicazione basata su Windows. Pertanto, è possibile scegliere Azure Data Studio per l’installazione nel computer Linux stesso. È possibile fare riferimento alla guida per la configurazione di Azure Data Studio in Linux.