本教程介绍了克隆在 Compute Engine 上运行的 Microsoft SQL Server 数据库的两种方法。一种方法是使用永久性磁盘快照。另一种方法是使用本机 SQL Server 备份和恢复功能,通过 Cloud Storage 传输备份内容。Cloud Storage 是 Google Cloud 的对象存储服务。它提供的文件存储服务直观、耐用、安全性更高且可用性高。
克隆是将在线数据库复制到其他服务器的过程。副本独立于现有数据库,并以时间点快照的形式保存。您可以将克隆的数据库用于各种用途,不会为生产服务器增加负担,也不会损害生产数据的完整性。其中一些用途包括:
- 执行分析查询
- 对应用进行负载测试或集成测试
- 提取数据以用于填充数据仓库
- 利用数据运行实验
本教程中介绍的每种克隆方法各有其优缺点,理想方法取决于您的具体情况。下表列出了一些重要问题。
问题 | 方法 1:磁盘快照 | 方法 2:使用 Cloud Storage 进行备份和恢复 |
---|---|---|
SQL Server 实例是否需要额外的磁盘空间 | 无需额外的磁盘空间 | 在进行创建和恢复操作时需要额外的空间来存储备份文件 |
克隆过程中是否给源 SQL Server 实例增加额外的负载 | 没有额外负载 | 创建和上传备份文件时会为 CPU 和 I/O 增加额外负载 |
克隆的持续时间 | 大型数据库的克隆速度相对较快 | 大型数据库的克隆速度相对较慢 |
是否可从 Google Cloud 外部的 SQL Server 实例进行克隆 | 否 | 是 |
复杂性 | 需要一系列复杂的命令来挂接克隆的磁盘 | 只需一组相对简单的命令来进行克隆 |
是否可以利用现有备份系统 | 是(如果备份系统使用 Google Cloud 磁盘快照) | 是(如果备份系统将本机 SQL Server 备份文件写入 Cloud Storage) |
克隆的粒度 | 只能克隆整个磁盘 | 只能克隆指定数据库 |
数据一致性 | 在快照点一致 | 在备份时一致 |
本教程假设您熟悉 Microsoft Windows 系统管理、PowerShell 以及使用 Microsoft SQL Server Management Studio 管理 Microsoft SQL Server。
目标
- 学习如何在 Google Cloud 上运行 SQL Server 实例。
- 学习如何在辅助磁盘上创建演示数据库。
- 学习如何使用 Compute Engine 磁盘快照克隆 SQL Server 数据库。
- 学习如何通过使用 Cloud Storage 传输备份内容来克隆 SQL Server 数据库。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Compute Engine
- Cloud Storage
- Microsoft Windows 和 SQL Server 许可
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- 启用 Compute Engine API。 启用 API
确保您满足以下额外的前提条件:
- 您使用的是 Google Chrome 浏览器。
- 安装您选择的远程桌面协议 (RDP) 客户端。如需了解详情,请参阅 Microsoft 远程桌面客户端。 如果您已安装 RDP 客户端,则可以跳过此任务。
设置环境
如需完成本教程,您需要为计算环境设置以下内容:
- Compute Engine 上一个名为
sql-server-prod
的 SQL Server 实例,用于表示生产数据库服务器。 - 挂接到生产服务器的一个额外磁盘(名为
sql-server-prod-data
),用于存储生产数据库。 - Wide World Importers SQL Server 示例数据库的一个副本,用于模拟要克隆的生产数据库。
- Compute Engine 上一个名为
sql-server-test
的 SQL Server 实例,用于表示您的测试数据库服务器。数据库就是克隆到此服务器上。
下图说明了此架构。
创建生产虚拟机实例
如需模拟生产环境,请在 Windows Server 上设置一个运行 SQL Server 的 Compute Engine 虚拟机实例。
本教程的虚拟机实例使用了两个磁盘:一个磁盘 50 GB,用于操作系统和用户账号;一个磁盘 100 GB,用于存储数据库。
在 Compute Engine 中,使用单独的磁盘不会带来任何性能优势。磁盘性能取决于挂接到实例的所有磁盘的总存储容量,以及虚拟机实例上的 vCPU 总数。因此,数据库和日志文件可以位于同一磁盘上。
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击创建。
在名称字段中,输入
sql-server-prod
。对于地区,选择 us-east1。
对于区域,选择 us-east1-b。
在机器配置下,将机器类型更改为 n1-standard-2(2 个 vCPU)。
在启动磁盘说明旁边,点击更改。
在启动磁盘面板中,点击公共映像标签页。
在操作系统下拉列表中,选择 Windows Server 上的 SQL Server (SQL Server on Windows Server)。
在版本下拉列表中,选择 Windows Server 2022 Datacenter 上的 SQL Server 2022 Standard (SQL Server 2022 Standard on Windows Server 2022 Datacenter)。
确保已设置以下值:
- 启动磁盘类型设置为标准永久性磁盘。
- 大小 (GB) 设为 50。
点击选择。
在身份和 API 访问权限下,将访问权限范围设置为允许所有 Cloud API 的全面访问权限。
展开管理、安全、磁盘、网络、单独租用。
点击磁盘标签页。
点击添加新磁盘 add。
在名称字段中,输入
sql-server-prod-data
。在大小 (GB) 字段中,输入
100
。点击完成。
点击创建。
Cloud Shell
打开 Cloud Shell。
初始化以下变量:
VPC_NAME=
VPC_NAME
SUBNET_NAME=SUBNET_NAME
其中:
VPC_NAME
:您的 VPC 的名称SUBNET_NAME
:您的子网的名称
设置默认项目 ID:
gcloud config set project
PROJECT_ID
将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。设置默认区域:
gcloud config set compute/region
REGION
将
REGION
替换为要在其中部署的区域的 ID。设置默认可用区:
gcloud config set compute/zone
ZONE
将
ZONE
替换为要在其中部署的可用区的 ID。用 Windows Server 2022 Datacenter 上的 SQL Server 2022 Standard 应用映像,创建一个 Compute Engine 实例:
REGION=$(gcloud config get-value compute/region) ZONE=$(gcloud config get-value compute/zone) gcloud compute instances create sql-server-prod \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --image-family=sql-std-2022-win-2022 \ --image-project=windows-sql-cloud \ --boot-disk-size=50GB \ --boot-disk-device-name=sql-server-prod \ --create-disk="mode=rw,size=100,type=pd-standard,name=sql-server-prod-data,device-name=sql-server-prod-data" \ --subnet=$SUBNET_NAME
此命令授予此实例对 Google Cloud API 的完整访问权限,创建一个 100 GB 的辅助磁盘,并将该磁盘挂接到此实例。忽略磁盘性能警告,因为本教程不需要高性能。
连接到虚拟机实例
在 Google Cloud 控制台中,转到虚拟机实例页面。
等待虚拟机实例准备就绪,大约需要 5 分钟。
如需监控虚拟机的初始化过程,请在 Cloud Shell 中查看其串行端口输出:
gcloud compute instances tail-serial-port-output sql-server-prod
出现以下消息后,即表示初始化操作已完成。
Instance setup finished. sql-server-prod is ready to use.
按 Control+C 即可停止监控串行端口。
点击实例名称
sql-server-prod
,打开虚拟机实例详情页面。在远程访问下,点击设置 Windows 密码,然后点击设置,在远程机器上创建您的账号。
此步骤会为您生成密码。记下此密码或将其复制到安全的临时文件中。
在 Google Cloud 控制台的 Compute Engine 部分,点击 RDP 下拉列表,然后选择 下载 RDP 文件选项以下载实例的 RDP 文件。
使用此文件通过 RDP 客户端连接到实例。如需了解详情,请参阅 Microsoft 远程桌面客户端。
收到提示时,输入您刚刚生成的密码,然后点击确定。
如需接受服务器证书并登录到远程 Windows 实例,请点击继续。
当系统提示您是否希望网络上的其他 PC 和设备可以发现您的计算机时,点击否。
设置额外的磁盘
挂接到生产实例的第二个磁盘用于存储生产数据库。此磁盘为空白状态,因此您需要对其进行分区、格式化和装载。
- 在连接到
sql-server-prod
实例的 RDP 会话中,点击 Windows 任务栏上的开始按钮,输入diskpart
,然后点击 diskpart 来打开 DiskPart。 - 当系统提示是否允许应用进行更改时,点击是。
显示挂接到实例的磁盘列表:
list disk
输出如下所示:
Disk ### Status Size Free Dyn Gpt -------- ------------- ------- ------- --- --- Disk 0 Online 50 GB 0 B Disk 1 Online 100 GB 100 GB
磁盘 1 (100 GB) 是数据磁盘。
选择数据磁盘:
select disk 1
初始化此磁盘:
clean
创建一个 GUID 分区表:
convert gpt
创建数据分区,令其使用整个磁盘:
create partition primary
列出可用的卷:
list volume
输出如下所示:
Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ----- ---------- ------- --------- -------- Volume 0 C NTFS Partition 49 GB Healthy Boot Volume 1 FAT32 Partition 100 MB Healthy System Volume 2 RAW Partition 99 GB Healthy
卷 2 (99 GB) 是数据磁盘。
选择该卷:
select volume 2
使用 NTFS 文件系统格式化该分区并为其设置
data
标签:format quick fs=ntfs label=data
将该磁盘装载为 D 盘:
assign letter=d
退出 DiskPart:
exit
下载示例数据库
如需为此克隆练习设置环境,您需要执行以下操作:
- 在 D 盘 (
data
) 上创建一个目录结构来存储您的数据库。 - 下载 Wide World Importers SQL Server 示例数据库的完整备份文件。该数据库模拟您要克隆的生产数据库。
若要创建目录并下载备份文件,请按照以下步骤操作:
在 RDP 会话中,点击 Windows 任务栏上的开始按钮,输入
PowerShell
,然后选择 Windows PowerShell 应用。在 PowerShell 提示符下,创建一个目录结构来存储此数据库:
mkdir D:\sql-server-data\wideworldimporters
将备份文件下载到 D 盘:
bitsadmin /transfer sampledb /dynamic /download /priority FOREGROUND ` https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak ` D:\sql-server-data\WideWorldImporters-Full.bak
恢复示例数据库
您需要将示例数据库恢复到 D 盘 (data
),可以通过使用 Microsoft SQL Server Management Studio (SSMS) 向导以交互式方式完成,或者运行 Transact-SQL 命令直接恢复。
SSMS 向导
- 在 RDP 会话中,点击 Windows 任务栏上的开始按钮,输入
ssms
,然后选择 Microsoft SQL Server Management Studio(以管理员身份运行)。 - 应用启动后,点击 Connect 以使用 Windows 身份验证连接到
sql-server-prod
数据库引擎。 - 在 Object Explorer 中,右键点击 Databases,然后选择 Restore Database。
- 在 Source 下,选择 Device,然后点击设备名称旁边的 [...] 按钮。
- 在 Select backup devices 对话框中,确保为 Backup media type 选择了 File,然后点击 Add。
- 在文件选择器中,浏览至
D:\sql-server-data
,点击WideWorldImporters-Full.bak
文件,然后点击 OK。 点击 OK 关闭 Select backup devices 对话框。
Restore Database 对话框现在填充了关于 Wide World Importers 数据库备份的数据。
在 Select a page 下,点击 Files。
选中 Relocate all files to folder 复选框。
在 Data file folder 和 Log file folder 字段中,输入
D:\sql-server-data\wideworldimporters
。点击 OK 开始执行恢复操作。
几分钟后,您会注意到数据库已恢复。
Transact-SQL
- 在 RDP 会话中,点击 Windows 任务栏上的开始按钮,输入
ssms
,然后选择 Microsoft SQL Server Management Studio(以管理员身份运行)。 - 应用启动后,点击 Connect 以使用 Windows 身份验证连接到
sql-server-prod
数据库引擎。 - 选择 File > New > Query with Current Connection 以打开新的查询窗口。
利用您下载的备份文件发起恢复:
USE [master] GO RESTORE DATABASE [WideWorldImporters] FROM DISK = N'D:\SQL-SERVER-DATA\WideWorldImporters-Full.bak' WITH FILE = 1, MOVE N'WWI_Primary' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.mdf', MOVE N'WWI_UserData' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_UserData.ndf', MOVE N'WWI_Log' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.ldf', MOVE N'WWI_InMemory_Data_1' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_InMemory_Data_1', NOUNLOAD, STATS = 5 GO
此命令会将数据库和日志文件恢复到
D:\sql-server-data\wideworldimporters
目录中。右键点击查询代码并点击 Execute。
等待数据库完成恢复,这可能需要几分钟。您可以在 Object Explorer 中点击 Refresh refresh,查看该数据库是否在数据库树中列出。数据库恢复完成后,您可以关闭查询窗口而不保存。
如需验证示例数据库是否能正常运行,您可以运行一个查询。
在 Microsoft SQL Server Management Studio 中,选择 File > New > Query with Current Connection 以打开新的查询窗口,然后复制以下代码:
SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, c.CustomerName, i.ConfirmedDeliveryTime, i.ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;
此查询从最近交付的 100 个账单中检索汇总信息。
右键点击查询窗口,然后点击 Execute。
Results 窗格显示摘要信息。
创建测试虚拟机实例
在本部分中,您将创建一个名为 sql-server-test
的 SQL Server 实例,作为克隆数据库的目的地。此实例的配置与生产实例相同。但是,您不必创建第二个数据磁盘,而是稍后在本教程中挂接数据磁盘。
控制台
转到虚拟机实例页面。
点击创建。
在名称字段中,输入
sql-server-test
。对于地区,选择 us-east1。
对于区域,选择 us-east1-b。
在机器配置下,将机器类型更改为 n1-standard-2(2 个 vCPU)。
在启动磁盘映像旁边,点击更改。
在启动磁盘面板中,点击公共映像标签页。
在操作系统下拉列表中,选择 Windows Server 上的 SQL Server (SQL Server on Windows Server)。
在版本下拉列表中,选择 Windows Server 2022 Datacenter 上的 SQL Server 2022 Standard (SQL Server 2022 Standard on Windows Server 2022 Datacenter)。
确保已设置以下值:
- 启动磁盘类型设置为标准永久性磁盘。
- 大小 (GB) 设为 50。
点击选择。
在身份和 API 访问权限下,将访问权限范围设置为允许所有 Cloud API 的全面访问权限。
点击创建。
Cloud Shell
打开 Cloud Shell。
创建测试 SQL Server 实例:
gcloud compute instances create sql-server-test \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --image-family=sql-std-2022-win-2022 \ --image-project=windows-sql-cloud \ --boot-disk-size=50GB \ --boot-disk-device-name=sql-server-test \ --subnet=$SUBNET_NAME
您可以忽略磁盘性能警告,因为本教程不需要高性能。
连接到虚拟机实例
在 Google Cloud 控制台中,转到虚拟机实例页面。
等待虚拟机实例准备就绪,大约需要 5 分钟。
如需监控虚拟机的初始化过程,请在 Cloud Shell 中查看其串行端口输出:
gcloud compute instances tail-serial-port-output sql-server-prod
出现以下消息后,即表示初始化操作已完成。
Instance setup finished. sql-server-test is ready to use.
按 Control+C 即可停止监控串行端口。
点击实例名称
sql-server-test
以打开虚拟机实例详情页面。在远程访问下,点击设置 Windows 密码,然后点击设置,在远程机器上创建您的账号。
此步骤会为您生成密码。记下此密码或将其复制到安全的临时文件中。
在 Google Cloud 控制台的 Compute Engine 部分,点击 RDP 下拉列表,然后选择 下载 RDP 文件选项以下载实例的 RDP 文件。
使用此文件通过 RDP 客户端连接到实例。如需了解详情,请参阅 Microsoft 远程桌面客户端。
收到提示时,输入您刚刚生成的密码,然后点击确定。
如需接受服务器证书并登录到远程 Windows 实例,请点击继续。
当系统提示您是否允许其他 PC 或设备发现您的 PC 时,点击否。
使用 Compute Engine 磁盘快照克隆数据库
如需克隆在 Compute Engine 上运行的 SQL Server 数据库,一种方法是将数据库存储在单独的数据磁盘中,并使用永久性磁盘快照来创建该磁盘的克隆。
利用永久性磁盘快照,您可以获得磁盘上的数据在某个时间点的副本。安排磁盘快照是自动备份数据的一种方法。
在本教程的这一部分,您将执行以下操作:
- 截取生产服务器的数据磁盘的快照。
- 根据该快照创建一个新的磁盘。
- 将新磁盘装载到测试服务器上。
- 将此磁盘上的数据库挂接到测试实例上的 SQL Server。
以下图表展示如何使用磁盘快照克隆数据库。
创建磁盘快照
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击
sql-server-prod
实例的名称。在虚拟机实例详情页面中,点击磁盘
sql-server-prod-data
。点击创建快照。
将该快照命名为
sql-server-prod-data-snapshot
。对于位置,选择地区级。
验证该地区是否设置为
us-east1
(与虚拟机实例的设置相同)。选中启用 VSS 选项。
此选项使用 Microsoft Windows 中的卷影复制服务来截取一致的快照。
点击创建。
几分钟后,快照即创建完成。
Cloud Shell
打开 Cloud Shell。
在虚拟机实例所在的区域中创建数据磁盘的快照:
gcloud compute disks snapshot sql-server-prod-data \ --snapshot-names=sql-server-prod-data-snapshot \ --guest-flush \ --zone="${ZONE}"
--guest-flush
选项使用 Microsoft Windows 中的卷影复制服务来创建一致的快照。几分钟后,快照即创建完成。
将磁盘快照挂接到测试实例
您需要利用创建的快照来创建新的数据磁盘,然后将其挂接到 sql-server-test
实例。
控制台
在以下步骤中,您会创建一个新的永久性磁盘,将生产磁盘的快照用作其内容,然后将其挂接到到测试实例。
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击实例名称
sql-server-test
。在虚拟机实例详情页面上,点击修改。
点击添加新磁盘 add。
将新磁盘命名为
sql-server-test-data
。对于来源类型,选择快照。
对于您创建的
sql-server-prod-data-snapshot
实例,选择来源快照。确保模式设置为读写。
点击完成。
Cloud Shell
打开 Cloud Shell。
创建新的永久性磁盘,使用生产磁盘的快照作为其内容:
gcloud beta compute disks create sql-server-test-data \ --size=100GB \ --source-snapshot=sql-server-prod-data-snapshot \ --zone="${ZONE}"
利用读写权限将新磁盘挂接到
sql-server-test
实例:gcloud compute instances attach-disk sql-server-test \ --disk=sql-server-test-data --mode=rw
在 Windows 中装载新的数据磁盘
您创建的磁盘已挂接到虚拟机实例,但仍是脱机状态,并且该卷被设置为只读。如需将该卷设置为读写且可装载,请执行以下步骤:
- 在连接到
sql-server-test
实例的 RDP 客户端窗口中,点击 Windows 任务栏上的开始按钮,输入diskpart
,然后点击 diskpart 来打开 DiskPart。 - 当系统提示是否允许应用进行更改时,点击是。
显示挂接到实例的磁盘的清单:
list disk
输出如下所示:
Disk ### Status Size Free Dyn Gpt -------- ------------- ------- ------- --- --- Disk 0 Online 50 GB 0 B Disk 1 Offline 100 GB 0 B *
数据磁盘(磁盘 1,100 GB)为脱机状态。
选择数据磁盘:
select disk 1
将磁盘联机,具体命令如下:
online disk
列出可用的卷:
list volume
输出如下所示:
Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ----- ---------- ------- --------- -------- Volume 0 C NTFS Partition 49 GB Healthy Boot Volume 1 FAT32 Partition 100 MB Healthy System Volume 2 RAW Partition 99 GB Healthy
卷 2 (99 GB) 是数据卷。它被列为 Hidden 状态,并且未分配盘符。
选择该卷:
select volume 2
清除您利用快照创建该卷时设置的特性:
attr volume clear readonly hidden nodefaultdriveletter shadowcopy
此命令使卷可装载。
将该卷作为 D 盘装载:
assign letter=d
退出 DiskPart:
exit
重置文件所有权和权限
由于您是利用 sql-server-prod
实例上的快照创建的数据磁盘,因此文件所有权和权限的用户 ID 与 sql-server-test
实例的设置不同。您需要将文件的所有权更改为 sql-server-test
实例上的用户,并更新权限以便您的本地用户和 MSSQLSERVER
用户可以读取这些文件。
- 在连接到
sql-server-test
实例的 RDP 客户端窗口中,点击 Windows 任务栏上的开始按钮,然后输入cmd
。 - 以管理员身份打开命令提示符应用。
将
sql-server-data
文件夹下的文件的所有者设置为MSSQLSERVER
服务用户:icacls d:\sql-server-data /setowner "nt service\mssqlserver" /t
在顶级
sql-server-data
文件夹中重置所有文件的所有权限:icacls d:\sql-server-data /reset /t
更新
sql-server-data
文件夹的访问控制列表 (ACL):icacls d:\sql-server-data /grant Administrators:(oi)(ci)f "nt service\mssqlserver":(oi)(ci)f "owner rights":(oi)(ci)f %USERNAME%:(oi)(ci)f
从驱动器的根文件夹中停用继承,以便仅应用前述权限:
icacls d:\sql-server-data /inheritancelevel:r
退出命令提示符应用:
exit
现在,sql-server-test
实例上的本地用户和 SQL Server 实例便可以访问此数据库文件了。
挂接克隆的数据库
现在,将 D 盘 (data
) 上克隆的数据库挂接到测试 SQL Server 实例。可以使用 Microsoft SQL Server Management Studio 向导以交互式方式挂接此数据库,或者运行 Transact-SQL 命令直接挂接。
SSMS 向导
- 在连接到
sql-server-test
实例的 RDP 会话中,点击 Windows 任务栏上的开始按钮,输入ssms
,然后选择 Microsoft SQL Server Management Studio(以管理员身份运行)。 - 点击 Connect 以使用 Windows 身份验证连接到
sql-server-test
数据库引擎。 - 在 Object Explorer 中,右键点击 Databases,然后选择 Attach。
- 在 Attach Databases 向导中,点击 Add。
- 浏览至
D:\sql-server-data\wideworldimporters
目录,点击WideWorldImporters.mdf
文件,然后点击 OK。 点击 OK 即可挂接此数据库。
片刻之后,克隆数据库即会挂接。您可以在 Object Explorer 中点击 Refresh refresh,查看该数据库是否在数据库树中列出。
Transact-SQL
- 在连接到
sql-server-test
实例的 RDP 会话中,点击 Windows 任务栏上的开始按钮,输入ssms
,然后选择 Microsoft SQL Server Management Studio(以管理员身份运行)。 - 点击 Connect 以使用 Windows 身份验证连接到
sql-server-prod
数据库引擎。 - 选择 File > New > Query with Current Connection 以打开新的查询窗口。
挂接
D:\sql-server-data\wideworldimporters
目录中的数据和日志文件:USE [master] GO CREATE DATABASE [WideWorldImporters] ON ( FILENAME = N'D:\sql-server-data\wideworldimporters\WideWorldImporters.mdf' ), ( FILENAME = N'D:\sql-server-data\wideworldimporters\WideWorldImporters.ldf' ), ( FILENAME = N'D:\sql-server-data\wideworldimporters\WideWorldImporters_UserData.ndf' ) FOR ATTACH GO
右键点击查询代码并点击 Execute。
片刻之后,克隆数据库即会挂接。您可以在 Object Explorer 中点击 Refresh refresh,查看该数据库是否在数据库树中列出。挂接数据库后,您可以关闭查询窗口而不保存。
如需验证示例数据库是否能正常运行,您可以运行一个查询。
在 SQL Server Management Studio 中,选择 File > New > Query with Current Connection 以打开新的查询窗口,然后复制以下代码:
SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, c.CustomerName, i.ConfirmedDeliveryTime, i.ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;
此查询从最近交付的 100 个账单中检索汇总信息。
如需运行查询,右键点击查询窗口,然后选择 Execute。
Results 窗格显示摘要信息。
现在,您已了解了如何使用永久性磁盘快照克隆数据库,可以试试使用备份和还原来克隆数据库。如需完成本教程中的第二种方法,您必须删除从 sql-server-test
实例克隆的数据库。
删除克隆的数据库
如需删除使用磁盘快照创建的克隆数据库,请执行以下步骤。
SSMS 向导
- 在连接到
sql-server-test
实例的 RDP 会话中,打开 Microsoft SQL Server Management Studio,然后连接到sql-server-test
数据库引擎。 - 在 Object Explorer 中,展开 Databases,右键点击
WorldWideImporters
数据库,然后选择 Delete。 - 在 Delete Object 向导中,确保选中 Close existing connections 复选框。
- 点击 OK。
Transact-SQL
- 在连接到
sql-server-test
实例的 RDP 会话中,打开 Microsoft SQL Server Management Studio,然后连接到sql-server-test
数据库引擎。 若要关闭与
WideWorldImporters
数据库的所有连接并将其删除,请将以下脚本复制到新的查询窗口中,右键点击代码,然后点击 Execute:USE [master] GO ALTER DATABASE [WideWorldImporters] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO DROP DATABASE [WideWorldImporters] GO
删除数据库后,您可以关闭查询窗口而不保存。您可以在 Object Explorer 中点击 Refresh refresh 来确认数据库已经删除。
使用备份和还原进行克隆
克隆在 Compute Engine 上运行的 SQL Server 数据库的第二种方法是使用本机 SQL Server 进行备份和还原。这种方法使用 Cloud Storage 传输备份内容。
教程的这一部分使用您在使用 Compute Engine 磁盘快照克隆数据库部分创建的资源。如果您未完成此部分,则必须先完成,才能继续操作。
在本教程的这一部分,您将执行以下操作:
- 创建 Cloud Storage 存储分区。
- 备份生产服务器上的数据库。
- 将备份文件从生产服务器复制到 Cloud Storage。
- 将备份文件从 Cloud Storage 复制到测试服务器。
- 在测试实例上恢复此备份。
以下图表展示如何通过使用 Cloud Storage 传输备份来克隆数据库。
由于 Google Cloud 外部的系统可以获得对 Cloud Storage 的访问权限,您可以使用此方法从外部 SQL Server 实例克隆数据库。
创建 Cloud Storage 存储桶
在将备份文件从 sql-server-prod
实例传输到 sql-server-test
实例时,您需要创建一个 Cloud Storage 存储桶来存储它们。
控制台
在 Google Cloud 控制台中,转到 Cloud Storage 的浏览器页面。
点击创建存储分区。
将此存储分区命名为
project-name
-bucket。替换以下内容:
project-name
:您的 Google Cloud 项目的 ID。
展开选择一个默认存储类别,然后选择地区级。
对于位置,选择 us-east1。
点击创建。
Cloud Shell
打开 Cloud Shell。
在虚拟机实例所在的地区中创建一个 Cloud Storage 存储分区:
gsutil mb -l "${REGION}" "gs://$(gcloud config get-value project)-bucket"
对数据库进行完整的时间点备份
在生产环境中,您可能已经进行了备份。您可以使用这些备份作为克隆数据库的基础。在本教程中,您制作一个仅复制备份,以免它影响任何现有或增量备份安排。
SSMS 向导
- 在连接到
sql-server-prod
实例的 RDP 会话中,打开 Microsoft SQL Server Management Studio,然后连接到sql-server-prod
数据库引擎。 - 在 Object Explorer 中,展开 Databases,右键点击
WorldWideImporters
数据库,然后选择 Tasks > Back Up。 - 在 Back Up Database 向导中,确保设置了以下值:
- Backup type 设置为 Full。
- 选中了 Copy-only backup。
- Back up to 设置为 Disk。
- 如需添加备份文件,请点击 Add。
在 Destination 字段中,输入
D:\sql-server-data\WideWorldImporters-copy.bak
。选择 Media Options 页面,然后选择 Overwrite all existing backup sets。
选择 Backup Options 页面,然后将 Set backup compression 更改为 Compress backup。
如需创建备份,请点击 OK。
创建备份需要几分钟。
Transact-SQL
- 在连接到
sql-server-prod
实例的 RDP 会话中,打开 Microsoft SQL Server Management Studio,然后连接到sql-server-prod
数据库引擎。 如需执行
WideWorldImporters
数据库的仅复制压缩备份并存入d:\sql-server-data\WideWorldImporters-copy.bak
文件,请将以下脚本复制到新的查询窗口中,右键点击代码,然后点击 Execute。
BACKUP DATABASE [WideWorldImporters] TO DISK = N'd:\sql-server-data\WideWorldImporters-copy.bak' WITH COPY_ONLY, NOFORMAT, INIT, NAME = N'WideWorldImporters-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10 GO
等待服务器创建备份,这可能需要几分钟。数据库备份完成后,您可以关闭查询窗口而不保存。
将备份文件复制到 Cloud Storage
- 在连接到
sql-server-prod
实例的 RDP 会话中,打开一个 Windows PowerShell 窗口。 将备份文件复制到您之前创建的 Cloud Storage 存储桶中:
gsutil cp -n d:\sql-server-data\WideWorldImporters-copy.bak "gs://$(gcloud config get-value project)-bucket/"
退出 PowerShell。
exit
将备份文件从 Cloud Storage 复制到 sql-server-test
- 在连接到
sql-server-test
实例的 RDP 会话中,打开一个 Windows PowerShell 窗口。 将备份文件复制到您之前创建的 Cloud Storage 存储桶中:
gsutil cp "gs://$(gcloud config get-value project)-bucket/WideWorldImporters-copy.bak" d:\sql-server-data\
退出 PowerShell。
exit
测试实例现在在其本地磁盘上已有数据库的完整副本备份。
恢复备份
现在,您可以将完整副本备份内容还原到 sql-server-test
实例的 D 盘 (data
)。
SSMS 向导
- 在连接到
sql-server-test
实例的 RDP 会话中,打开 Microsoft SQL Server Management Studio,然后连接到sql-server-test
数据库引擎。 - 在 Object Explorer 中,右键点击 Databases,然后选择 Restore Database。
- 对于 Source,请选择 Device,然后点击设备名称旁边的 [...] 按钮。
- 在 Select backup devices 对话框中,选择 Backup media type 列表中的 File,然后点击 Add。
- 在文件选择器中,浏览至
D:\sql-server-data
,点击WideWorldImporters-copy.bak
文件,然后点击 OK。 点击 OK 关闭 Select backup devices 对话框。
Restore Database 对话框现在填充了有关
WideWorldImporters
数据库备份的数据。在 Select a page 下,点击 Files。
选择 Relocate all files to folder。
在 Data file folder 和 Log file folder 字段中,输入
D:\sql-server-data\wideworldimporters
。如需开始恢复操作,请点击 OK。
处理完成后,您会看到以下消息:
Database 'WideWorldImporters' restored successfully
。
Transact-SQL
- 在连接到
sql-server-test
实例的 RDP 会话中,打开 Microsoft SQL Server Management Studio,然后连接到sql-server-test
数据库引擎。 - 选择 File > New > Query with Current Connection 以打开新的查询窗口。
复制以下 T-SQL 命令,利用您从 Cloud Storage 复制的备份文件启动恢复操作,以将数据库和日志文件恢复到
D:\sql-server-data\wideworldimporters
目录:USE [master] GO RESTORE DATABASE [WideWorldImporters] FROM DISK = N'D:\SQL-SERVER-DATA\WideWorldImporters-copy.bak' WITH FILE = 1, MOVE N'WWI_Primary' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.mdf', MOVE N'WWI_UserData' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_UserData.ndf', MOVE N'WWI_Log' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.ldf', MOVE N'WWI_InMemory_Data_1' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_InMemory_Data_1', NOUNLOAD, STATS = 5 GO
右键点击代码,然后点击 Execute。
几分钟后,数据库恢复即可完成。您可以在 Object Explorer 中点击 Refresh refresh,查看该数据库是否在数据库树中列出。数据库恢复完成后,您可以关闭查询窗口而不保存。
为表明数据库能正常运行,您可以运行一个查询。
在 Microsoft SQL Management Studio 中,选择 File > New > Query with Current Connection 以打开新的查询窗口,然后复制以下代码:
SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, c.CustomerName, i.ConfirmedDeliveryTime, i.ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;
此查询从最近交付的 100 个账单中检索汇总信息。
右键点击查询窗口,然后点击 Execute。
Results 窗格显示摘要信息。
使用 Cloud SQL 作为克隆目标
如果您的目标数据库托管在 Cloud SQL 上,并且源数据库位于 Compute Engine 上,则唯一支持的克隆机制是将数据库备份到 Cloud Storage,然后将数据库恢复到 Cloud SQL。
在本教程中,您将重复使用在上一部分中创建的备份。
创建 Cloud SQL for SQL Server 实例
打开 Cloud Shell。
创建 Cloud SQL for SQL Server 实例,该实例运行的数据库版本与您的
sql-server-prod
实例相同:gcloud sql instances create sqlserver-cloudsql \ --database-version=SQLSERVER_2022_STANDARD \ --cpu=2 \ --memory=5GB \ --root-password=sqlserver12@ \ --region=${REGION}
这将创建一个根用户为
sqlserver
且密码为sqlserver12@
的实例。
更新对象权限
您需要在 Cloud Storage 存储桶和备份对象上设置正确的权限,使 Cloud SQL 服务账号能够读取它们。这些权限是在您使用 Google Cloud 控制台导入对象时自动设置的,也可以使用 gcloud
命令设置它们。
打开 Cloud Shell。
设置包含 Cloud SQL 实例的服务账号地址的环境变量:
CLOUDSQL_SA="$(gcloud sql instances describe sqlserver-cloudsql --format='get(serviceAccountEmailAddress)')"
将服务账号作为 writer 添加到存储桶 ACL 中,并将其作为 reader 添加到导出对象中:
gsutil acl ch -u "${CLOUDSQL_SA}":W "gs://$(gcloud config get-value project)-bucket/" gsutil acl ch -u "${CLOUDSQL_SA}":R \ "gs://$(gcloud config get-value project)-bucket/WideWorldImporters-copy.bak"
导入之前导出的数据库
打开 Cloud Shell。
将导出的文件导入 Cloud SQL 实例:
gcloud sql import bak sqlserver-cloudsql \ "gs://$(gcloud config get-value project)-bucket/WideWorldImporters-copy.bak" \ --database WideWorldImporters
出现提示时,输入
y
。安装 SQL Server 工具软件包:
sudo apt install -y mssql-tools
如果您接受许可条款,请在出现提示时输入
yes
。您可以使用这些工具从 Cloud Shell 连接到 Cloud SQL,使您能够针对 Cloud SQL 实例运行查询。
将 Cloud SQL 代理连接到 SQL Server 实例:
CONNECTION_NAME=$(gcloud sql instances describe sqlserver-cloudsql --format='value(connectionName)') cloud_sql_proxy -instances=${CONNECTION_NAME}=tcp:1433 &
如需验证克隆的数据库是否正常运行,请运行查询:
/opt/mssql-tools/bin/sqlcmd -U sqlserver -S 127.0.0.1 -Q \ 'SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, LEFT(c.CustomerName,20) CustomerName, i.ConfirmedDeliveryTime, LEFT(i.ConfirmedReceivedBy,20) ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;'
出现提示时,输入
sqlserver
用户的sqlserver-cloudsql
数据库服务器的密码 (sqlserver12@
)。此查询从最近交付的 100 个账单中检索汇总信息。
输出如下所示:
InvoiceDate InvoiceID CustomerID CustomerName ConfirmedDeliveryTime ConfirmedReceivedBy ---------------- ----------- ----------- -------------------- -------------------------------------- -------------------- 2016-05-30 70349 581 Wingtip Toys (Munich 2016-05-31 07:05:00.0000000 Youssef Eriksson 2016-05-30 70350 123 Tailspin Toys (Roe P 2016-05-31 07:10:00.0000000 Ella Zvirbule 2016-05-30 70351 175 Tailspin Toys (San A 2016-05-31 07:15:00.0000000 Julio Correa 2016-05-30 70352 1029 Veronika Necesana 2016-05-31 07:20:00.0000000 Veronika Necesana 2016-05-30 70353 1014 Narendra Tickoo 2016-05-31 07:25:00.0000000 Narendra Tickoo 2016-05-30 70354 930 Shantanu Huq 2016-05-31 07:30:00.0000000 Shantanu Huq 2016-05-30 70355 963 Be Trang 2016-05-31 07:35:00.0000000 Be Trang 2016-05-30 70356 567 Wingtip Toys (Jerome 2016-05-31 07:40:00.0000000 Severins Polis 2016-05-30 70357 510 Wingtip Toys (Grabil 2016-05-31 07:45:00.0000000 Manish Ghosh ...
清除数据
为避免因本教程中使用的资源而导致您的 Google Cloud 账号产生费用,您可以删除为本教程创建的 Google Cloud 项目。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
- 了解如何在 Compute Engine 上使用 Microsoft SQL Server 备份进行时间点恢复。
- 了解在 Compute Engine 上运行 SQL Server 实例的最佳做法。
- 探索有关 Google Cloud 的参考架构、图表和最佳实践。查看我们的 Cloud Architecture Center。