Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Restaurar um banco de dados SQL Server (T-SQL)


Se você usa o SQL Server Management Studio (SSMS) ou alguma outra GUI para gerenciar seus bancos de dados, pode estar acostumado a fazer backup e restaurar bancos de dados usando “apontar e clicar”.

Normalmente, isso envolve clicar com o botão direito do mouse no banco de dados e selecionar Restaurar ou semelhante, seguindo os prompts (por exemplo, ao restaurar um banco de dados no Azure Data Studio).

Mas se você precisar fazer isso com T-SQL, você pode usar o RESTORE DATABASE demonstração.

Exemplo


Segue um exemplo básico:
RESTORE DATABASE World
  FROM DISK = N'/var/opt/mssql/Bak/World.bak' 
  WITH FILE = 1;

Isso é quase tão simples quanto pode ser. O RESTORE DATABASE A instrução tem uma sintaxe bastante complexa (como a maioria das coisas T-SQL), mas essa instrução é suficiente para uma operação básica de restauração padrão.

Neste caso, restaurei um banco de dados chamado World de um arquivo .bak. Eu usei FROM DISK para especificar que era de um arquivo .bak e forneci o caminho completo para esse arquivo. Outras opções aqui incluem FROM TAPE e FROM URL .

Também incluí WITH FILE = 1 aqui, mas esse é o valor padrão de qualquer maneira. Esta cláusula especifica o número do arquivo do conjunto de backup a ser usado. Ou seja, qual conjunto de backup usar no arquivo (um arquivo pode ter vários conjuntos de backup).

Obter uma lista de conjuntos de backup


Você pode usar RESTORE HEADERONLY para obter uma lista de conjuntos de backup no arquivo. Mais especificamente, ele retorna um conjunto de resultados de informações de cabeçalho de backup para todos os conjuntos de backup.

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

Isso retorna muitas colunas, então não vou apresentá-las todas aqui.

Uma das colunas é chamada Posição . Isso deve ser usado com o FILE = opção ao restaurar o banco de dados.

Exemplo com mais opções


Aqui está um exemplo com mais opções:
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;

Na verdade, esse é o script que o Azure Data Studio gerou para mim quando usei a interface GUI para iniciar uma operação de restauração. Ao fazer isso, o Azure Data Studio oferece a opção de executar a restauração imediatamente ou gerar um script com o código T-SQL que você pode executar posteriormente.

Neste caso, o script usa o MOVE argumento para mover cada nome de arquivo lógico no arquivo de backup para o local do arquivo físico especificado no sistema operacional. Nesse caso, o arquivo .bak usou um local de arquivo físico diferente (e usou caminhos de arquivo do Windows) e, portanto, isso teve que mudar para se adequar ao meu sistema. Veja abaixo uma explicação de como obter essas informações.

O NOUNLOAD é realmente uma opção de fita. Ele garante que a fita não seja descarregada da unidade após a conclusão da restauração. Dado que eu não estava restaurando da fita, essa opção foi ignorada.

As STATS O argumento permite avaliar o progresso da operação de restauração. Ele especifica que uma mensagem será exibida toda vez que outra porcentagem for concluída. Se você não incluir um valor percentual aqui, o SQL Server exibirá uma mensagem após a conclusão de cada 10%.

RESTAURAR ARQUIVOS SOMENTE


Se você quiser criar uma instrução como a anterior, que usa o comando MOVE argumento para mover cada nome de arquivo lógico no arquivo de backup, para o local do arquivo físico especificado no sistema operacional, você pode usar RESTORE FILELISTONLY para retornar os nomes de arquivos lógicos (e mais).

RESTORE FILELISTONLY retorna um conjunto de resultados contendo uma lista do banco de dados e arquivos de log contidos no conjunto de backup.

Aqui está um exemplo usando o mesmo arquivo .bak WideWorldImporters do exemplo anterior:
RESTORE FILELISTONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';

Resultado (usando saída vertical):
-[ 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

Assim, podemos ver que os locais físicos desse arquivo usam caminhos de arquivo do Windows. Por exemplo, o primeiro (com um nome lógico de WWI_Primary ) tem um local físico de D:\Data\WideWorldImporters.mdf .

No meu caso, restaurei o banco de dados para o SQL Server para Linux (executando em um contêiner Docker no meu Mac), então, quando restaurei esse arquivo .bak no meu sistema, tive que alterar os caminhos físicos para se adequar ao meu sistema.

Claro, você também pode alterar os caminhos do arquivo ao restaurá-lo em uma máquina Windows, se necessário.

A Sintaxe Completa


Fazer backup e restaurar bancos de dados pode ser bastante complicado, dependendo de seus requisitos. O RESTORE declaração é projetada para cobrir muitos cenários diferentes. Em particular, abrange os seguintes cenários de restauração:
  • Restaure um banco de dados inteiro a partir de um backup completo do banco de dados (uma restauração completa).
  • Restaure parte de um banco de dados (uma restauração parcial).
  • Restaure arquivos ou grupos de arquivos específicos em um banco de dados (uma restauração de arquivo).
  • Restaure páginas específicas em um banco de dados (uma restauração de página).
  • Restaure um log de transações em um banco de dados (uma restauração de log de transações).
  • Reverta um banco de dados para o ponto no tempo capturado por um instantâneo do banco de dados.

A sintaxe completa contém muitas opções, portanto, se seus requisitos excederem o escopo deste artigo, confira a documentação da Microsoft para o RESTORE oficial sintaxe e explicação.

Leia também a Visão geral de restauração e recuperação da Microsoft para obter uma visão geral das várias considerações e abordagens para restaurar bancos de dados.