sql >> Base de Datos >  >> RDS >> Sqlserver

Restaurar una base de datos de SQL Server (T-SQL)

Si usa SQL Server Management Studio (SSMS) o alguna otra GUI para administrar sus bases de datos, es posible que esté acostumbrado a realizar copias de seguridad y restaurar bases de datos usando "apuntar y hacer clic".

Por lo general, esto implica hacer clic derecho en la base de datos y seleccionar Restaurar o similar, luego siga las indicaciones (por ejemplo, al restaurar una base de datos en Azure Data Studio).

Pero si alguna vez necesita hacerlo con T-SQL, puede usar RESTORE DATABASE declaración.

Ejemplo

He aquí un ejemplo básico:

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

Esto es casi tan simple como puede ser. El RESTORE DATABASE tiene una sintaxis bastante compleja (como ocurre con la mayoría de las cosas de T-SQL), pero esta declaración es suficiente para una operación básica de restauración predeterminada.

En este caso, restauré una base de datos llamada Mundo desde un archivo .bak. Usé FROM DISK para especificar que era de un archivo .bak y proporcioné la ruta completa a ese archivo. Otras opciones aquí incluyen FROM TAPE y FROM URL .

También he incluido WITH FILE = 1 aquí, pero ese es el valor predeterminado de todos modos. Esta cláusula especifica el número de archivo del conjunto de copias de seguridad que se utilizará. Es decir, qué conjunto de copias de seguridad usar en el archivo (un archivo puede tener varios conjuntos de copias de seguridad).

Obtener una lista de conjuntos de copia de seguridad

Puedes usar RESTORE HEADERONLY para obtener una lista de conjuntos de copia de seguridad en el archivo. Más específicamente, devuelve un conjunto de resultados de información de encabezado de respaldo para todos los conjuntos de respaldo.

Ejemplo:

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

Esto devuelve muchas columnas, así que no las presentaré todas aquí.

Una de las columnas se llama Posición . Esto se debe usar con el FILE = opción al restaurar la base de datos.

Ejemplo con más opciones

Aquí hay un ejemplo con más opciones:

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;

Esta es en realidad la secuencia de comandos que Azure Data Studio generó para mí cuando usé la interfaz GUI para iniciar una operación de restauración. Cuando lo hace, Azure Data Studio le ofrece la opción de ejecutar la restauración inmediatamente o generar un script con el código T-SQL que puede ejecutar más tarde.

En este caso, el script usa MOVE argumento para mover cada nombre de archivo lógico en el archivo de copia de seguridad, a la ubicación de archivo físico especificada en el sistema operativo. En este caso, el archivo .bak usaba una ubicación de archivo física diferente (y usaba rutas de archivos de Windows), por lo que tuvo que cambiar para adaptarse a mi sistema. Consulte a continuación para obtener una explicación de cómo obtener esta información.

El NOUNLOAD es en realidad una opción de cinta. Garantiza que la cinta no se descargue de la unidad una vez finalizada la restauración. Dado que no estaba restaurando desde una cinta, se ignoró esta opción.

Las STATS El argumento le permite medir el progreso de la operación de restauración. Especifica que se mostrará un mensaje cada vez que se complete otro porcentaje. Si no incluye un valor de porcentaje aquí, SQL Server mostrará un mensaje después de completar cada 10 %.

RESTAURAR SOLO LA LISTA DE ARCHIVOS

Si quisiera crear una declaración como la anterior, que usa el MOVE argumento para mover cada nombre de archivo lógico en el archivo de copia de seguridad, a la ubicación del archivo físico especificado en el sistema operativo, puede usar RESTORE FILELISTONLY para devolver los nombres de archivo lógicos (y más).

RESTORE FILELISTONLY devuelve un conjunto de resultados que contiene una lista de la base de datos y los archivos de registro contenidos en el conjunto de copia de seguridad.

Aquí hay un ejemplo usando el mismo archivo .bak de WideWorldImporters del ejemplo anterior:

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

Resultado (usando salida 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

Entonces podemos ver que las ubicaciones físicas de este archivo usan rutas de archivos de Windows. Por ejemplo, el primero (con un nombre lógico de WWI_Primary ) tiene una ubicación física de D:\Data\WideWorldImporters.mdf .

En mi caso, restauré la base de datos a SQL Server para Linux (que se ejecuta en un contenedor Docker en mi Mac), por lo que cuando restauré este archivo .bak en mi sistema, tuve que cambiar las rutas físicas para adaptarlas a mi sistema.

Por supuesto, también puede cambiar las rutas de archivo al restaurarlo en una máquina con Windows si es necesario.

La sintaxis completa

La copia de seguridad y la restauración de bases de datos pueden ser bastante complicadas, según sus requisitos. El RESTORE La declaración está diseñada para cubrir muchos escenarios diferentes. En particular, cubre los siguientes escenarios de restauración:

  • Restaurar una base de datos completa a partir de una copia de seguridad completa de la base de datos (una restauración completa).
  • Restaurar parte de una base de datos (una restauración parcial).
  • Restaurar archivos o grupos de archivos específicos en una base de datos (una restauración de archivos).
  • Restaurar páginas específicas en una base de datos (una restauración de página).
  • Restaurar un registro de transacciones en una base de datos (una restauración del registro de transacciones).
  • Revertir una base de datos al punto en el tiempo capturado por una instantánea de la base de datos.

La sintaxis completa contiene muchas opciones, por lo que si sus requisitos superan el alcance de este artículo, consulte la documentación de Microsoft para obtener el RESTORE oficial. sintaxis y explicación.

Lea también la Descripción general de restauración y recuperación de Microsoft para obtener una descripción general de las diversas consideraciones y enfoques para restaurar bases de datos.