使用备份和还原将 SQL Server 数据库从 Windows 迁移到 Linux

适用于:SQL Server - Linux

建议使用 SQL Server 的备份和还原功能将数据库从 Windows 上的 SQL Server 迁移到 Linux 上的 SQL Server。 在本教程中,逐步完成使用备份和还原方法将数据库迁移到 Linux 的必需步骤。

  • 使用 SSMS 在 Windows 上创建备份文件
  • 在 Windows 上安装 bash shell
  • 将备份文件从 bash shell 移到 Linux
  • 在 Linux 上通过 Transact-SQL 还原备份文件
  • 运行查询以验证迁移

还可以创建一个 SQL Server Always On 可用性组,将 SQL Server 的数据库从 Windows 迁移到 Linux。 请参阅在 Windows 和 Linux 上配置 SQL Server Always On 可用性组(跨平台)

必备条件

若要完成本教程,需满足以下先决条件:

在 Windows 上创建备份

有多种方法可在 Windows 上创建数据库的备份文件。 以下步骤使用 SQL Server Management Studio (SSMS)。

  1. 在 Windows 计算机中启动 SQL Server Management Studio

  2. 在连接“对话框”中,输入“localhost”

  3. 在“对象资源管理器”中,展开“数据库”。

  4. 右键单击目标数据库,选择“任务”,然后选择“备份...”。

    使用 SSMS 创建备份文件的屏幕截图。

  5. 在“ 备份数据库 ”对话框中,验证 “备份类型 ”选项是否为 “已满”, “备份到 ”选项为 “磁盘”。 注意文件的名称和位置。 例如,SQL Server 2019 (15.x) 上名为 YourDB 的数据库的默认备份路径为 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\YourDB.bak

  6. 选择“确定”以备份数据库。

创建备份文件的另一种方法是运行 Transact-SQL 查询。 以下 Transact-SQL 命令对名为 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

在 Windows 上安装 bash shell

若要还原数据库,首先必须将备份文件从 Windows 计算机传输到目标 Linux 计算机。 在本教程中,我们将该文件从在 Windows 上运行的 bash shell(终端窗口)移动到 Linux。

  1. 在支持 scp(安全复制)和 ssh(远程登录)命令的 Windows 计算机上安装 bash shell。 以下介绍两个示例:

  2. 在 Windows 上打开 bash 会话。

将备份文件复制到 Linux

  1. 在 bash 会话中,导航到包含备份文件的目录。 例如:

    cd 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\'
    
  2. 使用 scp 命令将文件传输到目标 Linux 计算机。 下面的示例将 YourDB.bak 传输到 Linux 服务器上的 user1 的主目录,IP 地址为 192.168.2.9:

    scp YourDB.bak user1@192.168.2.9:./
    

    下面是预期的输出:

    The authenticity of host 192.168.2.9(192.168.2.9)' can't be established.
    ECDSA key fingerprint is SHA256: aB1cD2eF-3gH4iJ5kL6-mN7oP8qR=
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.2.9' (ECDSA) to the list of known hosts.
    Password:
    YourDB.bak                                      100% 8960KB 7.4MB/s 00:01
    

提示

对于文件传输,可以使用 scp 替代方法。 一种方法是使用 Samba 在 Windows 和 Linux 之间配置 SMB 网络共享。 有关 Ubuntu 的演练,请参阅 Samba 作为文件服务器。 建立后,可以通过 Windows 将它作为网络共享文件进行访问,如 \\machinenameorip\share

在还原前移动备份文件

此时,备份文件位于你的用户的主目录中的 Linux 服务器上。 将数据库还原到 SQL Server 之前,必须将备份放置在其子目录中 /var/opt/mssql,因为此目录由用户 mssql 和组 mssql拥有。 如果想要更改默认备份位置,请参阅使用 mssql-conf 进行配置一文。

  1. 在同一 Windows bash 会话中,通过 ssh 远程连接到目标 Linux 计算机。 以下示例以用户 192.168.2.9 的身份连接到 Linux 计算机 user1

    ssh user1@192.168.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 上安装 sqlcmd 和 bcp 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\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.).
    

    在这种情况下,数据库包含辅助文件。 如果未在 MOVERESTORE DATABASE 子句中指定这些文件,则还原过程尝试在与原始服务器相同的路径中创建这些文件。

    可以列出备份中包含的所有文件:

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

    应该得到一个类似于以下示例的列表(仅列出前两列):

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

    可使用此列表为额外文件创建 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 的其他迁移方案。