使用備份與還原將 SQL Server 資料庫從 Windows 移轉至 Linux

適用於:SQL Server - Linux

SQL Server 的備份與還原功能是將資料庫從 Windows 上的 SQL Server 移轉至 Linux 上的 SQL Server 時建議使用的方式。 在本教學課程中,您將逐步完成使用備份與還原技術將資料庫移至 Linux 所需的步驟。

  • 使用 SSMS 在 Windows 上建立備份檔案
  • 在 Windows 上安裝 Bash Shell
  • 從 Bash Shell 將備份檔案移至 Linux
  • 使用 Transact-SQL 在 Linux 上還原備份檔案
  • 執行查詢以確認移轉

您也可以建立 SQL Server Always On 可用性群組,將 SQL Server 資料庫從 Windows 移轉至 Linux。 請參閱 sql-server-linux-availability-group-cross-platform

Prerequisites

必須擁有下列先決條件,才能完成本教學課程:

在 Windows 上建立備份

有數種方式可以在 Windows 上建立資料庫的備份檔案。 下列步驟使用 SQL Server Management Studio (SSMS)。

  1. 在 Windows 電腦上啟動 SQL Server Management Studio

  2. 在 [連線] 對話方塊中輸入 localhost

  3. 在 [物件總管] 中,展開 [資料庫]。

  4. 以滑鼠右鍵按一下目標資料庫,選取 [工作],然後按一下 [備份...]

    Use SSMS to create a backup file

  5. 在 [備份資料庫] 對話方塊中,確認 [備份類型] 是 [完整],而 [備份至] 是[磁碟]。 請記下檔案的名稱和位置。 例如,在 SQL Server 2016 上名為 YourDB 的資料庫具有預設備份路徑 C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\YourDB.bak

  6. 選取 [確定],以備份您的資料庫。

注意

另一個選項是執行 Transact-SQL 查詢以建立備份檔案。 下列 Transact-SQL 命令會針對名為 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

在 Windows 上安裝 Bash Shell

若要還原資料庫,您必須先將備份檔案從 Windows 電腦傳輸到目標 Linux 電腦。 在本教學課程中,我們會從 Windows 上執行的 Bash Shell (終端機視窗) 將檔案移至 Linux。

  1. 在 Windows 電腦上安裝支援 scp (安全複製) 和 ssh (遠端登入) 命令的 Bash Shell。 兩個範例如下:

  2. 在 Windows 上開啟 Bash 工作階段。

將備份檔案複製到 Linux

  1. 在您的 Bash 工作階段中,瀏覽至包含備份檔案的目錄。 例如:

    cd 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\'
    
  2. 使用 scp 命令將檔案傳輸到目標 Linux 電腦。 下列範例會將 YourDB.bak 傳輸到 Linux 伺服器 (IP 位址為 192.0.2.9) 上的 user1 主目錄:

    scp YourDB.bak user1@192.0.2.9:./
    

    scp command

提示

使用 scp 來進行檔案傳輸有一些替代方案。 其中一個是使用 Samba 來設定 Windows 與 Linux 之間的 SMB 網路共用。 如需 Ubuntu 的逐步解說,請參閱 How to Create a Network Share Via Samba (如何透過 Samba 建立網路共用)。 建立之後,就可以像存取網路檔案共用般地,從 Windows 進行存取,例如 \\machinenameorip\share

在還原之前移動備份檔案

此時,備份檔案是在您 Linux 伺服器上的使用者主目錄中。 在將資料庫還原至 SQL Server 之前,必須將備份置於 /var/opt/mssql 的子目錄中,因為這是使用者 mssql 與群組 mssql 所擁有。 若想要變更預設的備份位置,請參閱 使用 mssql-conf 設定 一文。

  1. 在相同的 Windows Bash 工作階段中,使用 ssh 從遠端連線到您的目標 Linux 電腦。 下列範例會以使用者 user1 的身分連線到 Linux 電腦 192.0.2.9

    ssh user1@192.0.2.9
    

    您現在正在遠端 Linux 伺服器上執行命令。

  2. 進入超級使用者模式。

    sudo su
    
  3. 建立新的備份目錄。 如果目錄已存在,-p 參數就不會執行任何動作。

    mkdir -p /var/opt/mssql/backup
    
  4. 將備份檔案移至該目錄。 在下列範例中,備份檔案位於 user1 主目錄中。 請變更命令,使其符合備份檔案的位置和檔案名稱。

    mv /home/user1/YourDB.bak /var/opt/mssql/backup/
    
  5. 結束超級使用者模式。

    exit
    

在 Linux 上還原資料庫

若要還原資料庫備份,您可以使用 RESTORE DATABASE Transact-SQL (TQL) 命令。

注意

下列步驟使用 sqlcmd 工具。 如果您尚未安裝 SQL Server 工具,請參閱在 Linux 上安裝 SQL Server 命令列工具

  1. 在相同的終端機中啟動 sqlcmd。 下列範例會使用 SA 使用者連線到本機 SQL Server 執行個體。 請在出現提示時輸入密碼,或是新增 -P 參數來指定密碼。

    sqlcmd -S localhost -U SA
    
  2. >1 提示字元中,輸入下列 RESTORE DATABASE 命令,並在每一行之後按 ENTER 鍵 (您無法一次複製並貼上整個多行命令)。 請以您的資料庫名稱取代所有出現的 YourDB

    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
    

    您應該會收到已成功還原資料庫的訊息。

    RESTORE DATABASE 可能會傳回如下列範例所示的錯誤:

    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.).
    

    在此情況下,資料庫包含次要檔案。 如果未在 RESTORE DATABASEMOVE 子句中指定這些檔案,還原程式會嘗試在與原始伺服器相同的路徑中建立這些檔案。

    您可以列出備份中包含的所有檔案:

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

    您應該會取得如下所示的清單 (只列出兩個第一個資料行):

    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      ..............
    

    您可以使用這份清單來為其他檔案建立 MOVE 子句。 在此範例中,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. 列出伺服器上的所有資料庫,以確認還原。 應該會列出已還原的資料庫。

    SELECT Name FROM sys.Databases
    GO
    
  4. 在您移轉的資料庫上執行其他查詢。 下列命令會將內容切換至 YourDB 資料庫,並從它的其中一個資料表選取資料列。

    USE YourDB
    SELECT * FROM YourTable
    GO
    
  5. 當您完成使用 sqlcmd 時,請鍵入 exit

  6. 當您完成在遠端 ssh 工作階段中的工作時,請再次鍵入 exit

後續步驟

在本教學課程中,您已了解如何在 Windows 上備份資料庫,並將其移至執行 SQL Server 的 Linux 伺服器。 您已了解如何︰

  • 使用 SSMS 和 Transact-SQL 在 Windows 上建立備份檔案
  • 在 Windows 上安裝 Bash Shell
  • 使用 scp 將備份檔案從 Windows 移至 Linux
  • 使用 ssh 從遠端連線到您的 Linux 電腦
  • 重新放置備份檔案以準備進行還原
  • 使用 sqlcmd 來執行 Transact-SQL 命令
  • 使用 RESTORE DATABASE 命令還原資料庫備份
  • 執行查詢以確認移轉

接下來,請探索 Linux 上 SQL Server 的其他移轉案例。