翻译 - 从 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 上安装:
- SQL Server
- SQL Server Management Studio
- 要迁移的目标数据库
Linux 需要安装:
- 带有命令行工具的 SQL Server
在 Windows 上创建一个备份
在 Windows 上有许多方法创建一个备份文件。下面的步骤使用 SQL Server Management Studio (SSMS)创建。
- 在你的 Windows 机器上启动 SQL Server Management Studio
- 在连接对话框中,输入 localhost
- 在对象浏览器中,展开 数据库
- 右键你的目标数据库,选择 任务,然后点击 备份
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 上:
- 在你的 Windows 机器上安装 Bash shell,以支持 scp (secure copy) 和 ssh (远程登录) 命令。两个示例包含:
- Windows Subsystem for Linux (Windows 10)
- Git Bash Shell (https://git-scm.com/downloads) - 在 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。
- 在同一个 Windows Bash 会话中,使用 ssh 远程连接你的目标 Linux 机器。下面的示例使用用户 user1 连接到 Linux 机器 192.0.2.9:
ssh user1@192.0.2.9
你现在是在远程 Linux 服务器上运行命令 - 进入超级用户模式
sudo su
- 创建一个新的备份目录。-p 参数表示如果目录已经存在的话,不会做任何操作
mkdir -p /var/opt/mssql/backup
- 移动备份文件到这个目录中。在下面的示例中,备份文件在 user1 的 home 目录中。修改命令匹配你的备份文件的位置和文件名:
mv /home/user1/YourDB.bak /var/opt/mssql/backup/
- 退出超级用户模式
exit
在 Linux 上还原你的数据库
为了还原数据库备份,你可以使用 RESTORE DATABASE Transact-SQL(TQL)命令:
注意:
下面的步骤使用了 sqlcmd 工具。如果你没有安装 SQL Server Tools,查看 Install SQL Server command-line tools on Linux。
- 在同一个终端中,启动 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\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
- 通过列出服务器上所有的数据库来验证还原。被还原的数据库应该被列出来:
SELECT Name FROM sys.Databases GO
- 在你迁移的数据库上运行另外的查询。下面的命令切换上下文到 YourDB 数据库,选择了它的一个表的行:
USE YourDB SELECT * FROM YourTable GO
- 当你使用完 sqlcmd 后,输入 exit 退出
- 当你在远程 ssh 会话完成工作后,再次输入 exit