本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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 系列產品之間設定同質聯合:
-
適用於 Linux、UNIX、Windows (LUW) 的 Db2
-
Db2 iSeries
-
適用於 z/OS 的 Db2
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 資料庫的類型,選擇下列其中一種方法:
-
適用於 Linux、UNIX 和 Windows (LUX) 資料庫的 Db2 – 執行下列 SQL 命令。在下列範例中,將
server_name取代為您要用於聯合的伺服器名稱。將db2_version取代為您遠端 Db2 資料庫的版本。將username和password取代為您要連線之遠端 Db2 資料庫的憑證。將db_name、dns_name和port取代為您要連線之遠端 Db2 資料庫的適當值。create wrapper drda options(DB2_FENCED 'N'); create serverserver_nametype 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 包裝函式和包裝函式程式庫檔案的名稱。將 server_name取代為您要用於聯合的伺服器名稱。將db2_version取代為您遠端 Db2 資料庫的版本。將username和password取代為您要連線之遠端 Db2 資料庫的憑證。將dns_name、port和db_name取代為您要連線之遠端 Db2 資料庫的適當值。create wrapperwrapper_namelibrary 'library name' options(DB2_FENCED 'N'); create serverserver_nametype db2/mvs versiondb2_versionwrapperwrapper_nameauthorization "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 包裝函式和包裝函式程式庫檔案的名稱。將 server_name取代為您要用於聯合的伺服器名稱。將db2_version取代為您遠端 Db2 資料庫的版本。將username和password取代為您要連線之遠端 Db2 資料庫的憑證。將dns_name、port和db_name取代為您要連線之遠端 Db2 資料庫的適當值。create wrapperwrapper_namelibrary 'library_name' options(DB2_FENCED 'N'); create serverserver_nametype db2/mvs versiondb2_versionwrapperwrapper_nameauthorization "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 serverserver_nameoptions (REMOTE_AUTHID 'username', REMOTE_PASSWORD 'password');
如需詳細資訊,請參閱 IBM Db2 文件中的使用者映射
步驟 3:檢查連線
檢查連線,確認已成功設定您的聯合。開啟工作階段,使用 SET PASSTHRU 命令將原生 SQL 命令傳送至遠端資料來源,然後在遠端資料伺服器上建立資料表。
-
開啟並關閉工作階段,將 SQL 提交至資料來源。在下列範例中,將
server_name取代為您在步驟 1 中為聯合建立的伺服器之名稱。set passthruserver_name; -
建立新的資料表。在下列範例中,將
column_name、data_type和value取代為資料表的適當項目。create tabletable_name(column_namedata_type(value),column_namedata_type(value);如需詳細資訊,請參閱 IBM Db2 文件中的 CREATE TABLE 陳述式
。 -
建立索引、將資料列的值插入資料表,然後重設連線。重設連線會捨棄連線,但會保留後端程序。在下列範例中,將
index_name、table_name、Column_name和columnx_value取代為您的資訊。create indexindex_nameontable_name(column_name); insert intotable_namevalues(column1_value,column2_value,column3_value); insert intotable_namevalues(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 todatabase_name; create nicknamenicknameforserver_name."username"."table_name"; selectsql_commandfromnickname; 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 支援網站上的 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 選項。 -
您必須允許從 RDS for Db2 主機資料庫到遠端主機資料庫的傳入和傳出流量。如需詳細資訊,請參閱建立安全群組以存取在您的 VPC 中您的資料庫執行個體。
如需有關聯合到 Oracle 的資訊,請參閱 IBM 支援網站上的如何使用 Db2 聯合和 ODBC 驅動程式查詢 Oracle?
如需支援聯合的資料來源詳細資訊,請參閱 IBM 支援網站上的 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 serverserver_nametypewrapper_typeversiondb_versionoptions (HOST 'dns_name', PORT 'port', SERVICE_NAME 'service_name')“
如需包裝函式類型的資訊,請參閱 IBM 支援網站上的 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 serverserver_nameoptions (REMOTE_AUTHID 'username', REMOTE_PASSWORD 'password');
如需詳細資訊,請參閱 IBM Db2 文件中的使用者映射
步驟 4:檢查連線
檢查連線,確認已成功設定您的聯合。開啟工作階段,使用 SET PASSTHRU 命令將原生 SQL 命令傳送至遠端資料來源,然後在遠端資料伺服器上建立資料表。
-
開啟並關閉工作階段,將 SQL 提交至資料來源。在下列範例中,將
server_name取代為您在步驟 2 中為聯合所建立伺服器的名稱。set passthruserver_name; -
建立新的資料表。在下列範例中,將
column_name、data_type和value取代為資料表的適當項目。create tabletable_name(column_namedata_type(value),column_namedata_type(value);如需詳細資訊,請參閱 IBM Db2 文件中的 CREATE TABLE 陳述式
。 -
建立索引、將資料列的值插入資料表,然後重設連線。重設連線會捨棄連線,但會保留後端程序。在下列範例中,將
index_name、table_name、Column_name和columnx_value取代為您的資訊。create indexindex_nameontable_name(column_name); insert intotable_namevalues(column1_value,column2_value,column3_value); insert intotable_namevalues(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 todatabase_name; create nicknamenicknameforserver_name."username"."table_name"; selectsql_commandfromnickname; 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;