你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

迁移要扩展的现有数据库

适用于:Azure SQL 数据库

使用工具(例如弹性数据库客户端库)轻松管理现有的横向扩展共享数据库。 先转换现有数据库集,再使用分片映射管理器

概述

迁移现有的分片数据库:

  1. 准备分片映射管理器数据库
  2. 创建分片映射。
  3. 准备各个分片。
  4. 将映射添加到分片映射。

可使用 .NET Framework 客户端库或者 Azure SQL 数据库 - 弹性数据库工具脚本中提供的 PowerShell 脚本来实现这些技巧。 以下示例使用 PowerShell 脚本。

有关 ShardMapManager 的详细信息,请参阅分片映射管理。 有关弹性数据库工具的概述,请参阅弹性数据库功能概述

准备分片映射管理器数据库

分片映射管理器是一个特殊的数据库,其中包含用于管理已扩展数据库的数据。 可以使用现有数据库,或创建新的数据库。 用作分片映射管理器的数据库不应是与分片相同的数据库。 PowerShell 脚本不会创建该数据库。

步骤 1:创建分片映射管理器

# Create a shard map manager
New-ShardMapManager -UserName '<user_name>' -Password '<password>' -SqlServerName '<server_name>' -SqlDatabaseName '<smm_db_name>'
#<server_name> and <smm_db_name> are the server name and database name
# for the new or existing database that should be used for storing
# tenant-database mapping information.

检索分片映射管理器

创建后,可以使用此 cmdlet 检索分片映射管理器。 每当需要使用 ShardMapManager 对象时,则需要执行此步骤。

# Try to get a reference to the Shard Map Manager  
$ShardMapManager = Get-ShardMapManager -UserName '<user_name>' -Password '<password>' -SqlServerName '<server_name>' -SqlDatabaseName '<smm_db_name>'

步骤 2:创建分片映射

必须选择要创建的分片映射类型。 选择取决于数据库架构:

  1. 每个数据库一个租户(有关术语,请参阅词汇表。)
  2. 每个数据库多个租户(两种类型):
    1. 列表映射
    2. 范围映射

对于单租户模型,创建“列表映射” 分片映射。 单租户模型将每个租户分配给一个数据库。 这是适用于 SaaS 开发人员的有效模型,因为它可以简化管理。

列表映射

多租户模型将数个租户分配给单个数据库(可跨多个数据库分布租户组)。 如果希望每个租户具有较小的数据需求,请使用此模型。 在此模型中,使用范围映射将一系列用户分配到数据库。

范围映射

或可以使用列表映射来实现多租户数据库模型,以将多个租户分配给单个数据库。 例如,DB1 用于存储租户 ID 1 和 5 的相关信息,而 DB2 用于存储租户 7 和租户 10 的数据。

单一数据库上的多个租户

根据你具体的选择,选择以下选项之一:

选项 1:为列表映射创建分片映射

使用 ShardMapManager 对象创建分片映射。

# $ShardMapManager is the shard map manager object
$ShardMap = New-ListShardMap -KeyType $([int]) -ListShardMapName 'ListShardMap' -ShardMapManager $ShardMapManager

选项 2:为范围映射创建分片映射

若要使用此映射模式,租户 ID 值需是连续范围,并且可接受范围中有间距,方法为创建数据库时跳过范围。

# $ShardMapManager is the shard map manager object
# 'RangeShardMap' is the unique identifier for the range shard map.  
$ShardMap = New-RangeShardMap -KeyType $([int]) -RangeShardMapName 'RangeShardMap' -ShardMapManager $ShardMapManager

选项 3:单个数据库的列表映射

设置此模式也要求创建列表映射,如步骤 2,选项 1 中所示。

步骤 3:准备各个分片

将每个分片(数据库)添加到分片映射管理器。 此操作将准备用于存储映射信息的各个数据库。 对每个分片执行此方法。

Add-Shard -ShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'
# The $ShardMap is the shard map created in step 2.

步骤 4:添加映射

添加映射的操作取决于所创建的分片映射种类。 如果创建的是列表映射,则添加列表映射。 如果创建的是范围映射,则添加范围映射。

选项 1:为列表映射映射数据

通过为每个租户添加列表映射来映射数据。

# Create the mappings and associate it with the new shards
Add-ListMapping -KeyType $([int]) -ListPoint '<tenant_id>' -ListShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'

选项 2:为范围映射映射数据

添加所有租户 ID 范围的范围映射 - 数据库关联:

# Create the mappings and associate it with the new shards
Add-RangeMapping -KeyType $([int]) -RangeHigh '5' -RangeLow '1' -RangeShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'

步骤 4,选项 3:映射单个数据库上多个租户的数据

对于每个租户,运行 Add-ListMapping(选项 1)。

检查映射

可以使用以下命令查询现有分片及其关联的映射的相关信息:

# List the shards and mappings
Get-Shards -ShardMap $ShardMap
Get-Mappings -ShardMap $ShardMap

摘要

完成设置后,便可以开始使用弹性数据库客户端库。 还可以使用数据依赖型路由多分片查询

后续步骤

Azure 弹性数据库工具脚本获取 PowerShell 脚本。

在 GitHub 上提供弹性数据库工具客户端库:Azure/elastic-db-tools

使用拆分/合并工具在多租户模型与单租户模型之间来回移动数据。 请参阅拆分合并工具

其他资源

有关多租户软件即服务 (SaaS) 数据库应用程序的常见数据体系结构模式的信息,请参阅 包含 Azure SQL 数据库的多租户 SaaS 应用程序的设计模式

问题和功能请求

如有问题,请前往有关 SQL 数据库的 Microsoft Q&A 问题页面;如有功能请求,请将请求添加到 SQL 数据库反馈论坛