将 SQL Server 数据库迁移至云端

将 SQL Server 数据库迁移至云端与迁移至新服务器是类似的。在云端,您可以利用 Amazon Lightsail 等托管服务来简化此流程。
发布时间:2023 年 8 月 9 日
ms-sql-server
迁移
Amazon-Lightsail
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
200 - 中级
完成所需时间
45 分钟
所需费用

可通过亚马逊云科技免费套餐免费试用,或 1.01 美元

前提条件

注册 / 登录 亚马逊云科技账户

示例代码
本教程中使用的示例代码来自  GitHub
上次更新时间
2023 年 8 月 9 日
相关产品

从备份还原数据库对 IT 管理员而言是寻常的操作。将本地数据库迁移至云端的过程与此类似。但是,我们这次将不使用亚马逊云科技管理控制台,而用脚本自动执行该过程。在本教程中,我们将分步讲解如何将 SQL Server 数据库迁移至云,使用命令行(而不是 Console 应用程序)实例化和配置数据库服务器。

学习内容

  • 如何创建基于浏览器的环境来使用云资源
  • 如何创建存储并将其附加到数据库服务器
  • 如何使用 Lightsail 蓝图部署和配置 SQL Server
  • 如何在 Windows Server VPS 上恢复 MS SQL 数据库

模块 1:搭建工作环境

在本教程中,您将使用命令行 (CLI)。使用命令行有很多优点。第一,命令行创建服务的选项更加丰富。第二,您可以将命令链接在一起,一个命令返回的输出值可供另一个命令使用。第三,命令可以组合成一个可以重用的脚本。

无论是在本地服务器还是在云端,部署和配置通常都在本地计算机上完成。但是,使用在线环境也是有其优势的。基于浏览器的终端或集成开发环境 (IDE) 能够提供针对特定任务自定义的一致环境。它们可以用自定义工具链配置,从而减少依赖关系冲突。此外,它们可以从任何浏览器访问,并保留上次使用时的状态和历史记录。亚马逊云科技提供基于浏览器的终端 Cloudshell 和浏览器内 IDE Cloud9

您将使用 Amazon CLI 并编写脚本。Cloud9 非常方便实用:您可以在 IDE 中编写和存储命令和脚本,并在附带的终端中执行它们。要开始使用 Cloud9,请使用亚马逊云科技管理控制台的搜索栏查找 Cloud9 服务。

步骤 1:创建 Cloud9 环境

点击 Create Environment(创建环境)。

在 Create Environment(创建环境)页面的 Details(详细信息)面板中,为环境命名。您还可以添加 Description(说明),以指定其使用方式并将其与其他环境区分开来。

接受 New EC2 Instance(新建 EC2 实例)和 Networking(联网)面板的默认值。点击 Create(创建)。创建环境后,点击 Open(启动)以启动环境。

Cloud9 环境已准备就绪。

步骤 2:使用工具配置环境

本教程使用 Amazon CLI 和 Lightsail 插件。Cloud9 的当前版本内置 CLI 的 1.x 版本,但 Lightsail 插件需要 Amazon CLI 的 2.x 版本。您必须升级到 CLI 2.x 版本并安装 Lightsail 插件。

在 Cloud9 终端中,下载并安装 CLI 版本 2.x

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
sudo curl "https://s3.us-west-2.amazonaws.com/lightsailctl/latest/linux-amd64/lightsailctl" -o "/usr/local/bin/lightsailctl"
sudo chmod +x /usr/local/bin/lightsailctl

检查安装。

aws lightsail —version
aws-cli/2.11.20 Python/3.11.3 Linux/4.14.314-237.533.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

Cloud9 环境已准备就绪。

提示:Cloud9 是一个功能齐全的 IDE,您可以将命令片段和脚本保存在 Github 或 Gitlab 等代码存储库中。Cloud9 拥有用于管理存储库的 Git 面板。使用代码存储库的一个优点在于它可以在任何地方使用,您可以使用它来管理代码片段和脚本,以便重用。

模块 2:从 Lightsail 蓝图创建 SQL Server 实例

Amazon Lightsail 包含用常用软件包实例化 VPS 的模板。您将实例化装有 Lightsail 的 SQL Server 的 Windows Server。

在 Cloud9 终端中,使用 Amazon Lightsail CLI 通过蓝图创建具有 SQL Server 的 VPS。您可以使用 aws lightsail get-blueprints 命令查找蓝图。get-blueprints 命令列出所有可用的蓝图;您可以通过管道,将命令的输出传递给 UNIX grep 实用程序,查找特定蓝图。

aws lightsail get-blueprints | grep sql
"blueprintId": "windows_server_2022_sql_2022_express",
"group": "windows_2022_sql_exp_2022",
"blueprintId": "windows_server_2022_sql_2019_express",
"group": "windows_2022_sql_exp_2019",
"blueprintId": "windows_server_2016_sql_2016_express",
"group": "windows_2016_sql_exp",

有几种不同版本的 SQL Server Express 可用。我们在此使用最新的 SQL Server 版本 windows_server_2022_sql_2022_express。使用此蓝图创建 VPS。此外,--user-data 参数还会创建一个目录来存储 SQL Server 备份文件。--bundle-id 设置服务器的大小。

aws lightsail create-instances --instance-names pcgSQLServer \
--availability-zone us-west-2a \
--blueprint-id windows_server_2022_sql_2022_express \
--user-data "mkdir c:\backup" \
--bundle-id large_win_1_0

注意,此 SQL Server 实例并非托管型关系数据库服务 (RDS)。您必须自行处理系统或安全更新,并负责数据文件的备份。

模块 3:为数据和日志文件创建存储

数据库通常将数据文件和日志存储在连接到服务器的单独驱动器中。借助 Lightsail,您可以创建对象存储和数据块存储。块存储类似于物理驱动器,可以格式化为特定文件系统,也可以附加到服务器。在本节中,您将创建块存储。在下一节中,您将其附加到 VPS,并使用 NTFS 文件系统对其进行格式化。

步骤 1:创建块存储

在 Cloud9 终端中,使用 Amazon CLI 通过 aws lightsail create-disk 命令实例化存储。命名磁盘并设置可用区。

aws lightsail create-disk \
--disk-name sqlserver-data-and-logs \
--availability-zone us-west-2a \
--size-in-gb 32

如果成功,Lightsail 将返回状态消息。

{
 "operations": [
 {
 "id": "14d4be4a-955f-45d0-81f7-7a5440195c54",
 "resourceName": "sqlserver-data-and-logs",
 "resourceType": "Disk",
 "createdAt": "2023-08-02T01:52:51.867000+00:00",
 "location": {
 "availabilityZone": "us-west-2a",
 "regionName": "us-west-2"
 },
 "isTerminal": false,
 "operationType": "CreateDisk",
 "status": "Started",
 "statusChangedAt": "2023-08-02T01:52:52.128000+00:00"
 }
 ]
}

步骤 2:将块存储附加到数据库服务器

将块存储附加到数据库服务器。服务器会将其识别为驱动器。

aws lightsail attach-disk \
--disk-name sqlserver-data-and-logs \
--disk-path /dev/xvdf \
--instance-name pcgSQLServer

附加磁盘时,它会返回一条确认操作的 JSON 消息。

{
 "operations": [
 ... ,
 {
 "id": "e92ee8ac-45cf-4bae-a16b-ac55fea264c7",
 "resourceName": "pcgSQLServer",
 "resourceType": "Instance",
 "createdAt": "2023-08-02T01:54:18.196000+00:00",
 "location": {
 "availabilityZone": "us-west-2a",
 "regionName": "us-west-2"
 },
 "isTerminal": false,
 "operationDetails": "sqlserver-data-and-logs",
 "operationType": "AttachDisk",
 "status": "Started",
 "statusChangedAt": "2023-08-02T01:54:18.196000+00:00"
 }
 ]
}

块存储已连接到服务器,但它现在还是未格式化的磁盘。您将使用 Windows Server 对其进行格式化。

模块 4:配置 SQL Server VPS

我们的 VPS 是一台 Windows Server。使用 Lightsail 控制台中的 RDP 按钮。在 pcgSQLServer 面板中选择终端图标。

注意:RDP 按钮可能需要 5 到 7 分钟才能激活,激活后您才可以连接到服务器。

我们需要格式化磁盘来存储数据和日志文件。以下是使磁盘可供 Windows Server 使用的步骤。

步骤 1:查找已附加但未格式化的磁盘的编号

在 RDP 窗口中,打开 Powershell 窗口,并使用 Get-Disk commandlet 查找未格式化的磁盘,它已经附加完成,但处于脱机状态。

get-disk | Where-Object {$_.OperationalStatus -eq 'Offline' } 

Number Friendly Name Serial Number HealthStatus OperationalStatus Total Size Partition Style
------ ------------- ------------- ------------ ----------------- ---------- ----------
1 AWS PVDISK vol0318528261ed8ca45 Healthy Offline 32 GB RAW

确定磁盘编号后,使用 New-Partition commandlet 初始化磁盘并对其进行分区。同时,这个 commandlet 还会分配一个驱动器号并使用整个磁盘。

Initialize-Disk -Number 1
New-Partition –DiskNumber 1 -AssignDriveLetter –UseMaximumSize
Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel Data

步骤 2:下载 Wide World Importers 示例数据库

Microsoft 分发一个示例 SQL Server 备份文件。我们使用这个文件来还原备份。实例化 SQL Server VPS 的过程自动创建了一个备份目录。我们将 Wide World Importers 备份文件下载到该目录。

$source = "https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak"
$dest = "C:\backup\WideWorldImporters-Full.bak"
Invoke-WebRequest -Uri $source -OutFile $dest

步骤 3:为数据和日志文件创建目录

Wide World Importers 数据库的数据文件和日志存储在单独的驱动器中。我们在附加的驱动器中创建目录。

mkdir D:\SQL_DATA
mkdir D:\SQL_LOGS
mkdir D:\SQL_LOGS\SQL2022

模块 5:从备份文件还原数据库

为了在 Powershell 中还原数据库,我们使用 Transact-SQL (T-SQL),它是 Microsoft 的 SQL 版本。使用 sqlcmd 实用工具,您就可以对 SQL Server 使用 T-SQL 命令。使用记事本或您喜欢的其他编辑器,将以下脚本保存到 C:\backup 目录中名为 restore_database.sql 的文件中。

USE [master]
GO
RESTORE DATABASE [WideWorldImporters] FROM DISK = N'C:\backup\WideWorldImporters-Full.bak'
WITH FILE = 1,
MOVE N'WWI_Primary' TO N'D:\SQL_Data\WideWorldImporters.mdf',
MOVE N'WWI_UserData' TO N'D:\SQL_Data\WideWorldImporters_UserData.ndf',
MOVE N'WWI_Log' TO N'D:\SQL_Logs\SQL2022\WideWorldImporters.ldf',
MOVE N'WWI_InMemory_Data_1' TO N'D:\SQL_Data\WideWorldImporters_InMemory_Data_1',
NOUNLOAD,
STATS = 5
GO

使用 sqlcmd 运行脚本。

sqlcmd -i C:\backup\restore_database.sql

如果还原成功,您将看到许多状态消息,其中最后一条是:

100 percent processed.
RESTORE DATABASE successfully processed 58496 pages in 4.218 seconds (108.343 MB/sec).

您可以使用 SQL Server Management Studio 验证还原是否成功,以及运行 SQL 查询。

在 Windows 的开始菜单中,打开 SQL Server Management Studio。

启动 SQL Server Management Studio 之后,点击 File > Connect Object Explorer(文件 > 连接对象资源管理器)。

此时会打开 Connect to Server(连接至服务器)窗口。现在选择服务器名称。我们点击 Browse for more(浏览更多),然后选择 Database Engine(数据库引擎)下的服务器名称。

我们使用 Windows Authentication,因此需要点击 Options(选项)按钮,再点击 Trust Server Certificate(信任服务器证书)。然后点击 Connect(连接)。

将数据库连接到 SQL Server Management Studio 后,可以点击 New Query(新建查询)来查询 Wide World Importers 数据库。

在查询窗口中,键入 SQL 查询式。此查询会列出 Website.Customers 视图中的所有行。

SELECT * FROM Website.Customers;

点击菜单中的 Execute(执行),即可执行查询。

Results(结果)窗格显示视图中的行。

恭喜!您已成功将 SQL Server 数据库迁移至云端。

清理资源

我们将删除 VPS、附加的磁盘和 Cloud9 环境,以避免产生额外费用。

步骤 1:删除 VPS

在 Lightsail 控制台中,点击 Instances(实例),然后点击 pcgSQLServer 中的三个点。点击 Delete(删除)。

点击 Yes, delete(确认删除)。

步骤 2:删除磁盘

在 Lightsail 控制台中,点击 Storage(存储),点击 sqlserver-data-and-logs 中的三个点。点击 Delete(删除)。

点击 Yes, delete(确认删除)。

步骤 3:删除 Cloud9 环境

在 Cloud9 控制台中,点击 pcg-database,然后点击 Delete(删除)。

已完成的目标

您在云环境中部署了 SQL Server,进行了一次数据库还原。但是,本教程的重点在于,您执行这些操作时是在终端内使用 Amazon CLI 和 Lightsail 插件。您在未使用 Console(控制台)的情况下完成了任务。如果您还想挑战自我,那么您可以尝试在完成本教程的过程中,通过编写脚本来部署 SQL Server、配置存储,以及编写 Powershell 脚本来还原数据库。了解 Amazon CLI 的使用方法是构建可重现、可测试基础设施的第一步。The Practical Cloud Guide(《实用云指南》)将使用此方法来构建和维护基础设施。

如果您想深入了解云端 SQL Server,不妨查看 Amazon RDS for SQL Server 研讨会,亲身体验亚马逊云科技的 SQL Server。

后续步骤

从 Lightsail 蓝图实例化 SQL Server 并不复杂。但是,您需要自行维护该实例,其中包括执行更新和备份。云数据中心可以选择全托管的解决方案,这是它和本地数据中心的一个重要区别。在托管解决方案中,云提供商负责维护资源。在后续教程中,您将部署用于扩展 Web 应用程序的关系数据库。