MSSQL backup e restore: differenze tra le versioni

Da Emigar.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:


==salvataggio==
==salvataggio==
===Recovery Model===
Verificare il Recovery Model del database:
Verificare il Recovery Model del database:
SELECT name,recovery_model_desc FROM sys.databases WHERE name = 'MioDatabase'
SELECT name,recovery_model_desc FROM sys.databases WHERE name = 'MioDatabase'
Riga 9: Riga 10:
go
go


===Salvataggio===
Salvataggio
Salvataggio
backup database MioDatabase to disk = '/backup/MioDatabase.bak'
backup database MioDatabase to disk = '/backup/MioDatabase.bak'
go
go

Salvataggio differenziale (i delta dall'ultimo full)
BACKUP DATABASE [NomeDatabase] TO DISK = 'C:\Backup\NomeDatabase_diff.bak' WITH DIFFERENTIAL, INIT, FORMAT, COMPRESSION
GO


Per per salvare solo il transaction log:
Per per salvare solo il transaction log:
Riga 27: Riga 33:




[https://learn.microsoft.com/it-it/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-ver17]
Riferimenti: [https://learn.microsoft.com/it-it/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-ver17]

Riferimenti: [https://learn.microsoft.com/it-it/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-ver17|RESTORE]


==ripristino==
==ripristino==
Riga 41: Riga 45:
go
go


===restore da full e differenziale===

RESTORE DATABASE [NomeDatabase] FROM DISK = 'C:\Backup\NomeDatabase_full.bak' WITH NORECOVERY;

RESTORE DATABASE [NomeDatabase] FROM DISK = 'C:\Backup\NomeDatabase_diff.bak' WITH RECOVERY;


===con spostamento di percorso===
===con spostamento di percorso===
Riga 84: Riga 93:
alter database MioDatabase set compatibility_level=170
alter database MioDatabase set compatibility_level=170
go
go


=snapshot=
Possibile solo con enterprise Edition e dalla versione 2012.

Creazione snapshot
CREATE DATABASE [SCHTCPOS_SS_20261012_110304] ON (NAME = [sofleo_atg_migration_01], FILENAME = 'G:\snapshot\SCHTCPOS_SS_20261012_110304_sofleo_atg_migration_01.ss') AS SNAPSHOT OF [SCHTCPOS];

Restore da snapshot
ALTER DATABASE SCHTCPOS SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [SCHTCPOS] from database_snapshot='SCHTCPOS_SS_20261012_110304';
ALTER DATABASE SCHTCPOS SET MULTI_USER;

Cancellazione snapshot
DROP DATABASE [SCHTCPOS_SS_20261012_110304];


Per generare comando di esecuzione snapshot
<pre>
-- ============================================================================
-- Script per la generazione dinamica del comando CREATE DATABASE SNAPSHOT
-- Target directory: G:\snapshot\
-- ============================================================================

DECLARE @SourceDB SYSNAME = 'TuoNomeDatabase'; -- Sostituisci con il nome del tuo database
DECLARE @SnapshotName SYSNAME = @SourceDB + '_SS_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '_' + REPLACE(CONVERT(VARCHAR(8), GETDATE(), 108), ':', '');
DECLARE @SnapshotPath NVARCHAR(512) = N'G:\snapshot\';

DECLARE @SQL NVARCHAR(MAX) = N'CREATE DATABASE ' + QUOTENAME(@SnapshotName) + ' ON ';

-- Recupera dinamicamente tutti i file di dati (tipo 0 = Row data) del database sorgente
SELECT @SQL = @SQL + STUFF((
SELECT
N', (NAME = ' + QUOTENAME(f.name) +
N', FILENAME = ''' + @SnapshotPath + @SnapshotName + N'_' + f.name + N'.ss'')'
FROM sys.master_files f
WHERE f.database_id = DB_ID(@SourceDB)
AND f.type = 0 -- Solo file di dati (esclude i file di log)
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') +
N' AS SNAPSHOT OF ' + QUOTENAME(@SourceDB) + N';';

-- Stampa a schermo il comando generato (utile per verifica o log)
PRINT '------------------------------------------------------------';
PRINT 'Comando generato per lo Snapshot:';
PRINT '------------------------------------------------------------';
PRINT @SQL;
</pre>

=storico backup=
Interroga gli eventi di backup via VSS
<pre>
SELECT
bs.database_name,
bs.backup_start_date,
bs.backup_finish_date,
CASE bs.type
WHEN 'D' THEN 'Full'
WHEN 'I' THEN 'Differential'
WHEN 'L' THEN 'Log'
END AS backup_type,
bs.is_snapshot,
bs.is_copy_only,
bs.name AS backup_set_name,
bmf.physical_device_name
FROM msdb.dbo.backupset bs
JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id
WHERE (bs.is_snapshot = 1 -- solo backup via snapshot VSS
OR bmf.physical_device_name LIKE '{%') -- I backup VSS generano spesso GUID virtuali come dispositivo
AND (bs.backup_start_date between '2026-09-22 01:00:00' and '2026-09-22 05:00:00')
ORDER BY bs.backup_start_date DESC;
</pre>


Eventi di snapshot

EXEC sp_readerrorlog 0, 1, 'I/O is frozen';

EXEC sp_readerrorlog 0, 1, 'I/O was resumed';
Per filtrare per data
DECLARE @StartDate DATETIME = '2026-09-25 00:00:00';
DECLARE @EndDate DATETIME = '2026-09-25 10:00:00';
EXEC sys.xp_readerrorlog
0, -- Log attuale
1, -- SQL Server Log
N'I/O was resumed', -- Testo da cercare
NULL, -- Secondo testo (opzionale)
@StartDate, -- Data/Ora inizio
@EndDate, -- Data/Ora fine
N'DESC'; -- Ordine di visualizzazione






Versione attuale delle 11:00, 14 ott 2026

salvataggio

Recovery Model

Verificare il Recovery Model del database:

SELECT name,recovery_model_desc FROM sys.databases WHERE name = 'MioDatabase'
GO

Eventualmente modificarlo:

ALTER DATABASE <database_name> SET RECOVERY FULL
go

Salvataggio

Salvataggio

backup database MioDatabase to disk = '/backup/MioDatabase.bak'
go

Salvataggio differenziale (i delta dall'ultimo full)

BACKUP DATABASE [NomeDatabase]  TO DISK = 'C:\Backup\NomeDatabase_diff.bak'  WITH DIFFERENTIAL, INIT, FORMAT, COMPRESSION
GO

Per per salvare solo il transaction log:

BACKUP LOG MioDatabase TO DISK = '/backup/MioDatabase_20260611.trn' WITH INIT, FORMAT, COMPRESSION
go

Per verificare svuotamento del transaction log:

SELECT * FROM sys.dm_db_log_space_usage;
go

Con versioni precedenti alla 2019:

DBCC SQLPERF(LOGSPACE);
go


Riferimenti: [1]

ripristino

caso semplice

Per leggere il contenuto di un backup, serve eventualmente per modificare i percorsi dei files da restorare

RESTORE HEADERONLY FROM DISK = '/backup/MioDatabase.bak';
GO


restore database MioDatabase from disk = '/backup/MioDatabase.bak' with recovery
go

restore da full e differenziale

RESTORE DATABASE [NomeDatabase] FROM DISK = 'C:\Backup\NomeDatabase_full.bak' WITH NORECOVERY;
RESTORE DATABASE [NomeDatabase] FROM DISK = 'C:\Backup\NomeDatabase_diff.bak' WITH RECOVERY;

con spostamento di percorso

RESTORE FILELISTONLY FROM DISK = '/backup/MioDatabase.bak';
RESTORE DATABASE MioDatabase
  FROM DISK = '/backup/MioDatabase.bak';
  WITH RECOVERY,
  MOVE 'MioDatabase_Data' TO '/nuovo_percorso/MioDatabase_Data.mdf',
  MOVE 'MioDatabase_Log' TO '/nuovo_percorso/MioDatabase_Log.ldf';
GO

ripristino da completo, incrementali e transaction log

Per restore database e transaction log:

Utile per capire quando è stato eseguito il backup dei log e quale intervallo di tempo copre:

RESTORE HEADERONLY FROM DISK='/backup/MioDB_log_001.trn';
GO
restore database MioDatabase from disk = '/backup/MioDatabase_full.bak' with norecovery
go
restore database MioDatabase from disk = '/backup/MioDatabase_incremental.bak' with norecovery
go
restore log MioDatabase from disk = '/backup/MioDatabase_log01.bak' with norecovery
go

L'ultimo backup del transaction log viene ripristinato con l'opzione recovery:

restore log MioDatabase from disk = '/backup/MioDatabase_log02.bak' with recovery
go

Per point in time:

restore log MioDatabase from disk = '/backup/MioDatabase_log02.bak' with stopat='2026-06-10T15:30:00',recovery
go

post restore

SELECT name,state_desc,recovery_model_desc FROM sys.databases WHERE name = 'MioDatabase';
GO

Eventualmente cambiare il compatibility level

select name,compatibility_level from sys.databases
go
alter database MioDatabase set compatibility_level=170
go


snapshot

Possibile solo con enterprise Edition e dalla versione 2012.

Creazione snapshot

CREATE DATABASE [SCHTCPOS_SS_20261012_110304] ON (NAME = [sofleo_atg_migration_01], FILENAME = 'G:\snapshot\SCHTCPOS_SS_20261012_110304_sofleo_atg_migration_01.ss') AS SNAPSHOT OF [SCHTCPOS];

Restore da snapshot

ALTER DATABASE SCHTCPOS SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [SCHTCPOS] from database_snapshot='SCHTCPOS_SS_20261012_110304';
ALTER DATABASE SCHTCPOS SET MULTI_USER;

Cancellazione snapshot

DROP DATABASE [SCHTCPOS_SS_20261012_110304];


Per generare comando di esecuzione snapshot

-- ============================================================================
-- Script per la generazione dinamica del comando CREATE DATABASE SNAPSHOT
-- Target directory: G:\snapshot\
-- ============================================================================

DECLARE @SourceDB SYSNAME = 'TuoNomeDatabase'; -- Sostituisci con il nome del tuo database
DECLARE @SnapshotName SYSNAME = @SourceDB + '_SS_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '_' + REPLACE(CONVERT(VARCHAR(8), GETDATE(), 108), ':', '');
DECLARE @SnapshotPath NVARCHAR(512) = N'G:\snapshot\';

DECLARE @SQL NVARCHAR(MAX) = N'CREATE DATABASE ' + QUOTENAME(@SnapshotName) + ' ON ';

-- Recupera dinamicamente tutti i file di dati (tipo 0 = Row data) del database sorgente
SELECT @SQL = @SQL + STUFF((
    SELECT 
        N', (NAME = ' + QUOTENAME(f.name) + 
        N', FILENAME = ''' + @SnapshotPath + @SnapshotName + N'_' + f.name + N'.ss'')'
    FROM sys.master_files f
    WHERE f.database_id = DB_ID(@SourceDB)
      AND f.type = 0 -- Solo file di dati (esclude i file di log)
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') + 
    N' AS SNAPSHOT OF ' + QUOTENAME(@SourceDB) + N';';

-- Stampa a schermo il comando generato (utile per verifica o log)
PRINT '------------------------------------------------------------';
PRINT 'Comando generato per lo Snapshot:';
PRINT '------------------------------------------------------------';
PRINT @SQL;

storico backup

Interroga gli eventi di backup via VSS

SELECT 
    bs.database_name,
    bs.backup_start_date,
    bs.backup_finish_date,
    CASE bs.type 
        WHEN 'D' THEN 'Full'
        WHEN 'I' THEN 'Differential'
        WHEN 'L' THEN 'Log'
    END AS backup_type,
    bs.is_snapshot,
    bs.is_copy_only,
    bs.name AS backup_set_name,
    bmf.physical_device_name
FROM msdb.dbo.backupset bs
JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id
WHERE (bs.is_snapshot = 1 -- solo backup via snapshot VSS
   OR bmf.physical_device_name LIKE '{%') -- I backup VSS generano spesso GUID virtuali come dispositivo
  AND (bs.backup_start_date between '2026-09-22 01:00:00' and '2026-09-22 05:00:00')
ORDER BY bs.backup_start_date DESC;


Eventi di snapshot

EXEC sp_readerrorlog 0, 1, 'I/O is frozen';
EXEC sp_readerrorlog 0, 1, 'I/O was resumed';

Per filtrare per data

DECLARE @StartDate DATETIME = '2026-09-25 00:00:00';
DECLARE @EndDate   DATETIME = '2026-09-25 10:00:00';
EXEC sys.xp_readerrorlog 
   0,                      -- Log attuale
   1,                      -- SQL Server Log
   N'I/O was resumed',     -- Testo da cercare
   NULL,                   -- Secondo testo (opzionale)
   @StartDate,             -- Data/Ora inizio
   @EndDate,               -- Data/Ora fine
   N'DESC';                -- Ordine di visualizzazione