Amazon RDS for Db2 联合身份验证
可以将 Amazon RDS for Db2 数据库用作联合数据库。在为 RDS for Db2 设置联合身份验证后,您将能够从 RDS for Db2 数据库访问和查询多个数据库中的数据。联合身份验证使您无需将数据迁移到 RDS for Db2 数据库或将数据整合到单个数据库中。
通过将 RDS for Db2 数据库用作联合数据库,您可以继续访问 RDS for Db2 的所有功能,并可以利用各项 AWS 服务,同时将数据保存在不同的数据库中。可以设置用于连接相同类型的不同数据库的同构联合身份验证,也可以设置用于连接不同类型的不同数据库的异构联合身份验证。
首先将 RDS for Db2 中的 Db2 数据库连接到远程数据库。然后,可以针对所有连接的数据库运行查询。例如,可以运行 SQL JOIN 语句,来将 RDS for Db2 数据库中的表与 z/OS 上的 Db2 远程数据库中的表相联接。
同构联合身份验证
可以在 RDS for Db2 数据库和以下 Db2 系列产品之间设置同构联合身份验证:
-
Db2 for Linux、UNIX、Windows(LUW)
-
Db2 iSeries
-
Db2 for z/OS
RDS for Db2 同构联合身份验证不支持以下操作:
-
运行
CATALOG
命令来在 RDS for Db2 主机数据库上设置节点目录和远程数据库 -
在与 z/OS 上的 Db2 进行联合身份验证时设置工作负载平衡(WLB)
-
配置 IBM 数据服务器驱动程序配置文件 (
db2dsdriver.cfg
)
RDS for Db2 同构联合身份验证具有以下要求:
-
您必须在
UNFENCED
模式下创建 DRDA 包装器。否则,联合身份验证在 RDS for Db2 中无法发挥作用。 -
必须支持从 RDS for Db2 主机数据库到远程主机数据库的传入和传出流量。有关更多信息,请参阅 通过创建安全组提供对 VPC 中的数据库实例的访问。
步骤 1:创建 DRDA 包装器和联合服务器
对于同构联合身份验证,请创建 DRDA 包装器和联合服务器。与远程主机的连接使用 HOST
、PORT
和 DBNAME
。
根据远程 Db2 数据库的类型,选择以下方法之一:
-
Db2 for Linux、UNIX 和 Windows(LUX)数据库 – 运行以下 SQL 命令。在以下示例中,将
server_name
替换为要用于联合身份验证的服务器的名称。将db2_version
替换为远程 Db2 数据库的版本。将username
和password
替换为要连接到的远程 Db2 数据库的凭证。将db_name
、dns_name
和port
替换为要连接到的远程 Db2 数据库的相应值。create wrapper drda options(DB2_FENCED 'N'); create server
server_name
type DB2/LUW wrapper drda version 'db2_version
' authorization "master_username
" password "master_password
" options (add DBNAME 'db_name
',add HOST 'dns_name
',add PORT 'port
');示例
create wrapper drda options(DB2_FENCED 'N'); create server SERVER1 type DB2/LUW wrapper drda version '11.5' authorization "sysuser" password "******" options (add DBNAME 'TESTDB2',add HOST 'ip-123-45-67-899.us-west-1.compute.internal',add PORT '25010');
-
Db2 iSeries – 运行以下 SQL 命令。在以下示例中,将
wrapper_name
和library_name
替换为 DRDA 包装器和 wrapper library file的名称。将 server_name
替换为要用于联合身份验证的服务器的名称。将db2_version
替换为远程 Db2 数据库的版本。将username
和password
替换为要连接到的远程 Db2 数据库的凭证。将dns_name
、port
和db_name
替换为要连接到的远程 Db2 数据库的相应值。create wrapper
wrapper_name
library 'library name
' options(DB2_FENCED 'N'); create serverserver_name
type db2/mvs versiondb2_version
wrapperwrapper_name
authorization "sername
" password "password
" options (HOST 'dns_name
', PORT 'port
', DBNAME 'db_name
');示例
create wrapper WRAPPER1 library 'libdb2drda.so' options(DB2_FENCED 'N'); create server SERVER1 type db2/mvs version 11 wrapper WRAPPER1 authorization "sysuser" password "******" options (HOST 'test1.123.com', PORT '446', DBNAME 'STLEC1');
-
Db2 for z/OS – 运行以下 SQL 命令。在以下示例中,将
wrapper_name
和library_name
替换为 DRDA 包装器和 wrapper library file的名称。将 server_name
替换为要用于联合身份验证的服务器的名称。将db2_version
替换为远程 Db2 数据库的版本。将username
和password
替换为要连接到的远程 Db2 数据库的凭证。将dns_name
、port
和db_name
替换为要连接到的远程 Db2 数据库的相应值。create wrapper
wrapper_name
library 'library_name
' options(DB2_FENCED 'N'); create serverserver_name
type db2/mvs versiondb2_version
wrapperwrapper_name
authorization "username
" password "password
" options (HOST 'dns_name
', PORT 'port
', DBNAME 'db_name
');示例
create wrapper WRAPPER1 library 'libdb2drda.so' OPTIONS(DB2_FENCED 'N'); create server SERVER1 type db2/mvs version 11 wrapper WRAPPER1 authorization "sysuser" password "******" options (HOST 'test1.123.com', PORT '446', DBNAME 'STLEC1');
步骤 2:创建用户映射
通过运行以下 SQL 命令创建用户映射,来将联合服务器与数据来源服务器相关联。在以下示例中,将 server_name
替换为要对其执行操作的远程服务器的名称。这是您在步骤 1 中创建的服务器。将 username
和 password
替换为该远程服务器的凭证。
create user mapping for user server
server_name
options (REMOTE_AUTHID 'username
', REMOTE_PASSWORD 'password
');
有关更多信息,请参阅 IBM Db2 文档中的 User mappings
步骤 3:检查连接
通过检查连接,确认成功设置了联合身份验证。打开一个会话,通过使用 SET PASSTHRU 命令向远程数据来源发送原生 SQL 命令,然后在远程数据服务器上创建表。
-
打开和关闭会话来向数据来源提交 SQL。在以下示例中,将
server_name
替换为在步骤 1 中为联合身份验证创建的服务器的名称。set passthru
server_name
; -
创建一个新表。在以下示例中,将
column_name
、data_type
和value
替换为对应于表的项目。create table
table_name
(column_name
data_type
(value
),column_name
data_type
(value
);有关更多信息,请参阅 IBM Db2 文档中的 CREATE TABLE statement
。 -
创建索引,向表中插入行的值,然后重置连接。重置连接会断开连接,但会保留后端进程。在以下示例中,将
index_name
、table_name
、column_name
和columnx_value
替换为您的信息。create index
index_name
ontable_name
(column_name
); insert intotable_name
values(column1_value
,column2_value
,column3_value
); insert intotable_name
values(column1_value
,column2_value
,column3_value
); set passthru reset; connect reset; -
连接到远程 Db2 数据库,为远程服务器创建昵称,然后执行操作。访问完远程 Db2 数据库中的数据后,重置并终止连接。在以下示例中,将
database_name
替换为远程 Db2 数据库的名称。将nickname
替换为名称。将server_name
和table_name
替换为远程服务器的名称和该服务器上您要对其执行操作的表。将username
替换为远程服务器的信息。将sql_command
替换为要在远程服务器上执行的操作。connect to
database_name
; create nicknamenickname
forserver_name
."username
"."table_name
"; selectsql_command
fromnickname
; connect reset; terminate;
示例
以下示例创建了一个直通会话,来支持在联合服务器 testdb10
上进行操作。
接下来,它创建包含三列且各列的数据类型不同的表 t1
。
然后,该示例对表 t1
中的三列创建索引 i1_t1
。之后,它插入两行,其中包含这三列的值,然后断开连接。
最后,该示例连接到远程 Db2 数据库 testdb2
,并在联合服务器 testdb10
中为表 t1
创建昵称。它使用用户名 TESTUSER
为该数据来源创建昵称。一条 SQL 命令输出表 t1
中的所有数据。该示例断开连接并结束会话。
set passthru testdbl0; create table t1 ( c1 decimal(13,0), c2 char(200), c3 int); create index i1_t1 on t1(c3); insert into t1 values(1,'Test',1); insert into t1 values(2,'Test 2',2); connect reset; connect to testdb2; create nickname remote_t1 for testdbl0."TESTUSER"."T1"; select * from remote_t1; connect reset; terminate;
异构联合身份验证
可以在 RDS for Db2 数据库与其他数据来源(例如 Oracle 和 Microsoft SQL Server)之间设置异构联合身份验证。有关 Db2 LUW 支持的数据来源的完整列表,请参阅 IBM 支持网站上的 Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5
RDS for Db2 异构联合身份验证不支持以下各项:
-
其他数据来源的原生包装器
-
其他数据来源的 JDBC 包装器
-
与 Sybase、Informix 和 Teradata 数据来源的联合身份验证,因为这些数据来源要求在 RDS for Db2 上安装客户端软件
RDS for Db2 异构联合身份验证具有以下要求:
-
RDS for Db2 仅支持 ODBC 包装器方法。
-
如果您创建了包装器的显式定义,则必须将选项
DB2_FENCED
设置为'N'
。有关 ODBC 的有效包装器选项列表,请参阅 IBM Db2 文档中的 ODBC options。 -
必须支持从 RDS for Db2 主机数据库到远程主机数据库的传入和传出流量。有关更多信息,请参阅 通过创建安全组提供对 VPC 中的数据库实例的访问。
有关与 Oracle 的联合身份验证的信息,请参阅 IBM 支持网站上的 How to query Oracle by using Db2 Federation and the ODBC driver?
有关支持联合身份验证的数据来源的更多信息,请参阅 IBM 支持网站上的 Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5
步骤 1:创建 ODBC 包装器
通过运行以下命令创建包装器:
db2 "create wrapper odbc options( module '/home/rdsdb/sqllib/federation/odbc/lib/libodbc.so')"
步骤 2:创建联合服务器
通过运行以下命令创建联合服务器。在以下示例中,将 server_name
替换为要用于联合身份验证的服务器的名称。将 wrapper_type
替换为相应的包装器。将 db_version
替换为远程数据库的版本。将 dns_name
、port
和 service_name
替换为要连接到的远程数据库的相应值。
db2 "create server
server_name
typewrapper_type
versiondb_version
options (HOST 'dns_name
', PORT 'port
', SERVICE_NAME 'service_name
')“
有关包装器类型的信息,请参阅 IBM 支持网站上的 Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5
示例
以下示例为远程 Oracle 数据库创建联合服务器。
db2 "create server server1 type oracle_odbc version 12.1 options (HOST 'test1.amazon.com', PORT '1521', SERVICE_NAME 'pdborcl.amazon.com')“
步骤 3:创建用户映射
通过运行以下 SQL 命令创建用户映射,来将联合服务器与数据来源服务器相关联。在以下示例中,将 server_name
替换为要对其执行操作的远程服务器的名称。这是您在步骤 2 中创建的服务器。将 username
和 password
替换为该远程服务器的凭证。
create user mapping for user server
server_name
options (REMOTE_AUTHID 'username
', REMOTE_PASSWORD 'password
');
有关更多信息,请参阅 IBM Db2 文档中的 User mappings
步骤 4:检查连接
通过检查连接,确认成功设置了联合身份验证。打开一个会话,通过使用 SET PASSTHRU 命令向远程数据来源发送原生 SQL 命令,然后在远程数据服务器上创建表。
-
打开和关闭会话来向数据来源提交 SQL。在以下示例中,将
server_name
替换为在步骤 2 中为联合身份验证创建的服务器的名称。set passthru
server_name
; -
创建一个新表。在以下示例中,将
column_name
、data_type
和value
替换为对应于表的项目。create table
table_name
(column_name
data_type
(value
),column_name
data_type
(value
);有关更多信息,请参阅 IBM Db2 文档中的 CREATE TABLE statement
。 -
创建索引,向表中插入行的值,然后重置连接。重置连接会断开连接,但会保留后端进程。在以下示例中,将
index_name
、table_name
、column_name
和columnx_value
替换为您的信息。create index
index_name
ontable_name
(column_name
); insert intotable_name
values(column1_value
,column2_value
,column3_value
); insert intotable_name
values(column1_value
,column2_value
,column3_value
); set passthru reset; connect reset; -
连接到远程 Db2 数据库,为远程服务器创建昵称,然后执行操作。访问完远程 Db2 数据库中的数据后,重置并终止连接。在以下示例中,将
database_name
替换为远程 Db2 数据库的名称。将nickname
替换为名称。将server_name
和table_name
替换为远程服务器的名称和该服务器上您要对其执行操作的表。将username
替换为远程服务器的信息。将sql_command
替换为要在远程服务器上执行的操作。connect to
database_name
; create nicknamenickname
forserver_name
."username
"."table_name
"; selectsql_command
fromnickname
; connect reset; terminate;
示例
以下示例创建了一个直通会话,来支持在联合服务器 testdb10
上进行操作。
接下来,它创建包含三列且各列的数据类型不同的表 t1
。
然后,该示例对表 t1
中的三列创建索引 i1_t1
。之后,它插入两行,其中包含这三列的值,然后断开连接。
最后,该示例连接到远程 Db2 数据库 testdb2
,并在联合服务器 testdb10
中为表 t1
创建昵称。它使用用户名 TESTUSER
为该数据来源创建昵称。一条 SQL 命令输出表 t1
中的所有数据。该示例断开连接并结束会话。
set passthru testdbl0; create table t1 ( c1 decimal(13,0), c2 char(200), c3 int); create index i1_t1 on t1(c3); insert into t1 values(1,'Test',1); insert into t1 values(2,'Test 2',2); connect reset; connect to testdb2; create nickname remote_t1 for testdbl0."TESTUSER"."T1"; select * from remote_t1; connect reset; terminate;