Migración de una base de datos SQL Server de Windows a Linux mediante Copia de seguridad y restauración

Se aplica a:SQL Server: Linux

La característica Copia de seguridad y restauración de SQL Server es el método recomendado para migrar una base de datos de SQL Server en Windows a SQL Server en Linux. Este tutorial le guiará por los pasos necesarios para mover una base de datos a Linux con técnicas de copia de seguridad y restauración.

  • Creación de un archivo de copia de seguridad en Windows con SSMS
  • Instalación de un shell de Bash en Windows
  • Traslado del archivo de copia de seguridad a Linux desde el shell de Bash
  • Restauración del archivo de copia de seguridad en Linux con Transact-SQL
  • Ejecución de una consulta para comprobar la migración

También puede crear un Grupo de disponibilidad Always On de SQL Server para migrar una base de datos de SQL Server de Windows a Linux. Consulte sql-server-linux-availability-group-cross-platform.

Prerequisites

Debe disponer de lo siguiente para poder completar este tutorial:

Creación de una copia de seguridad en Windows

Hay varias maneras de crear un archivo de copia de seguridad de una base de datos en Windows. Para los pasos siguientes, se usa SQL Server Management Studio (SSMS).

  1. Inicie SQL Server Management Studio en el equipo Windows.

  2. En el cuadro de diálogo de conexión, escriba localhost.

  3. En el Explorador de objetos, expanda Bases de datos.

  4. Haga clic con el botón derecho en la base de datos de destino, seleccione Tareas y, luego, haga clic en Hacer copia de seguridad…

    Use SSMS to create a backup file

  5. En el cuadro de diálogo Copia de seguridad de la base de datos, compruebe que Tipo de copia de seguridad es Completo y que Copia de seguridad en es Disco. Tome nota del nombre y la ubicación del archivo. Por ejemplo, una base de datos denominada YourDB en SQL Server 2016 tiene una ruta de acceso de copia de seguridad predeterminada de C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\YourDB.bak.

  6. Seleccione Aceptar para realizar una copia de seguridad de la base de datos.

Nota:

Otra opción consiste en ejecutar una consulta de Transact-SQL para crear el archivo de copia de seguridad. El siguiente comando de Transact-SQL realiza las mismas acciones que los pasos anteriores para una base de datos denominada YourDB:

BACKUP DATABASE [YourDB] TO  DISK =
N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\YourDB.bak'
WITH NOFORMAT, NOINIT, NAME = N'YourDB-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO

Instalación de un shell de Bash en Windows

Para restaurar la base de datos, primero debe transferir el archivo de copia de seguridad del equipo Windows al equipo Linux de destino. En este tutorial, moveremos el archivo a Linux desde un shell de Bash (ventana de terminal) que se ejecuta en Windows.

  1. Instale un shell de Bash en un equipo Windows que admita los comandos scp (copia segura) y ssh (inicio de sesión remoto). Dos ejemplos incluyen:

  2. Abra una sesión de Bash en Windows.

Copia del archivo de copia de seguridad en Linux

  1. En la sesión de Bash, vaya al directorio que contiene el archivo de copia de seguridad. Por ejemplo:

    cd 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\'
    
  2. Use el comando scp para transferir el archivo al equipo Linux de destino. En el ejemplo siguiente se transfiere YourDB.bak al directorio particular de user1 en el servidor Linux con una dirección IP de 192.0.2.9:

    scp YourDB.bak user1@192.0.2.9:./
    

    scp command

Sugerencia

Hay alternativas al uso de scp para la transferencia de archivos. Una consiste en usar Samba para configurar un recurso compartido de red de SMB entre Windows y Linux. Para ver un tutorial sobre Ubuntu, consulte Cómo crear un recurso compartido de red a través de Samba. Una vez establecido, puede acceder a él como un recurso compartido de archivos de red desde Windows, como \\machinenameorip\share.

Traslado del archivo de copia de seguridad antes de la restauración

En este momento, el archivo de copia de seguridad se encuentra en el servidor Linux en el directorio particular del usuario. Antes de restaurar la base de datos a SQL Server, debe colocar la copia de seguridad en un subdirectorio de /var/opt/mssql, ya que es propiedad del usuario mssql y del grupo mssql. Si quiere cambiar la ubicación de copia de seguridad predeterminada, vea el artículo Configuración con mssql-conf.

  1. En la misma sesión de Bash de Windows, conéctese de forma remota al equipo Linux de destino con ssh. En el ejemplo siguiente, se realiza la conexión al equipo Linux 192.0.2.9 como usuario user1.

    ssh user1@192.0.2.9
    

    Ahora está ejecutando comandos en el servidor Linux remoto.

  2. Acceda al modo de superusuario.

    sudo su
    
  3. Cree un directorio de copia de seguridad. El parámetro -p no hace nada si el directorio ya existe.

    mkdir -p /var/opt/mssql/backup
    
  4. Mueva el archivo de copia de seguridad a ese directorio. En el ejemplo siguiente, el archivo de copia de seguridad reside en el directorio particular de user1. Cambie el comando para que coincida con la ubicación y el nombre del archivo de copia de seguridad.

    mv /home/user1/YourDB.bak /var/opt/mssql/backup/
    
  5. Salga del modo de superusuario.

    exit
    

Restauración de la base de datos en Linux

Para restaurar la copia de seguridad de base de datos, puede usar el comando RESTORE DATABASE de Transact-SQL (TQL).

Nota:

En los pasos siguientes se usa la herramienta sqlcmd. Si no ha instalado las Herramientas de SQL Server, consulte Instalación de las herramientas de línea de comandos de SQL Server en Linux.

  1. En el mismo terminal, inicie sqlcmd. En el ejemplo siguiente se conecta a la instancia de SQL Server local con el usuario SA. Escriba la contraseña cuando se le solicite o especifíquela mediante la adición del parámetro -P.

    sqlcmd -S localhost -U SA
    
  2. En el símbolo del sistema >1, escriba el siguiente comando RESTORE DATABASE. Para ello, presione ENTRAR después de cada línea, ya que no puede copiar y pegar a la vez este comando de varias líneas al completo. Reemplace todas las apariciones de YourDB por el nombre de la base de datos.

    RESTORE DATABASE YourDB
    FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
    WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf',
    MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'
    GO
    

    Debería obtener un mensaje que indica que la base de datos se ha restaurado correctamente.

    RESTORE DATABASE puede devolver un error como el del ejemplo siguiente:

    File 'YourDB_Product' cannot be restored to 'Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf'. Use WITH MOVE to identify a valid location for the file.
    Msg 5133, Level 16, State 1, Server servername, Line 1
    Directory lookup for the file "Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf" failed with the operating system error 2(The system cannot find the file specified.).
    

    En este caso, la base de datos contiene archivos secundarios. Si estos archivos no se especifican en la cláusula MOVE de RESTORE DATABASE, el procedimiento de restauración intentará crearlos en la misma ruta de acceso que el servidor original.

    Puede enumerar todos los archivos incluidos en la copia de seguridad:

    RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
    GO
    

    Debería obtener una lista como la que aparece a continuación (solo se muestran las dos primeras columnas):

    LogicalName         PhysicalName                                                                 ..............
    ----------------------------------------------------------------------------------------------------------------------
    YourDB              Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB.mdf          ..............
    YourDB_Product      Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf  ..............
    YourDB_Customer     Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Customer.ndf ..............
    YourDB_log          Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Log.ldf      ..............
    

    Puede usar esta lista para crear cláusulas MOVE para los archivos adicionales. En este ejemplo, RESTORE DATABASE es:

    RESTORE DATABASE YourDB
    FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
    WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf',
    MOVE 'YourDB_Product' TO '/var/opt/mssql/data/YourDB_Product.ndf',
    MOVE 'YourDB_Customer' TO '/var/opt/mssql/data/YourDB_Customer.ndf',
    MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'
    GO
    
  3. Compruebe la restauración mediante la enumeración de todas las bases de datos del servidor. La base de datos restaurada debería aparecer en la lista.

    SELECT Name FROM sys.Databases
    GO
    
  4. Ejecute otras consultas en la base de datos migrada. El comando siguiente cambia el contexto a la base de datos YourDB y selecciona las filas de una de sus tablas.

    USE YourDB
    SELECT * FROM YourTable
    GO
    
  5. Cuando haya terminado de usar sqlcmd, escriba exit.

  6. Cuando haya terminado de trabajar en la sesión remota de ssh, vuelva a escribir exit.

Paso siguiente

En este tutorial ha aprendido a realizar una copia de seguridad de una base de datos en Windows y a moverla a un servidor de Linux con SQL Server. Ha aprendido a:

  • Uso de SSMS y Transact-SQL para crear un archivo de copia de seguridad en Windows
  • Instalación de un shell de Bash en Windows
  • Uso de scp para mover archivos de copia de seguridad de Windows a Linux
  • Uso de ssh para conectarse de forma remota al equipo Linux
  • Reubicación del archivo de copia de seguridad a fin de prepararlo para la restauración
  • Uso de sqlcmd para ejecutar comandos Transact-SQL
  • Restauración de la copia de seguridad de base de datos con el comando RESTORE DATABASE
  • Ejecución de la consulta para comprobar la migración

Explore ahora otros escenarios de migración para SQL Server en Linux.