翻译 - 从 Windows 迁移 SQL Server 数据库到 Linux

翻译自 https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-migrate-restore-database?view=sql-server-ver15

推荐使用 SQL Server 的备份和还原功能把数据库从 Windows 迁移到 Linux 上。本教程中,你将会使用备份和还原技术通过需要的步骤移动一个数据库到 Linux 上。

  • 在 Windows 使用 SSMS 创建一个备份文件
  • 在 Windows 上安装一个 Bash shell
  • 从 Bash shell 移动备份文件到 Linux 上
  • 使用 Transact-SQL 还原备份文件
  • 运行一个查询语句验证迁移

开始之前,需要在 Windows 上安装:

Linux 需要安装:

  • 带有命令行工具的 SQL Server

在 Windows 上创建一个备份

在 Windows 上有许多方法创建一个备份文件。下面的步骤使用 SQL Server Management Studio (SSMS)创建。

  1. 在你的 Windows 机器上启动 SQL Server Management Studio
  2. 在连接对话框中,输入 localhost
  3. 在对象浏览器中,展开 数据库
  4. 右键你的目标数据库,选择 任务,然后点击 备份

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 机器上安装 Bash shell,以支持 scp (secure copy) 和 ssh (远程登录) 命令。两个示例包含:
    Windows Subsystem for Linux (Windows 10)
    - Git Bash Shell (https://git-scm.com/downloads)
  2. 在 Windows 上打开一个 Bash 会话

复制备份文件到 Linux

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

cd 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\'

2. 使用 scp 命令传输文件到目标 Linux 机器。下面的示例传输 YourDB.bak 到 IP 地址为 192.0.2.9 的 Linux 上用户 User1 的 home 目录:

scp YourDB.bak user1@192.0.2.9:./

 

 

 提示:

对于使用 scp 传输文件,也存在替代的方法。一个是使用  Samba 在 Windows 和 Linux 之间配置一个 SMB 网络共享。在 Ubuntu 上的演练,查看  How to Create a Network Share Via Samba。一旦建立共享网络,你可以从 Windows 上作为一个网络文件访问它,例如 \\machinenameorip\share。

在还原之前转移备份文件

此时,备份文件在你的 Linux 服务器的用户的 home 目录中。在还原数据库到 SQL Server 之前,你必须把备份文件放到 /var/opt/mssql 的子目录中,由于它是用户 mssql 和 组 mssql 拥有的。如果你想改变默认的备份位置,查看文章 Configure with 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 的 home 目录中。修改命令匹配你的备份文件的位置和文件名:
    mv /home/user1/YourDB.bak /var/opt/mssql/backup/
  5. 退出超级用户模式
    exit

在 Linux 上还原你的数据库

为了还原数据库备份,你可以使用 RESTORE DATABASE Transact-SQL(TQL)命令:

注意:

下面的步骤使用了 sqlcmd 工具。如果你没有安装 SQL Server Tools,查看 Install SQL Server command-line tools on Linux

  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 DATABASE 语句中使用 MOVE 指定,还原处理过程将会尝试作为源服务器在同一个路径中创建它们。

    你可以列出备份中包含的所有文件:
    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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章