使用备份和还原将 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 计算机上:
- SQL Server。
- SQL Server Management Studio。
- 要迁移的目标数据库。
在 Linux 计算机上:
- SQL Server(Red Hat Enterprise Linux、SUSE Linux Enterprise Server 或 Ubuntu)与命令行工具。
在 Windows 上创建备份
有多种方法可在 Windows 上创建数据库的备份文件。 以下步骤使用 SQL Server Management Studio (SSMS)。
在 Windows 计算机中启动 SQL Server Management Studio。
在连接“对话框”中,输入“localhost”。
在“对象资源管理器”中,展开“数据库”。
右键单击目标数据库,选择“任务”,然后选择“备份...”。
在“备份数据库”对话框中,验证“备份类型”是否为“完全”,以及“备份到”是否为“磁盘”。 注意文件的名称和位置。 例如,SQL Server 2019 (15.x) 上名为
C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\YourDB.bak
的数据库的默认备份路径为YourDB
。选择“确定”以备份数据库。
创建备份文件的另一种方法是运行 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。
在支持 scp(安全复制)和 ssh(远程登录)命令的 Windows 计算机上安装 bash shell。 以下介绍两个示例:
- 适用于 Linux 的 Windows 子系统 (Windows 10)
- Git bash shell (https://git-scm.com/downloads)
在 Windows 上打开 bash 会话。
将备份文件复制到 Linux
在 bash 会话中,导航到包含备份文件的目录。 例如:
cd 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\'
使用 scp 命令将文件传输到目标 Linux 计算机。 下面的示例将
YourDB.bak
传输到 Linux 服务器上user1
的主目录,IP 地址为 192.0.2.9:scp YourDB.bak user1@192.0.2.9:./
提示
对于文件传输,可以使用 scp 替代方法。 一种方法是使用 Samba 在 Windows 和 Linux 之间配置 SMB 网络共享。 有关 Ubuntu 的演练,请参阅 Samba 作为文件服务器。 建立后,可以通过 Windows 将它作为网络共享文件进行访问,如 \\machinenameorip\share
。
在还原前移动备份文件
此时,备份文件位于你的用户的主目录中的 Linux 服务器上。 将数据库还原到 SQL Server 之前,必须将备份放入“/var/opt/mssql
”的子目录中,因为这属于用户 mssql
和组 mssql
。 如果想要更改默认备份位置,请参阅使用 mssql-conf 进行配置一文。
在同一 Windows bash 会话中,通过 ssh 远程连接到目标 Linux 计算机。 以下示例以用户
192.0.2.9
的身份连接到 Linux 计算机user1
。ssh user1@192.0.2.9
你现在正在远程 Linux 服务器上运行命令。
进入超级用户模式。
sudo su
创建新的备份目录。 如果目录已存在,
-p
参数不会执行任何操作。mkdir -p /var/opt/mssql/backup
将备份文件移动到该目录。 在下面的示例中,备份文件位于
user1
的主目录。 更改命令,使其与你的备份文件的位置和文件名相匹配。mv /home/user1/YourDB.bak /var/opt/mssql/backup/
退出超级用户模式。
exit
在 Linux 上还原数据库
若要还原数据库备份,可以使用 RESTORE DATABASE
Transact-SQL (TQL) 命令。
下列步骤使用 sqlcmd 工具。 如果尚未安装 SQL Server 工具,请参阅在 Linux 上安装 SQL Server 命令行工具 sqlcmd 和 bcp。
在同一终端中,启动 sqlcmd。 下面的示例以
SA
用户身份连接到本地 SQL Server 实例。 出现提示时输入密码,或添加-P
参数来指定密码。sqlcmd -S localhost -U SA
在
>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.).
在这种情况下,数据库包含辅助文件。 如果未在
RESTORE DATABASE
的MOVE
子句中指定这些文件,则还原过程尝试在与原始服务器相同的路径中创建这些文件。可以列出备份中包含的所有文件:
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
通过列出服务器上的所有数据库来验证还原。 应该会列出已还原的数据库。
SELECT Name FROM sys.Databases GO
在已迁移的数据库上运行其他查询。 以下命令将上下文切换到
YourDB
数据库,并从其一个表中选择行。USE YourDB SELECT * FROM YourTable GO
使用 sqlcmd 完成后,键入
exit
。在远程 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 的其他迁移方案。