Eseguire la migrazione di un database di SQL Server da Windows a Linux usando il backup e ripristino

Si applica a: SQL Server - Linux

La funzionalità di backup e ripristino di SQL Server è il metodo consigliato per eseguire la migrazione di un database da SQL Server in Windows a SQL Server in Linux. In questa esercitazione vengono illustrati i passaggi necessari per spostare un database in Linux con le tecniche di backup e ripristino.

  • Creare un file di backup in Windows con SSMS
  • Installare una shell bash in Windows
  • Spostare il file di backup in Linux dalla shell bash
  • Ripristinare il file di backup in Linux con Transact-SQL
  • Eseguire una query per verificare la migrazione

È anche possibile creare un gruppo di disponibilità SQL Server Always On di SQL Server per eseguire la migrazione di un database di SQL Server da Windows a Linux. Vedere sql-server-linux-availability-group-cross-platform.

Prerequisiti

Per completare l'esercitazione, è necessario soddisfare i prerequisiti seguenti:

Creare un backup in Windows

Esistono diversi modi per creare un file di backup di un database in Windows. La procedura seguente usa SQL Server Management Studio (SSMS).

  1. Avviare SQL Server Management Studio nel computer Windows.

  2. Nella finestra di dialogo della connessione immettere localhost.

  3. In Esplora oggetti espandere Database.

  4. Fare clic con il pulsante destro del mouse sul database di destinazione, scegliere Attività e quindi selezionare Backup.

    Screenshot dell'uso di SSMS per creare un file di backup.

  5. Nella finestra di dialogo Backup database verificare che Tipo backup sia impostato su Completo e che Backup su sia impostato su Disco. Prendere nota del nome e del percorso del file. Ad esempio, un database denominato YourDB in SQL Server 2019 (15.x) ha il percorso predefinito di C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\YourDB.bak.

  6. Selezionare OK per eseguire un backup del database.

Un'altra opzione consiste nell'eseguire una query Transact-SQL per creare il file di backup. Il comando Transact-SQL seguente esegue le stesse azioni dei passaggi precedenti per un database denominato YourDB:

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

Installare una shell bash in Windows

Per ripristinare il database, è prima necessario trasferire il file di backup dal computer Windows al computer Linux di destinazione. In questa esercitazione il file viene spostato in Linux da una shell bash (finestra del terminale) in esecuzione in Windows.

  1. Installare una shell bash nel computer Windows che supporta i comandi scp (copia sicura) e ssh (accesso remoto). Due esempi di tali situazioni:

  2. Aprire una sessione di bash in Windows.

Copiare il file di backup in Linux

  1. Nella sessione di bash passare alla directory che contiene il file di backup. Ad esempio:

    cd 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\'
    
  2. Usare il comando scp per trasferire il file nel computer Linux di destinazione. L'esempio seguente trasferisce YourDB.bak nella home directory di user1 nel server Linux con indirizzo IP 192.0.2.9:

    scp YourDB.bak user1@192.0.2.9:./
    

    Screenshot del comando scp.

Suggerimento

Sono disponibili alternative all'uso di scp per il trasferimento di file. Una prevede l'uso di Samba per configurare una condivisione di rete SMB tra Windows e Linux. Per una procedura dettagliata su Ubuntu, vedere Samba come file server. Dopo averla stabilita, è possibile accedervi come a una condivisione file di rete da Windows, ad esempio \\machinenameorip\share.

Spostare il file di backup prima del ripristino

A questo punto, il file di backup si trova nel server Linux nella home directory dell'utente. Prima di ripristinare il database in SQL Server, è necessario inserire il backup in una sottodirectory di /var/opt/mssql, perché è di proprietà dell'utente mssql e del gruppo mssql. Per modificare il percorso di backup predefinito, vedere l'articolo Configurare con mssql-conf.

  1. Nella stessa sessione di bash in Windows connettersi in modalità remota al computer Linux di destinazione con ssh. Nell'esempio seguente viene eseguita la connessione al computer Linux 192.0.2.9 come utente user1.

    ssh user1@192.0.2.9
    

    A questo punto i comandi vengono eseguiti nel server Linux remoto.

  2. Entrare in modalità utente con privilegi avanzati.

    sudo su
    
  3. Creare una nuova directory di backup. Il parametro -p non esegue alcuna operazione se la directory esiste già.

    mkdir -p /var/opt/mssql/backup
    
  4. Spostare il file di backup in tale directory. Nell'esempio seguente il file di backup si trova nella home directory di user1. Modificare il comando in modo che corrisponda al percorso e al nome del file di backup.

    mv /home/user1/YourDB.bak /var/opt/mssql/backup/
    
  5. Uscire dalla modalità utente con privilegi avanzati.

    exit
    

Ripristinare il database in Linux

Per ripristinare il backup del database, è possibile usare il comando RESTORE DATABASE di Transact-SQL (TQL).

Nei passaggi seguenti viene usato lo strumento sqlcmd. Se gli strumenti di SQL Server non sono stati installati, vedere Installare gli strumenti da riga di comando di SQL Server in Linux.

  1. Nello stesso terminale avviare sqlcmd. Nell'esempio seguente viene eseguita la connessione all'istanza di SQL Server locale con l'utente SA. Immettere la password quando richiesto o specificare la password aggiungendo il parametro -P.

    sqlcmd -S localhost -U SA
    
  2. Al prompt >1 immettere il comando RESTORE DATABASE seguente, premendo INVIO dopo ogni riga (non è possibile copiare e incollare tutte le righe del comando in una sola volta). Sostituire tutte le occorrenze di YourDB con il nome del database.

    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
    

    Verrà visualizzato un messaggio che informa che il database è stato ripristinato.

    RESTORE DATABASE potrebbe restituire un errore come quello dell'esempio seguente:

    File 'YourDB_Product' cannot be restored to 'Z:\Microsoft SQL Server\MSSQL15.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\MSSQL15.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf" failed with the operating system error 2(The system cannot find the file specified.).
    

    In questo caso, il database contiene file secondari. Se questi file non sono specificati nella clausola MOVE di RESTORE DATABASE, la procedura di ripristino prova a crearli nello stesso percorso del server originale.

    È possibile elencare tutti i file inclusi nel backup:

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

    Verrà visualizzato un elenco simile a quello seguente (che elenca solo le prime due colonne):

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

    È possibile usare questo elenco per creare le clausole MOVE per i file aggiuntivi. In questo esempio RESTORE DATABASE è:

    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. Verificare il ripristino elencando tutti i database nel server. Il database ripristinato deve essere elencato.

    SELECT Name FROM sys.Databases
    GO
    
  4. Eseguire altre query sul database di cui è stata eseguita la migrazione. Il comando seguente sostituisce il contesto con il database YourDB e seleziona alcune righe da una delle tabelle.

    USE YourDB
    SELECT * FROM YourTable
    GO
    
  5. Dopo aver terminato di usare sqlcmd, digitare exit.

  6. Dopo aver terminato di usare la sessione ssh remota, digitare di nuovo exit.

Passaggio successivo

In questa esercitazione si è appreso come eseguire il backup di un database in Windows e come spostarlo in un server Linux che esegue SQL Server. Contenuto del modulo:

  • Usare SSMS e Transact-SQL per creare un file di backup in Windows
  • Installare una shell Bash in Windows
  • Usare scp per spostare i file di backup da Windows a Linux
  • Usare ssh per connettersi in modalità remota al computer Linux
  • Rilocare il file di backup per prepararsi al ripristino
  • Usare sqlcmd per eseguire i comandi Transact-SQL
  • Ripristinare il backup del database con il comando RESTORE DATABASE
  • Eseguire la query per verificare la migrazione

Esaminare quindi gli altri scenari di migrazione per SQL Server in Linux.