Cos’è lo Snapshot del database su SQL Server

Lo Snapshot del database è la creazione di un’immagine immutabile del database, puoi pensarlo come scattare la foto corrente del database.

Se lo spiego attraverso un esempio sarà più chiaro.

Ad esempio, prendiamo l’istantanea del database AdventureWorks2014. Stiamo leggendo questa istantanea. Non sono ancora state apportate modifiche al database AdventureWorks2014. I nostri select vanno al database originale perché non vi è alcuna modifica nel database originale.

Se si verificano modifiche nel database originale, queste modifiche vengono scritte in uno spazio dedicato sul disco per lo Snapshot (chiamato File sparse).

Quando vogliamo leggere i dati, se i dati sono cambiati nel database originale, la versione invariata dei dati viene letta dal file sparse. In questo modo, la foto diventa intatta.

Anche se non occupa spazio su disco non appena otteniamo Snapshot, la dimensione dei file sparsi aumenterà all’aumentare delle modifiche nel database originale. Se la dimensione dei file sparsi cresce e non c’è più spazio nel disco, lo snapshot diventa sospetto ed è necessario eliminare lo snapshot.

Viene utilizzato principalmente con la tecnologia Mirroring.

Ti suggerisco di leggere il mio articolo “Mirroring del database su SQL Server”. Nel mirroring, non possiamo leggere dal database secondario. Quando vogliamo leggere dal database secondario, possiamo farlo con un’istantanea del database secondario.

E in questo modo, non creiamo un onere per il report nel database primario facendo le nostre query di report dal database secondario.

Oppure è possibile ottenere l’istantanea del database prima di eseguire un’operazione di aggiornamento o eliminazione batch. Un’operazione di aggiornamento o eliminazione non corretta può essere invertita utilizzando snapshot. Sarebbe un metodo molto più veloce rispetto al ritorno dal backup.

Snapshot deve essere sulla stessa istanza con il database.

Continuiamo con due esempi.

Nel primo esempio, otterremo un’istantanea per essere in grado di leggere dal database secondario del database con mirroring.

Nel secondo esempio, otterremo snapshot per invertire un’operazione di aggiornamento errata.

Example1:

Innanzitutto, il database con mirroring deve essere sincrono. Quindi l’immagine del tuo database secondario dovrebbe essere la seguente.

Quindi creiamo l’istantanea con l’aiuto del seguente script. È necessario specificare tutti i file nel database.

Nel nostro esempio, c’erano due file. Abbiamo creato snapshot per questi due file. Se non si ha familiarità con FileGroup e File, è possibile leggere il mio articolo “Come creare un database su SQL Server”.

1
2
3
4
5

CREARE DATABASE AdventureWorks2014_Snapshot SU
( NOME = AdventureWorks2012_Data, FILENAME = ‘C:\DB\Data\AdventureWorks2012_Data.ss’ ),
( NAME = AdventureWorks2014_Deneme, FILENAME = ‘C:\DB\Data\AdventureWorks2014_Deneme.ss’ )
COME ISTANTANEA DI AdventureWorks2014;
VAI

Ho ottenuto il seguente script da msdn.

Con il seguente script, è possibile trovare la dimensione dello snapshot sul disco e la dimensione massima che può crescere.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

SELEZIONARE DB_NAME(sd.come,
sd.name COME,
mf.name COME,
size_on_disk_bytes / 1024 COME,
mf2.dimensione / 128 COME
DA sys.master_files mf
JOIN sys.database sd
SU mf.database_id = sd.id_database
JOIN sys.master_files mf2
SU sd.source_database_id = mf2.database_id
E mf.id_file = mf2.file_id
CROCE APPLICARE sys. dm_io_virtual_file_stats(sd. database_id, mf.file_id)
DOVE mf. is_sparse = 1
E mf2. is_sparse = 0
ORDINA PER 1;

Il seguente set di risultati è tornato quando ho eseguito lo script. Ho impostato la dimensione di questi due file di dati su 256 mb.

Ecco perché l’istantanea può crescere fino a un massimo di 256 MB.

Abbiamo creato la nostra istantanea.

È possibile leggere dall’istantanea come se fosse un database dalla sezione Database-> Istantanee del database su SSMS.

Normalmente, non è possibile leggere dal database secondario sul mirroring. Ma puoi leggere dall’istantanea del database secondario.

Example2:

Eseguiamo lo script qui sotto nel database primario.

1
2
3
4
5

CREARE DATABASE AdventureWorks2014_Snapshot SU
( NOME = AdventureWorks2012_Data, FILENAME = ‘C:\DB\Data\AdventureWorks2012_Data.ss’ ),
( NAME = AdventureWorks2014_Deneme, FILENAME = ‘C:\DB\Data\AdventureWorks2014_Deneme.ss’ )
COME ISTANTANEA DI AdventureWorks2014;
VAI

Dopo aver preso Snapshot, eliminare tutti i record in qualsiasi tabella con l’aiuto del seguente script. Sto eliminando i record dalla tabella denominata Snapshot_deneme che ho creato in precedenza nel database AdventureWorks2014.

1
Elimina Dal Snapshot_deneme

Dopo il processo di eliminazione, è possibile ripristinare i record eliminati con l’aiuto del seguente script.

Ma se hai fatto un’altra operazione dopo aver scattato snapshot, perderai quelle modifiche.

1
2
3

master
VAI
RIPRISTINARE il DATABASE AdventureWorks2014 DA DATABASE_SNAPSHOT = ‘AdventureWorks2014_Snapshot’

dbtut

Autore: dbtut

Siamo un team con oltre 10 anni di gestione del database e l’esperienza di BI. Le nostre competenze: Oracle, SQL Server, PostgreSQL, MySQL, MongoDB, Elasticsearch, Kibana, Grafana.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.