

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

# ConnConnecting 到 IBM DB2 for Linux、UNIX 和 Windows 数据库使用 AWS Schema Conversion Tool
<a name="CHAP_Source.DB2LUW"></a>

您可以使用 AWS SCT 将架构、SQL 语言中的代码对象以及适用于 Linux、Unix 和 Windows 的 IBM Db2 (Db2 LUW) 中的应用程序代码转换为以下目标。
+ Amazon RDS for MySQL
+ Amazon Aurora MySQL 兼容版
+ Amazon RDS for PostgreSQL
+ Amazon Aurora PostgreSQL 兼容版
+ Amazon RDS for MariaDB

AWS SCT 作为源代码支持 Db2 LUW 版本 9.1、9.5、9.7、10.1、10.5、11.1 和 11.5。

## 将 Db2 LUW 用作源的权限
<a name="CHAP_Source.DB2LUW.Permissions"></a>

下面列出了连接到 Db2 LUW 数据库、检查可用权限和读取源的架构元数据所需的权限：
+ 建立连接所需的权限：
  + CONNECT ON DATABASE
+ 运行 SQL 语句所需的权限：
  + 在包名为空时执行。 SYSSH200
+ 获取实例级别信息所需的权限：
  + EXECUTE ON FUNCTION SYSPROC.ENV\$1GET\$1INST\$1INFO
  + SELECT ON SYSIBMADM.ENV\$1INST\$1INFO
  + SELECT ON SYSIBMADM.ENV\$1SYS\$1INFO
+ 检查通过角色、组和机构授予的权限所需的权限：
  + EXECUTE ON FUNCTION SYSPROC.AUTH\$1LIST\$1AUTHORITIES\$1FOR\$1AUTHID
  + EXECUTE ON FUNCTION SYSPROC.AUTH\$1LIST\$1GROUPS\$1FOR\$1AUTHID
  + EXECUTE ON FUNCTION SYSPROC.AUTH\$1LIST\$1ROLES\$1FOR\$1AUTHID
  + SELECT ON SYSIBMADM.PRIVILEGES
+ 系统目录和表上所需的权限：
  + SELECT ON SYSCAT.ATTRIBUTES
  + SELECT ON SYSCAT.CHECKS
  + SELECT ON SYSCAT.COLIDENTATTRIBUTES
  + SELECT ON SYSCAT.COLUMNS
  + SELECT ON SYSCAT.DATAPARTITIONEXPRESSION
  + SELECT ON SYSCAT.DATAPARTITIONS
  + SELECT ON SYSCAT.DATATYPEDEP
  + SELECT ON SYSCAT.DATATYPES
  + SELECT ON SYSCAT.HIERARCHIES
  + SELECT ON SYSCAT.INDEXCOLUSE
  + SELECT ON SYSCAT.INDEXES
  + SELECT ON SYSCAT.INDEXPARTITIONS
  + SELECT ON SYSCAT.KEYCOLUSE
  + SELECT ON SYSCAT.MODULEOBJECTS
  + SELECT ON SYSCAT.MODULES
  + SELECT ON SYSCAT.NICKNAMES
  + SELECT ON SYSCAT.PERIODS
  + SELECT ON SYSCAT.REFERENCES
  + SELECT ON SYSCAT.ROUTINEPARMS
  + SELECT ON SYSCAT.ROUTINES
  + SELECT ON SYSCAT.ROWFIELDS
  + SELECT ON SYSCAT.SCHEMATA
  + SELECT ON SYSCAT.SEQUENCES
  + SELECT ON SYSCAT.TABCONST
  + SELECT ON SYSCAT.TABLES
  + SELECT ON SYSCAT.TRIGGERS
  + SELECT ON SYSCAT.VARIABLEDEP
  + SELECT ON SYSCAT.VARIABLES
  + SELECT ON SYSCAT.VIEWS
  + 在 SYSIBM 上选择。 SYSDUMMY1
+  要运行 SQL 语句，用户账户需要使用至少一个在数据库中启用的工作负载的权限。如果没有为用户分配任何工作负载，请确保用户可以访问默认用户工作负载：
  + USAGE ON WORKLOAD SYSDEFAULTUSERWORKLOAD

要运行查询，您需要创建具有页面大小 8K、16K 和 32K 的系统临时表空间（如果它们不存在）。要创建临时表空间，请运行以下脚本。

```
CREATE BUFFERPOOL BP8K
  IMMEDIATE
  ALL DBPARTITIONNUMS
  SIZE AUTOMATIC
  NUMBLOCKPAGES 0
  PAGESIZE 8K;
  
CREATE SYSTEM TEMPORARY TABLESPACE TS_SYS_TEMP_8K 
  PAGESIZE 8192 
  BUFFERPOOL BP8K;
  
CREATE BUFFERPOOL BP16K
  IMMEDIATE
  ALL DBPARTITIONNUMS
  SIZE AUTOMATIC
  NUMBLOCKPAGES 0
  PAGESIZE 16K;
  
CREATE SYSTEM TEMPORARY TABLESPACE TS_SYS_TEMP_BP16K 
  PAGESIZE 16384 
  BUFFERPOOL BP16K;  
  
CREATE BUFFERPOOL BP32K
  IMMEDIATE
  ALL DBPARTITIONNUMS
  SIZE AUTOMATIC
  NUMBLOCKPAGES 0
  PAGESIZE 32K;
  
CREATE SYSTEM TEMPORARY TABLESPACE TS_SYS_TEMP_BP32K 
  PAGESIZE 32768 
  BUFFERPOOL BP32K;
```

## 连接到作为源的 Db2 LUW
<a name="CHAP_Source.DB2LUW.Connecting"></a>

使用 AWS Schema Conversion Tool按照以下过程连接到 Db2 LUW 源数据库。

**连接到 Db2 LUW 源数据库**

1. 在中 AWS Schema Conversion Tool，选择**添加来源**。

1. 选择 **Db2 LUW**，然后选择**下一步**。

   此时显示**添加源**对话框。

1. 对于**连接名称**，输入数据库的名称。 AWS SCT 会在左侧面板的树中显示此名称。

1. 使用来自的数据库凭据 AWS Secrets Manager 或手动输入：
   + 要使用 Secrets Manager 中的数据库凭证，请按照以下说明进行操作：

     1. 对于 **AWS 密钥**，输入密钥名称。

     1. 选择**填充**可使用 Secrets Manager 中的数据库凭证自动填写数据库连接对话框中的所有值。

     有关使用 Secrets Manager 中的数据库凭证的信息，请参阅[AWS Secrets Manager 在中配置 AWS Schema Conversion Tool](CHAP_UserInterface.SecretsManager.md)。
   + 要手动输入 IBM Db2 LUW 源数据库连接信息，请按照以下说明进行操作：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/SchemaConversionTool/latest/userguide/CHAP_Source.DB2LUW.html)

1. 选择 “**测试连接**” 以验证是否 AWS SCT 可以连接到您的源数据库。

1. 选择**连接**以连接到源数据库。

# 从 DB2 适用于 Linux、UNIX 和 Windows 的 IBM 迁移到适用于 PostgreSQL 的亚马逊关系数据库服务或兼容亚马逊 Aurora PostgreSQL 的版本
<a name="CHAP_Source.DB2LUW.ToPostgreSQL"></a>

当你将 IBM Db2 LUW 迁移到 PostgreSQL 时， AWS SCT 可以转换与 Db2 LUW 一起使用的各种触发语句。这些触发语句包括以下内容：
+ **触发事件** - INSERT、DELETE 和 UPDATE 触发事件指定触发的操作将在事件应用于主题表或主题视图时运行。您可以指定 INSERT、DELETE 和 UPDATE 事件的任意组合，但每个事件只能指定一次。 AWS SCT 支持单个和多个触发事件。对于事件，PostgreSQL 几乎具有相同的功能。
+ **事件 OF COLUMN**：可通过基表指定列名称。仅当更新列名称列表中标识的列时才会激活此触发器。PostgreSQL 具有相同的功能。
+ **语句触发器**：这些触发器指定仅对整个语句应用触发的操作一次。不能为 BEFORE 触发器或 INSTEAD OF 触发器指定此类型的触发器粒度。如果指定，则将激活 UPDATE 或 DELETE 触发器，即使不影响任何行也是如此。PostgreSQL 也具有此功能，并且 PostgreSQL 和 Db2 LUW 的语句触发器的触发声明是相同的。
+ **引用子句**：这些子句指定转换变量的相关性名称和转换表的表名称。相关性名称标识通过触发 SQL 操作影响的行集中的特定行。表名称标识受影响行的完整集。通过触发 SQL 操作影响的每行可用于通过使用指定相关性名称限定列触发的操作。PostgreSQL 不支持此功能，并且仅使用 NEW 或 OLD 相关性名称。
+ **INSTEAD OF 触发器**： AWS SCT 支持这些触发器。

## 将 Db2 LUW 分区表转换为 PostgreSQL 版本 10 分区表
<a name="CHAP_Source.DB2LUW.ToPostgreSQL.PartitionedTables"></a>

AWS SCT 可以在 PostgreSQL 10 中将 Db2 LUW 表转换为分区表。在将 Db2 LUW 分区表转换为 PostgreSQL 时，存在一些限制：
+ 可在 Db2 LUW 中创建具有可为空的列的分区表，并指定用于存储 NULL 值的分区。但是，PostgreSQL 不支持 RANGE 分区采用 NULL 值。
+ Db2 LUW 可以使用 INCLUSIVE 或 EXCLUSIVE 子句来设置范围边界值。PostgreSQL 仅支持 INCLUSIVE 用于开始边界，EXCLUSIVE 用于结束边界。转换的分区名称的格式为 <original\$1table\$1name>\$1<original\$1partition\$1name>。
+ 在 Db2 LUW 中，可为分区表创建主键或唯一键。PostgreSQL 需要您直接为每个分区创建主键或唯一键。必须从父表中删除主键或唯一键约束。转换的键名称的格式为 <original\$1key\$1name>\$1<original\$1partition \$1name>。
+ 在 Db2 LUW 中，您可以创建进出分区表的外键约束。但是，PostgreSQL 不支持分区表中的外键引用。此外，PostgreSQL 也不支持从一个分区表到另一个表的外键引用。
+ 在 Db2 LUW 中，您可以在分区表上创建索引。但是，PostgreSQL 需要您直接为每个分区创建索引。必须从父表删除索引。转换的索引名称的格式为 <original\$1index\$1name>\$1<original\$1partition\$1name>。
+ 您必须针对单个分区而不是分区表定义行触发器。必须从父表删除触发器。转换的触发器名称的格式为 <original\$1trigger\$1name>\$1<original\$1partition\$1name>。

## 将 PostgreSQL 用作目标的权限
<a name="CHAP_Source.DB2LUW.ToPostgreSQL.ConfigureTarget"></a>

要使用 PostgreSQL 作为目标 AWS SCT ，需要权限。`CREATE ON DATABASE`请确保为每个目标 PostgreSQL 数据库授予此权限。

要使用转换后的公共同义词，请将数据库的默认搜索路径更改为 `"$user", public_synonyms, public`。

您可以使用以下代码示例创建数据库用户并授予权限。

```
CREATE ROLE user_name LOGIN PASSWORD 'your_password';
GRANT CREATE ON DATABASE db_name TO user_name;
ALTER DATABASE db_name SET SEARCH_PATH = "$user", public_synonyms, public;
```

在前面的示例中，*user\$1name*使用您的用户名替换。然后，*db\$1name*替换为目标数据库的名称。最后，*your\$1password*替换为安全密码。

在 PostgreSQL 中，只有架构所有者或 `superuser` 才能删除架构。即使架构的所有者并不拥有架构的某些对象，该所有者也可以删除该架构及其包含的所有对象。

当你使用不同的用户转换不同的架构并将其应用到目标数据库时，当无法删除架构时，你 AWS SCT 可能会收到一条错误消息。要避免出现此错误消息，请使用 `superuser` 角色。

# 从 DB2 适用于 Linux、UNIX 和 Windows 的 IBM 迁移到适用于 MySQL 的亚马逊 RDS 或亚马逊 Aurora MySQL
<a name="CHAP_Source.DB2LUW.ToMySQL"></a>

将 IBM Db2 LUW 数据库转换为适用于 MySQL 的 RDS 或 Amazon Aurora MySQL 时，请注意以下几点。

## 将 MySQL 用作目标的权限
<a name="CHAP_Source.DB2LUW.ToMySQL.ConfigureTarget"></a>

下面列出了将 MySQL 用作目标所需的权限：
+ CREATE ON \$1.\$1
+ ALTER ON \$1.\$1
+ DROP ON \$1.\$1
+ INDEX ON \$1.\$1
+ REFERENCES ON \$1.\$1
+ SELECT ON \$1.\$1
+ CREATE VIEW ON \$1.\$1
+ SHOW VIEW ON \$1.\$1
+ TRIGGER ON \$1.\$1
+ CREATE ROUTINE ON \$1.\$1
+ ALTER ROUTINE ON \$1.\$1
+ EXECUTE ON \$1.\$1
+ SELECT ON mysql.proc
+ 插入，在 AWS\$1DB 2\$1EXT 上更新。 \$1
+ 在 AWS\$1DB 2\$1EXT\$1DATA 上插入、更新、删除。 \$1
+ 在 AWS\$1DB 2\$1EXT\$1DATA 上创建临时表。 \$1

您可以使用以下代码示例创建数据库用户并授予权限。

```
CREATE USER 'user_name' IDENTIFIED BY 'your_password';
GRANT CREATE ON *.* TO 'user_name';
GRANT ALTER ON *.* TO 'user_name';
GRANT DROP ON *.* TO 'user_name';
GRANT INDEX ON *.* TO 'user_name';
GRANT REFERENCES ON *.* TO 'user_name';
GRANT SELECT ON *.* TO 'user_name';
GRANT CREATE VIEW ON *.* TO 'user_name';
GRANT SHOW VIEW ON *.* TO 'user_name';
GRANT TRIGGER ON *.* TO 'user_name';
GRANT CREATE ROUTINE ON *.* TO 'user_name';
GRANT ALTER ROUTINE ON *.* TO 'user_name';
GRANT EXECUTE ON *.* TO 'user_name';
GRANT SELECT ON mysql.proc TO 'user_name';
GRANT INSERT, UPDATE ON AWS_DB2_EXT.* TO 'user_name';
GRANT INSERT, UPDATE, DELETE ON AWS_DB2_EXT_DATA.* TO 'user_name';
GRANT CREATE TEMPORARY TABLES ON AWS_DB2_EXT_DATA.* TO 'user_name';
```

在前面的示例中，*user\$1name*使用您的用户名替换。然后，*your\$1password*替换为安全密码。

要使用 Amazon RDS for MySQL 或 Aurora MySQL 作为目标，请将 `lower_case_table_names` 参数设置为 `1`。此值意味着 MySQL 服务器在处理表、索引、触发器和数据库等对象名称的标识符时不区分大小写。如果目标实例中已开启二进制日志记录，请将 `log_bin_trust_function_creators` 参数设置为 `1`。在这种情况下，您无需使用 `DETERMINISTIC`、`READS SQL DATA` 或 `NO SQL` 特性创建存储函数。要配置这些参数，请创建新的数据库参数组或修改现有数据库参数组。