SQL Server Express, Backup a prova di utonto!

 


Automazione o Follia: Come ho azzerato i refresh manuali di SQL Server Express (senza piallare il database sbagliato)

Alzi la mano chi, tra DBA e SysAdmin, non ha mai ricevuto il classico ticket del lunedì mattina che recita più o meno così: “Ciao! Senti, riusciresti a rinfrescare l'ambiente di QA con gli ultimi dati di Test? Ci servirebbe entro ieri”.

E da lì parte la solita, noiosissima trafila manuale che tutti conosciamo a memoria:

  1. Ti colleghi al server sorgente e lanci il backup.

  2. Preghi che ci sia abbastanza spazio sul disco per spostare il file .bak.

  3. Ti sposti sul server target, provi a fare il drop del DB esistente ma ovviamente è bloccato da 50 connessioni fantasma di sviluppatori che hanno lasciato la sessione aperta da venerdì.

  4. Killi tutto a mano, pialli il DB, ripristini il nuovo.

  5. Ti accorgi che saltando da una finestra all'altra hai dimenticato di rimettere l'Owner corretto, il Recovery Model è rimasto in Full (pronto a far esplodere i dischi al primo ciclo di test) e il file di log è diventato un mostro da 200 GB.

Oltre a essere una rottura di scatole colossale, fare questa roba a mano, magari con la reperibilità addosso o la fretta, è il modo perfetto per fare danni seri. Tipo piallare il database sbagliato.

Siccome la filosofia qui è faticare meno per faticare tutti meglio, ho preso PowerShell, ci ho buttato dentro quel salvavita che risponde al nome di dbatools e ho tirato in piedi uno scriptino che fa tutto questo con un unico, singolo invio dalla shell. 

🛠️ Come funziona lo "scriptino" (in 8 passi e zero sbatti)

Legge tutto da un banalissimo file chiamato db2restore.txt piazzato nella stessa cartella.

Vuoi fare il refresh mantenendo lo stesso nome? Scrivi una riga nel txt. Vuoi rinominare il database sul target? Ne scrivi due. Fine.

Ecco cosa succede quando premi Invio:

  • Backup & Spostamento: Lo script spara il Full Backup sul server sorgente e sposta il file di backup sul target via SMB in modalità trasparente.

  • Il Paracadute Anti-Licenziamento (Backup Preventivo): Questa è la parte preferita dal business. Prima di azzerare qualsiasi cosa sul target, lo script controlla se il database esiste già. Se lo trova, ne fa una copia di sicurezza al volo marchiata con la data del giorno (MyDB_prerefresh20260527.bak) così da avere il culo parato.

  • Tutti a casa: Lo script individua le connessioni rimaste appese sul DB target, le killa senza pietà in un colpo solo e pialla il vecchio database, liberando i file fisici .mdf e .ldf.

  • Pulizia Post-Restore: Dopo aver ripristinato il nuovo DB (applicando l'eventuale nuovo nome), lo script non ti lascia il lavoro a metà. Rimette l'owner corretto, gira il Recovery Model su Simple (così i dischi ringraziano) ed esegue lo shrink del file di log per recuperare spazio all'istante.

  • Spazzini automatici: Che tutto vada a buon fine o che lo script salti in aria a metà, il blocco finally ripulisce i file .bak temporanei di staging da entrambi i server. Zero spazzatura residua sui dischi.

Perché dovresti farlo anche tu

Perché il tempo speso a fare "clic-clic" su Management Studio è tempo tolto alle cose divertenti (tipo guardarsi i log di Kubernetes che esplodono o capire perché Ansible ha deciso di non funzionare oggi). Con questo sistema una rottura di scatole da 20 minuti diventa un'attesa di pochi secondi mentre ti sorseggi il caffè.

Inoltre, c'è un controllo di sicurezza integrato: se per sbaglio lasci il file di testo vuoto, lo script si accorge che il nome del DB è una stringa vuota e stacca la spina prima di mandare a ramengo l'istanza SQL Server.

💾 Scarica il codice (senza schifezze da copia-incolla)

Ho caricato lo script completo e il relativo file di configurazione su GitHub, con un README.md scritto come Dio comanda per metterlo in pista in meno di cinque minuti.

Trovi tutto nel repository ufficiale qui sotto. Provalo, modificalo e se hai dubbi o vuoi insultarmi per come ho gestito i blocchi try/catch, ci vediamo sotto nei commenti!

👉 [Link al Repository GitHub: SQL Server Refresh Automation] (https://github.com/L3onard80/dbatools-SQLExpress-Backup-Restore)

Commenti