

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# DMS 架构转换中的元数据模型
<a name="sc-metadata-model"></a>

当您使用 DMS 架构转换时，该服务将您的数据库架构表示为分层树。此树称为*元数据树*，它适用于源架构和目标架构。树中的每个元素，包括根元素（“服务器”），都是一个元数据模型。

元数据树包含两种元素：
+ **对象**-表示实际的数据库对象，例如表、函数、视图、序列和索引。您可以使用[DescribeMetadataModel](https://docs.amazonaws.cn/dms/latest/APIReference/API_DescribeMetadataModel.html)请求检索对象的 SQL 定义。
+ **类别**-虚拟分组容器，例如 “架构”、“表”、“函数” 和 “索引”。类别在树中组织对象以供导航，但本身没有 SQL 定义。

只有在您请求数据时，元数据树才会加载数据。这种方法称为按需加载（也称为延迟加载），这意味着 DMS 架构转换仅在需要时从数据库中检索数据。您可以使用导入操作来加载元数据，方法是刷新特定的元数据模型，也可以一次性导入整个子树。诸如评估和转换之类的操作也会自动加载元数据树。

## 元数据模型的工作原理
<a name="sc-metadata-model-how-it-works"></a>

DMS 架构转换中的元数据模型遵循操作生命周期。修改元数据树的操作（例如导入和转换）是异步的。您启动对这些操作的请求，它将在后台运行。调用相应的描述 API 来检查请求状态。读取树的操作（例如描述子项或定义）是同步的。

**注意**  
在 DMS 架构转换中，“*操作*” 和 “*请求*” 这两个术语可以互换使用。

典型的工作流程包括以下步骤：

1. **导入**-将源数据库或目标数据库中的元数据加载到元数据树中。您可以加载初始元数据模型，也可以从数据库中重装现有模型。有关更多信息，请参阅 [在树上导航](#sc-metadata-model-navigating)。有关 API 参考信息，请参阅[StartMetadataModelImport](https://docs.amazonaws.cn/dms/latest/APIReference/API_StartMetadataModelImport.html)。

1. **评估**-分析选定的源元数据模型，以确定转换的复杂性和潜在问题。有关更多信息，请参阅 [使用 DMS 架构转换创建数据库迁移评测报告](assessment-reports.md)。

1. **转换**-将选定的源元数据模型转换为与目标兼容的格式。转换后的定义作为目标元数据树的一部分存储。有关更多信息，请参阅 [在 DMS 架构转换中转换数据库架构：分步指南](schema-conversion-convert.md)。

1. **导出**-保存元数据定义。您可以将源元数据和目标元数据作为 SQL 脚本导出到您的 Amazon S3 存储桶。对于非虚拟目标，也可以将转换后的对象直接应用于目标数据库。有关虚拟目标的更多信息，请参阅[虚拟数据提供程序](virtual-data-provider.md)。有关应用已转换对象的更多信息，请参见[应用转换后的代码](schema-conversion-save-apply.md#schema-conversion-apply)。

评估或转换源元数据模型后，您可以生成评估报告来查看结果。有关更多信息，请参阅 [使用 DMS 架构转换创建数据库迁移评测报告](assessment-reports.md)。

对于支持的迁移对，您还可以使用从 SQL 定义创建自定义语句元数据模型[StartMetadataModelCreation](https://docs.amazonaws.cn/dms/latest/APIReference/API_StartMetadataModelCreation.html)。有关更多信息，请参阅 [创建报表模型](#sc-metadata-model-creation)。

## 浏览元数据模型树
<a name="sc-metadata-model-navigating"></a>

您可以使用以下 API 请求浏览元数据树：
+ [DescribeMetadataModelChildren](https://docs.amazonaws.cn/dms/latest/APIReference/API_DescribeMetadataModelChildren.html)— 返回给定元数据模型的子模型。每个子项都包含选择规则（用于识别特定元数据模型的筛选器），您可以将其传递给下一个调用以进行更深入的研究。
+ [DescribeMetadataModel](https://docs.amazonaws.cn/dms/latest/APIReference/API_DescribeMetadataModel.html)— 返回特定元数据模型的名称、类型和 SQL 定义。

这两个请求都需要`Origin`参数（`SOURCE`或`TARGET`），并使用选择规则来标识元数据模型。源树和目标树的导航模式相同。有关选择规则格式的更多信息，请参阅[DMS 架构转换中的选择规则](sc-selection-rules.md)。

选择您的首选界面以查看导航说明。

------
#### [ Amazon Management Console ]

打开架构转换项目后，您可以浏览源元数据树和目标元数据树。有关打开项目的更多信息，请参阅[在 DMS 架构转换中转换数据库架构：分步指南](schema-conversion-convert.md)。

控制台显示两个树面板：左边是源树，右边是目标树。每个面板都包含一个显示数据库引擎的标题、一个操作菜单和元数据树本身。

“操作” 菜单视上下文而定。并非每个元数据模型都有所有可用的操作。源树和目标树有不同的操作列表。

要查看元数据模型的 SQL 定义和属性，请在树中选择它。中央面板显示包含定义的 “源 SQL” 和 “目标 SQL” 选项卡，以及带有元数据属性的属性选项卡。根据元数据模型类型，可能会出现其他选项卡，例如，表和视图的列或例程的参数。

要展开元数据模型的子项，请选择其旁边的展开图标（黑色三角形）。选择展开图标或元数据模型名称以自动加载其子项。

当您选择已转换的源元数据模型时，将在目标树面板中自动选择相应的目标元数据模型。

以下演练展示了如何浏览元数据树和查看元数据模型定义。

1. 在树面板中，选择服务器旁边的展开图标以显示顶级类别，例如**数据库**或**架构**，具体取决于数据库引擎。

1. 继续展开类别以导航到要浏览的元数据模型。例如，依次展开 “**数据库**”、“特定数据库”、“**架构**”、“架构名称”、“**表**”、“**视图**” 或 “**过程**” 等类别。有些数据库引擎没有**数据库**级别，在这种情况下，可以直接扩展**架构**。

1. 选择一个元数据模型，在中心面板中查看其 SQL 定义。**源 SQL** 选项卡显示源定义，**目标 SQL** 选项卡显示转换后的定义（如果元数据模型已转换）。

------
#### [ Amazon CLI ]

要浏览元数据树，请遵循重复模式：在某个级别导入元数据，然后描述该级别的子级。重复此过程以更深入地钻入树。

首先使用标识顶级[元数据模型的选择规则调用 start-metadata-model-im](https://docs.amazonaws.cn/cli/latest/reference/dms/start-metadata-model-import.html) port。在中包括`server-name`和顶层`category-name`（`Databases`或者`Schemas`，视数据库引擎而定）`object-locator`。有关选择规则结构的更多信息，请参阅[DMS 架构转换中的选择规则](sc-selection-rules.md)。

```
aws dms start-metadata-model-import \
    --migration-project-identifier "{{my-migration-project}}" \
    --origin {{SOURCE}} \
    --refresh \
    --selection-rules '{"rules":[{"rule-type":"selection","rule-id":"1",
      "rule-name":"1","object-locator":{"server-name":"{{my-server}}","category-name":"{{top-level-category}}"},"rule-action":"explicit"}]}'
```

导入请求是异步的。浏览之前，使用 d [escribe-metadata-model-im](https://docs.amazonaws.cn/cli/latest/reference/dms/describe-metadata-model-imports.html) ports 来检查状态。使用带有返回`RequestIdentifier`值的`request-id`过滤器`start-metadata-model-import`来查找特定的导入：

```
aws dms describe-metadata-model-imports \
    --migration-project-identifier "{{my-migration-project}}" \
    --filters Name=request-id,Values={{request-identifier}}
```

导入完成后，调用 desc [ribe-metadata-model-children 来检索该级别的子级](https://docs.amazonaws.cn/cli/latest/reference/dms/describe-metadata-model-children.html)：

```
aws dms describe-metadata-model-children \
    --migration-project-identifier "{{my-migration-project}}" \
    --origin {{SOURCE}} \
    --selection-rules '{"rules":[{"rule-type":"selection","rule-id":"1",
      "rule-name":"1","object-locator":{"server-name":"{{my-server}}"},
      "rule-action":"explicit"}]}'
```

响应中的每个孩子都包含一个`SelectionRules`字段。将这些选择规则传递给下一次导入，并描述调用以进行更深入的研究：

```
{
    "MetadataModelChildren": [
        {
            "MetadataModelName": "Schemas",
            "SelectionRules": "{\"rules\":[{\"rule-type\":\"selection\",\"rule-id\":\"1\",\"rule-name\":\"1\",\"object-locator\":{\"server-name\":\"src-database-server\",\"category-name\":\"Schemas\"},\"rule-action\":\"explicit\"}]}"
        }
    ]
}
```

要深入到下一个级别，请使用上次`describe-metadata-model-children`调用返回的选择规则在该级别导入，然后描述其子级：

```
aws dms start-metadata-model-import \
    --migration-project-identifier "{{my-migration-project}}" \
    --origin {{SOURCE}} \
    --refresh \
    --selection-rules '{{selection-rules-from-previous-response}}'
```

在描述子项之前，请通过检查导入状态来确保导入已完成`describe-metadata-model-imports`。然后打电话`describe-metadata-model-children`：

```
aws dms describe-metadata-model-children \
    --migration-project-identifier "{{my-migration-project}}" \
    --origin {{SOURCE}} \
    --selection-rules '{{selection-rules-from-previous-response}}'
```

响应返回该级别的孩子，每个孩子都有自己的选择规则。将这些选择规则传递给下一次导入，并描述调用以继续深入研究树。

```
{
    "MetadataModelChildren": [
        {
            "MetadataModelName": "{{child-name}}",
            "SelectionRules": "{{selection-rules-JSON-string}}"
        }
    ]
}
```

**与完全导入相比，使用--refresh**

`--refresh`用于从数据库中重装特定的元数据模型。这还会加载其直系子代的名字。您可以使用列出这些子项`describe-metadata-model-children`，但要进一步描述或浏览它们，则必须在子级运行另一次导入。

要加载整个子树（例如，架构中的所有对象、数据库或表或过程等特定类别），请省略该`--refresh`标志并在选择规则`include`中`rule-action`更改为：

```
aws dms start-metadata-model-import \
    --migration-project-identifier "{{my-migration-project}}" \
    --origin {{SOURCE}} \
    --selection-rules '{"rules":[{"rule-type":"selection","rule-id":"1",
      "rule-name":"1","object-locator":{{{...}}},
      "rule-action":"include"}]}'
```

对于大型架构，加载完整的子树可能需要几分钟或几小时，并且会给数据库带来负载。要进行交互式探索，请根据需要使用`--refresh`和钻取特定的分支。

要检索元数据模型的 SQL 定义，请使用 desc [ribe](https://docs.amazonaws.cn/cli/latest/reference/dms/describe-metadata-model.html)-metadata-model。传递从先前`describe-metadata-model-children`响应中识别特定元数据模型的选择规则：

```
aws dms describe-metadata-model \
    --migration-project-identifier "{{my-migration-project}}" \
    --origin {{SOURCE}} \
    --selection-rules '{{selection-rules-for-target-object}}'
```

响应包括元数据模型名称、类型和 SQL 定义：

```
{
    "MetadataModelName": "employees",
    "MetadataModelType": "table",
    "Definition": "CREATE TABLE hr.employees(\n    id integer NOT NULL,\n    name varchar(100),\n    department_id integer\n);"
}
```

**注意**  
某些元数据模型（例如架构和类别）可能未填充该`Definition`字段。

转换源元数据模型后，转换后的定义可在目标树上找到。有三种方法可以检索它们。

**使用源响应中的目标选择规则**

当您在转换后描述源元数据模型时，响应中会包含一个包含目标选择规则的`TargetMetadataModels`字段：

```
{
    "MetadataModelName": "employees",
    "MetadataModelType": "table",
    "TargetMetadataModels": [
        {
            "MetadataModelName": "employees",
            "SelectionRules": "{\"rules\":[{\"rule-type\":\"selection\",\"rule-id\":\"1\",\"rule-name\":\"1\",\"object-locator\":{\"server-name\":\"tgt-database-server\",\"schema-name\":\"hr\",\"table-name\":\"employees\",\"table-type\":\"table\"},\"rule-action\":\"explicit\"}]}"
        }
    ],
    "Definition": "CREATE TABLE hr.employees(\n    id integer NOT NULL,\n    name varchar(100),\n    department_id integer\n);"
}
```

`describe-metadata-model`使用以下方法将选择规则从传递`TargetMetadataModels`到传递`--origin TARGET`：

```
aws dms describe-metadata-model \
    --migration-project-identifier "{{my-migration-project}}" \
    --origin TARGET \
    --selection-rules '{{selection-rules-from-TargetMetadataModels}}'
```

响应中包含目标引擎语法中转换后的 SQL 定义：

```
{
    "MetadataModelName": "employees",
    "MetadataModelType": "table",
    "Definition": "CREATE TABLE hr.employees (\nid INT NOT NULL,\nname VARCHAR(100) DEFAULT NULL,\ndepartment_id INT DEFAULT NULL,\nPRIMARY KEY (id)\n);"
}
```

**使用获取目标选择规则**

你可以使用 [get-target-selection-](https://docs.amazonaws.cn/cli/latest/reference/dms/get-target-selection-rules.html) rules 将源选择规则直接转换为对应的目标规则，而无需先调用源：`describe-metadata-model`

```
aws dms get-target-selection-rules \
    --migration-project-identifier "{{my-migration-project}}" \
    --selection-rules '{{source-selection-rules}}'
```

**直接在目标树中导航**

您也可以使用与源树相同的方式浏览目标树`--origin TARGET`。当您想要在不从源开始的情况下浏览所有已转换的对象时，这很有用。

------

## 创建报表元数据模型
<a name="sc-metadata-model-creation"></a>

**注意**  
语句创建目前仅支持以下方向：从 SQL Server 到 Aurora PostgreSQL，或者从 SQL Server 到 Amazon RDS for PostgreSQL

您可以使用根据 SQL 定义创建语句元数据模型[StartMetadataModelCreation](https://docs.amazonaws.cn/dms/latest/APIReference/API_StartMetadataModelCreation.html)。当您想要转换源数据库中不作为对象存在的 SQL 语句时，这很有用，例如应用程序查询或临时 SQL 代码。

------
#### [ Amazon Management Console ]

 Amazon 管理控制台中无法创建报表元数据模型。改用 Amazon CLI 或 S Amazon DK。

------
#### [ Amazon CLI ]

要创建语句元数据模型，请使用[开始元数据模型创](https://docs.amazonaws.cn/cli/latest/reference/dms/start-metadata-model-creation.html)建。选择规则必须指定源数据库中存在的架构。创建的元数据模型显示在该架构中的`Statements`类别下。

```
aws dms start-metadata-model-creation \
    --migration-project-identifier "{{my-migration-project}}" \
    --metadata-model-name "{{GetAllEmployees}}" \
    --selection-rules '{"rules":[{"rule-type":"selection","rule-id":"1",
      "rule-name":"1","object-locator":{"server-name":"{{my-server}}",
      "database-name":"{{my_database}}","schema-name":"{{dbo}}"},
      "rule-action":"explicit"}]}' \
    --properties '{"StatementProperties":{"Definition":"SELECT * FROM dbo.Employees;"}}'
```

创建完成后，你可以在树中的`Statements`类别下找到元数据模型并对其进行描述：

```
{
    "MetadataModelName": "GetAllEmployees",
    "MetadataModelType": "statement",
    "Definition": "SELECT * FROM dbo.Employees;"
}
```

创建后，您可以对语句元数据模型运行任何支持的操作，例如评估、转换或导出。

------