Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ripristina un database di SQL Server (T-SQL)

Se utilizzi SQL Server Management Studio (SSMS) o un'altra GUI per gestire i database, potresti essere abituato a eseguire il backup e il ripristino dei database utilizzando "punta e fai clic".

Di solito ciò comporta il clic con il pulsante destro del mouse sul database e la selezione di Ripristina o simili, quindi seguendo le istruzioni (ad esempio, durante il ripristino di un database in Azure Data Studio).

Ma se hai bisogno di farlo con T-SQL, puoi usare il RESTORE DATABASE dichiarazione.

Esempio

Ecco un esempio di base:

RESTORE DATABASE World
  FROM DISK = N'/var/opt/mssql/Bak/World.bak' 
  WITH FILE = 1;

Questo è quasi il più semplice possibile. Il RESTORE DATABASE ha una sintassi piuttosto complessa (come con la maggior parte delle cose T-SQL), ma questa istruzione è sufficiente per un'operazione di ripristino predefinita di base.

In questo caso, ho ripristinato un database chiamato World da un file .bak. Ho usato FROM DISK per specificare che proveniva da un file .bak e ho fornito il percorso completo di quel file. Altre opzioni qui includono FROM TAPE e FROM URL .

Ho incluso anche WITH FILE = 1 qui ma questo è comunque il valore predefinito. Questa clausola specifica il numero di file del set di backup da utilizzare. Ovvero, quale set di backup utilizzare nel file (un file può avere più set di backup).

Ottieni un elenco di set di backup

Puoi usare RESTORE HEADERONLY per ottenere un elenco di set di backup nel file. Più specificamente, restituisce un set di risultati di informazioni sull'intestazione del backup per tutti i set di backup.

Esempio:

RESTORE HEADERONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';

Questo restituisce molte colonne, quindi non le presenterò tutte qui.

Una delle colonne si chiama Posizione . Questo deve essere utilizzato con il FILE = opzione durante il ripristino del database.

Esempio con più opzioni

Ecco un esempio con più opzioni:

RESTORE DATABASE [WideWorldImporters] 
  FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak' 
  WITH FILE = 1,  
  MOVE N'WWI_Primary' TO N'/var/opt/mssql/data/WideWorldImporters.mdf',  
  MOVE N'WWI_UserData' TO N'/var/opt/mssql/data/WideWorldImporters_UserData.ndf',  
  MOVE N'WWI_Log' TO N'/var/opt/mssql/data/WideWorldImporters.ldf',  
  MOVE N'WWI_InMemory_Data_1' TO N'/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1',  
  NOUNLOAD,  
  STATS = 5;

Questo è in realtà lo script che Azure Data Studio ha generato per me quando ho usato l'interfaccia della GUI per avviare un'operazione di ripristino. Quando lo fai, Azure Data Studio ti offre la possibilità di eseguire immediatamente il ripristino o di generare uno script con il codice T-SQL che puoi eseguire in seguito.

In questo caso, lo script utilizza MOVE argomento per spostare ogni nome di file logico nel file di backup nel percorso del file fisico specificato sul sistema operativo. In questo caso, il file .bak utilizzava una diversa posizione del file fisico (e utilizzava i percorsi dei file di Windows) e quindi questo doveva cambiare per adattarsi al mio sistema. Vedi sotto per una spiegazione su come ottenere queste informazioni.

Il NOUNLOAD è in realtà un'opzione nastro. Garantisce che il nastro non venga scaricato dall'unità una volta completato il ripristino. Dato che non stavo ripristinando dal nastro, questa opzione è stata ignorata.

Le STATS argomento consente di valutare l'avanzamento dell'operazione di ripristino. Specifica che verrà visualizzato un messaggio ogni volta che viene completata un'altra percentuale. Se non includi un valore percentuale qui, SQL Server visualizzerà un messaggio dopo che ogni 10% è stato completato.

RIPRISTINA SOLO FILELIST

Se si desidera creare un'istruzione come quella precedente, che utilizza il MOVE argomento per spostare ogni nome di file logico nel file di backup, nella posizione del file fisico specificato sul sistema operativo, puoi usare RESTORE FILELISTONLY per restituire i nomi dei file logici (e altro).

RESTORE FILELISTONLY restituisce un set di risultati contenente un elenco del database e dei file di registro contenuti nel set di backup.

Ecco un esempio che utilizza lo stesso file .bak WideWorldImporters dell'esempio precedente:

RESTORE FILELISTONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';

Risultato (usando l'output verticale):

-[ RECORD 1 ]-------------------------
LogicalName          | WWI_Primary
PhysicalName         | D:\Data\WideWorldImporters.mdf
Type                 | D
FileGroupName        | PRIMARY
Size                 | 1073741824
MaxSize              | 35184372080640
FileId               | 1
CreateLSN            | 0
DropLSN              | 0
UniqueId             | 8d30f4f9-a463-404f-805a-9bd1c634b66b
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 11993088
SourceBlockSize      | 512
FileGroupId          | 1
LogGroupGUID         | NULL
DifferentialBaseLSN  | 626000002440500037
DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL
-[ RECORD 2 ]-------------------------
LogicalName          | WWI_UserData
PhysicalName         | D:\Data\WideWorldImporters_UserData.ndf
Type                 | D
FileGroupName        | USERDATA
Size                 | 2147483648
MaxSize              | 35184372080640
FileId               | 3
CreateLSN            | 37000000095200001
DropLSN              | 0
UniqueId             | 28d406e0-78ff-4400-9a4b-3a05d136b1f3
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 434962432
SourceBlockSize      | 512
FileGroupId          | 2
LogGroupGUID         | NULL
DifferentialBaseLSN  | 626000002440500037
DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL
-[ RECORD 3 ]-------------------------
LogicalName          | WWI_Log
PhysicalName         | E:\Log\WideWorldImporters.ldf
Type                 | L
FileGroupName        | NULL
Size                 | 104857600
MaxSize              | 2199023255552
FileId               | 2
CreateLSN            | 0
DropLSN              | 0
UniqueId             | 6ac6807e-8774-415b-8efc-e8c569b0855e
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 0
SourceBlockSize      | 512
FileGroupId          | 0
LogGroupGUID         | NULL
DifferentialBaseLSN  | 0
DifferentialBaseGUID | 00000000-0000-0000-0000-000000000000
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL
-[ RECORD 4 ]-------------------------
LogicalName          | WWI_InMemory_Data_1
PhysicalName         | D:\Data\WideWorldImporters_InMemory_Data_1
Type                 | S
FileGroupName        | WWI_InMemory_Data
Size                 | 0
MaxSize              | 0
FileId               | 65537
CreateLSN            | 624000000336200003
DropLSN              | 0
UniqueId             | f65663c8-a250-433e-bbe6-e13a5599a607
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 980090880
SourceBlockSize      | 512
FileGroupId          | 3
LogGroupGUID         | NULL
DifferentialBaseLSN  | 626000002440500037
DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL

Quindi possiamo vedere che le posizioni fisiche di questo file utilizzano i percorsi dei file di Windows. Ad esempio, il primo (con un nome logico di WWI_Primary ) ha una posizione fisica di D:\Data\WideWorldImporters.mdf .

Nel mio caso, ho ripristinato il database su SQL Server per Linux (in esecuzione in un contenitore Docker sul mio Mac), quindi quando ho ripristinato questo file .bak sul mio sistema, ho dovuto modificare i percorsi fisici per adattarli al mio sistema.

Naturalmente, se necessario, puoi anche modificare i percorsi dei file durante il ripristino su un computer Windows.

La sintassi completa

Il backup e il ripristino dei database possono essere piuttosto complicati, a seconda delle tue esigenze. Il RESTORE istruzione è progettata per coprire molti scenari diversi. In particolare, copre i seguenti scenari di ripristino:

  • Ripristina un intero database da un backup completo del database (un ripristino completo).
  • Ripristina parte di un database (ripristino parziale).
  • Ripristina file o filegroup specifici in un database (ripristino file).
  • Ripristina pagine specifiche su un database (ripristino di una pagina).
  • Ripristina un registro delle transazioni su un database (ripristino del registro delle transazioni).
  • Ripristina un database al momento acquisito da un'istantanea del database.

La sintassi completa contiene molte opzioni, quindi se i tuoi requisiti eccedono lo scopo di questo articolo, controlla la documentazione Microsoft per il RESTORE ufficiale sintassi e spiegazione.

Leggi anche la Panoramica di ripristino e ripristino di Microsoft per una panoramica delle varie considerazioni e approcci per il ripristino dei database.