将大规模 Db2 z/OS 数据以文件形式传输到 Amazon S3 CSV - AWS Prescriptive Guidance

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

将大规模 Db2 z/OS 数据以文件形式传输到 Amazon S3 CSV

由 Bruno Sahinoglu (AWS)、Ivan Schuster () 和 Abhijit Kshirsagar (AWS) 创作 AWS

摘要

在许多企业中,大型机仍然是一个记录系统,它包含大量数据,包括含有当前和历史业务交易记录的主数据实体。它通常是孤立的,不容易从同一企业中的分布式系统访问。随着云技术的出现和大数据的民主化,企业有兴趣利用隐藏在大型机数据中的见解来开发新的业务能力。

为了实现这一目标,企业希望将其大型机 Db2 数据开放到他们的 Amazon Web Services (AWS) 云环境。业务原因有几个,传输方法因案例而异。您可能更喜欢将应用程序直接连接到大型机,或者您可能更喜欢近乎实时地复制数据。如果用例是为数据仓库或数据湖提供数据,那么拥有 up-to-date副本就不再是一个问题,此模式中描述的过程可能就足够了,尤其是在您想避免任何第三方产品许可成本的情况下。另一个用例可能是迁移项目的大型机数据传输。在迁移场景中,执行功能等效性测试需要数据。本文中描述的方法是将 Db2 数据传输到AWS云环境的一种经济实惠的方法。

由于亚马逊简单存储服务 (Amazon S3) Simple S3 是AWS集成度最高的服务之一,因此您可以使用AWS其他服务(例如亚马逊 Athena、Lambda 函数AWS或亚马逊)直接从那里访问数据并收集见解。 QuickSight 您也可以使用 AWS Glue 或数据库迁移AWS服务 () 将数据加载到亚马逊 Aurora 或亚马逊 DynamoDB。AWS DMS考虑到这一目标,本文描述了如何在大型机上以文件ASCII格式卸载 Db2 数据,然后将CSV文件传输到 Amazon S3。

为此,开发了大型机脚本来帮助生成作业控制语言 (JCLs),以便根据需要卸载和传输任意数量的 Db2 表。

先决条件和限制

先决条件

  • 有权运行重构扩展执行器 () REXX 和脚本的 IBM z/OS 操作系统用户。JCL

  • 访问 z/OS Unix 系统服务 (USS) 以生成SSH(安全外壳)私钥和公钥。

  • 一个可写的 S3 存储桶。有关更多信息,请参阅 Amazon S3 文档中的创建第一个 S3 存储桶

  • 支持 Tran AWS sfer SSH Family 文件传输协议 (SFTP) 的服务器,使用托管服务作为身份提供者,将 Amazon S3 用作AWS存储服务。有关更多信息,请参阅 SFTPTransfer Family 文档中的创建启用了AWS功能的服务器

限制

  • 这种方法不适用于近实时或实时的数据同步。

  • 只能将数据从 Db2 z/OS 移动到 Amazon S3,反之则不然。

架构

源技术堆栈

  • 在 z/OS 上运行 Db2 的大型机

目标技术堆栈

  • AWS Transfer Family

  • Amazon S3

  • Amazon Athena

  • Amazon QuickSight

  • AWS Glue

  • 亚马逊 Relational Database Service(亚马逊RDS)

  • Amazon Aurora

  • Amazon Redshift

源架构和目标架构

下图显示了生成、提取ASCIICSV格式的 Db2 z/OS 数据并将其传输到 S3 存储桶的过程。

Data flow from corporate data center to AWS Cloud, showing ETL process and analytics services.
  1. 从 Db2 目录中选择用于数据迁移的表列表。

  2. 该列表用于驱动具有外部格式的数字列和数据列的卸载作业的生成。

  3. 然后,使用 Transfer Family 将数据AWS传输到 Amazon S3。

  4. AWSGlue 提取、转换和 load (ETL) 任务可以转换数据并将其以指定格式加载到已处理的存储桶中,或者 AWS Glue 可以将数据直接输入数据库。

  5. Amazon Athena 和 A QuickSight mazon 可用于查询和呈现数据以推动分析。

下图是整个过程的逻辑流程。

Process flow diagram showing JCL TABNAME, table list, JCL REXXEXEC, and JCL decks steps.
  1. 第一个名为 JCLTABNAME,它将使用 Db2 实用程序提取DSNTIAUL并生成您计划从 Db2 卸载的表的列表。要选择表,必须手动调整SQL输入以选择并添加筛选条件以包含一个或多个 Db2 架构。

  2. 第二个名为 JCLREXXEXEC,将使用JCL骨架和提供的REXX程序来处理由创建的表列表JCLTABNAME并为JCL每个表名生成一个。每个步骤都包含一个卸载表的步骤和另一个使用SFTP协议JCL将文件发送到 S3 存储桶的步骤。

  3. 最后一步包括运行卸载表并将文件传输到。JCL AWS可以在本地或内部使用调度程序实现整个过程的自动化。AWS

工具

AWS 服务

  • Amazon Athena 是一项交互式查询服务,可帮助您使用标准直接分析亚马逊简单存储服务 (Amazon S3) 中的数据。SQL

  • Amazon Aurora 是一款完全托管的关系数据库引擎,专为云而构建,与 My SQL 和 Postgre SQL 兼容。

  • AWSGlu e 是一项完全托管的提取、转换和加载 (ETL) 服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。

  • Amazon QuickSight 是一项云规模的商业智能 (BI) 服务,可帮助您在单个控制面板中可视化、分析和报告数据。

  • Amazon Redshift 是一项托管的 PB 级云端数据仓库服务。AWS

  • Amazon Relational Database Service (AmazonRDS) 可帮助您在AWS云中设置、操作和扩展关系数据库。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

  • AWSTransfer F@@ amil y 是一项安全的传输服务,使您能够将文件传输到存储服务中或从AWS存储服务中传出。

大型机工具

  • SSH文件传输协议 (SFTP) 是一种安全的文件传输协议,允许远程登录服务器并在服务器之间传输文件。 SSH通过加密所有流量来提供安全性。

  • DSNTIAUL是提供的IBM用于卸载数据的示例程序。

  • DSNUTILB是提供的实用程序批处理程序IBM,用于卸载具有不同选项的数据DSNTIAUL。

  • z/OS Op SSH en 是在操作系统 z/OS 下的 Unix 系统服务上SSHIBM运行的开源软件端口。 SSH是在 TCP /IP 网络上运行的两台计算机之间的安全、加密的连接程序。它提供了多种实用程序,包括 ssh-keygen。

  • REXX(重构后的扩展执行器)脚本用于通过 Db2 卸载和步骤自动JCL生成。SFTP

代码

此模式的代码可在 GitHub unloadd b2 存储库中找到。

最佳实践

对于第一次卸载,生成的JCLs应该卸载整个表数据。

第一次完全卸载后,执行增量卸载以提高性能并节省成本。更新模板中的SQL查询以适应对卸JCL载过程的任何更改。

您可以手动转换架构,也可以在 Lambda 上使用脚本将 Db2 SYSPUNCH 作为输入。对于工业流程,AWSSchema Conversion Tool (SCT) 是首选选项。

最后,使用基于大型机的调度程序或在大型机上安装代理AWS的调度程序来帮助管理和自动化整个过程。

操作说明

任务描述所需技能

创建 S3 存储桶。

有关说明,请参阅创建第一个 S3 存储桶

将军 AWS
任务描述所需技能

创建SFTP启用了的服务器。

要在 Transfer F amily AWS 控制台上打开并创建SFTP服务器,请执行以下操作:

  1. 在 “选择协议” 页面上,选中 SFTP(SSH文件传输协议)-通过 Secure Shell 传输文件复选框。

  2. 对于身份提供者,请选择服务托管

  3. 对于端点,选择可公开访问

  4. 对于域,选择 Amazon S3

  5. 配置其他详细信息页面上,请保留默认设置。

  6. 创建服务器。

将军 AWS

为 Trans IAM fer Family 创建一个角色。

要为 Transfer Family 创建AWS身份和访问管理 (IAM) 角色以访问 Amazon S3,请按照创建IAM角色和策略中的说明进行操作。

AWS 管理员

添加 Amazon S3 服务托管用户。

要添加 Amazon S3 服务托管用户,请按照AWS文档中的说明进行操作,并使用您的大型机用户 ID。

将军 AWS
任务描述所需技能

创建密SSH钥。

在您的大型机USS环境下,运行以下命令。

ssh-keygen -t rsa
注意

当提示输入密码时,请将其留空。

大型机开发人员

为SSH文件夹和密钥文件提供正确的授权级别。

默认情况下,公有密钥和私有密钥将存储在用户目录 /u/home/username/.ssh 中。

您必须为密钥文件授权 644,对文件夹授权 700。

chmod 644 .ssh/id_rsa chmod 700 .ssh
大型机开发人员

将公有密钥内容复制到 Amazon S3 服务托管用户。

要复制USS生成的公钥内容,请打开 Transfer F amil AWS y 控制台

  1. 在导航窗格中,选择服务器

  2. 选择服务器 ID 列中的标识符以查看服务器详细信息

  3. 用户下方,选择一个用户名以查看用户详细信息

  4. 在 “SSH公钥” 下,选择 “添加SSH公钥”,将公钥添加到用户。对于SSH公钥,请输入您的公钥。在添加新用户之前,您的密钥已通过服务验证。

  5. 选择添加密钥

大型机开发人员
任务描述所需技能

生成范围内 Db2 表列表。

提供输入SQL以创建限定数据迁移范围的表的列表。此步骤要求您指定查询 Db2 目录表的选择标准。SYSIBM SYSTABLES使用 wher SQL e 子句。可以对过滤器进行自定义,使其包含以特定前缀开头或基于增量卸载的时间戳开头的特定架构或表名。输出是在大型机上的物理序列 (PS) 数据集中捕获的。该数据集将作为下一JCL生成阶段的输入。

在使用 JCLTABNAME(如有必要,可以对其进行重命名)之前,请进行以下更改:

  1. <Jobcard> 替换为作业类和有权运行 Db2 实用程序的用户。

  2. 替换 < HLQ1 > 或自定义输出数据集名称以符合您的网站标准。

  3. 根据您的网站标准更新PDSEs(分区数据集扩展)的STEPLIB堆栈。此模式中的示例使用IBM默认值。

  4. 将PLAN名称和LIB替换为特定于安装的值。

  5. 将 <Schema> 和 <Prefix> 替换为 Db2 目录的选择标准。

  6. 将结果保存JCL在PDS(分区数据集)库中。

  7. 提交JCL.

Db2 表列表提取作业

<Jobcard> //* //* UNLOAD ALL THE TABLE NAMES FOR A PARTICULAR SCHEMA //* //STEP01 EXEC PGM=IEFBR14 //* //DD1 DD DISP=(MOD,DELETE,DELETE), // UNIT=SYSDA, // SPACE=(1000,(1,1)), // DSN=<HLQ1>.DSN81210.TABLIST //* //DD2 DD DISP=(MOD,DELETE,DELETE), // UNIT=SYSDA, // SPACE=(1000,(1,1)), // DSN=<HLQ1>.DSN81210.SYSPUNCH //* //UNLOAD EXEC PGM=IKJEFT01,DYNAMNBR=20 //SYSTSPRT DD SYSOUT=* //STEPLIB DD DISP=SHR,DSN=DSNC10.DBCG.SDSNEXIT // DD DISP=SHR,DSN=DSNC10.SDSNLOAD // DD DISP=SHR,DSN=CEE.SCEERUN // DD DISP=SHR,DSN=DSNC10.DBCG.RUNLIB.LOAD //SYSTSIN DD * DSN SYSTEM(DBCG) RUN PROGRAM(DSNTIAUL) PLAN(DSNTIB12) PARMS('SQL') - LIB('DSNC10.DBCG.RUNLIB.LOAD') END //SYSPRINT DD SYSOUT=* //* //SYSUDUMP DD SYSOUT=* //* //SYSREC00 DD DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(32760,(1000,500)), // DSN=<HLQ1>.DSN81210.TABLIST //* //SYSPUNCH DD DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(32760,(1000,500)), // VOL=SER=SCR03,RECFM=FB,LRECL=120,BLKSIZE=12 // DSN=<HLQ1>.DSN81210.SYSPUNCH //* //SYSIN DD * SELECT CHAR(CREATOR), CHAR(NAME) FROM SYSIBM.SYSTABLES WHERE OWNER = '<Schema>' AND NAME LIKE '<Prefix>%' AND TYPE = 'T'; /*
大型机开发人员

修改JCL模板。

此模式提供的JCL模板包含通用作业卡和库名称。但是,对于数据集名称、库名称和作业卡,大多数大型机站点都有自己的命名标准。例如,可能需要特定的作业类才能运行 Db2 作业。Job Entry Subsystem 实现JES2并JES3可以施加其他更改。标准加载库的第一个限定符可能与IBM默认值不同。SYS1因此,在运行模板之前,请根据贵站点特定标准对其进行自定义。

在骨架中进行以下更改 JCLUNLDSKEL:

  1. 将作业卡修改为作业类和有权运行 Db2 实用程序的用户。

  2. 自定义输出数据集名称以符合贵站点标准。

  3. PDSEs根据您的网站标准更新STEPLIB堆栈。此模式中的示例使用IBM默认值。

  4. <DSN> 替换为 Db2 子系统名称和关联 ID。

  5. 将结果保存在作为ISPSLIB堆栈一部分的PDS库JCL中,该库是标准的骨架模板库。ISPF

卸载和骨架 SFTP JCL

//&USRPFX.U JOB (DB2UNLOAD),'JOB',CLASS=A,MSGCLASS=A, // TIME=1440,NOTIFY=&USRPFX //* DELETE DATASETS //STEP01 EXEC PGM=IEFBR14 //DD01 DD DISP=(MOD,DELETE,DELETE), // UNIT=SYSDA, // SPACE=(TRK,(1,1)), // DSN=&USRPFX..DB2.PUNCH.&JOBNAME //DD02 DD DISP=(MOD,DELETE,DELETE), // UNIT=SYSDA, // SPACE=(TRK,(1,1)), // DSN=&USRPFX..DB2.UNLOAD.&JOBNAME //* //* RUNNING DB2 EXTRACTION BATCH JOB FOR AWS DEMO //* //UNLD01 EXEC PGM=DSNUTILB,REGION=0M, // PARM='<DSN>,UNLOAD' //STEPLIB DD DISP=SHR,DSN=DSNC10.DBCG.SDSNEXIT // DD DISP=SHR,DSN=DSNC10.SDSNLOAD //SYSPRINT DD SYSOUT=* //UTPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSPUN01 DD DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(1,1),RLSE), // DSN=&USRPFX..DB2.PUNCH.&JOBNAME //SYSREC01 DD DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(10,50),RLSE), // DSN=&USRPFX..DB2.UNLOAD.&JOBNAME //SYSPRINT DD SYSOUT=* //SYSIN DD * UNLOAD DELIMITED COLDEL ',' FROM TABLE &TABNAME UNLDDN SYSREC01 PUNCHDDN SYSPUN01 SHRLEVEL CHANGE ISOLATION UR; /* //* //* FTP TO AMAZON S3 BACKED FTP SERVER IF UNLOAD WAS SUCCESSFUL //* //SFTP EXEC PGM=BPXBATCH,COND=(4,LE),REGION=0M //STDPARM DD * SH cp "//'&USRPFX..DB2.UNLOAD.&JOBNAME'" &TABNAME..csv; echo "ascii " >> uplcmd; echo "PUT &TABNAME..csv " >>>> uplcmd; sftp -b uplcmd -i .ssh/id_rsa &FTPUSER.@&FTPSITE; rm &TABNAME..csv; //SYSPRINT DD SYSOUT=* //STDOUT DD SYSOUT=* //STDENV DD * //STDERR DD SYSOUT=*

 

大型机开发人员

生成批量卸载JCL。

此步骤涉及使用在ISPF环境下运行REXX脚本JCL。提供在第一步中创建的范围内表的列表,作为对照TABLIST DD名称进行批量JCL生成的输入。JCL将在根据该名称指定的用户指定的分区数据集中为JCL每个表名生成一个新的分区数据集。ISPFILE DD事先分配这个库。每个新增JCL内容都将分为两个步骤:一个步骤将 Db2 表卸载到文件中,另一个步骤将文件发送到 S3 存储桶。

在中进行以下更改 JCLREXXEXEC(您可以更改名称):

  1. 替换 Job card user ID 为在表格上具有卸载权限的大型机用户 ID。替换 SYSPROCISPPLIBISPSLIBISPMLIBISPTLIB <HLQ1> 值或自定义 DSN,以满足贵站点标准。要找出特定于安装的值,请使用命令 TSO ISRDDN

  2. 替换 <MFUSER> 为在安装中具有作业运行权限的用户 ID。

  3. <FTPUSER>替换为安装中具有USS和FTP权限的用户 ID。假设此用户 ID 及其SSH安全密钥位于大型机上相应的 Unix 系统服务目录中。

  4. <AWS TransferFamily IP> Trans AWS fer Family IP 地址或域名替换。该地址将用于该SFTP步骤。

  5. JCL在申请现场标准住宿并按如下所述更新REXX计划后提交。

大众JCL生成工作

//RUNREXX JOB (CREATEJCL),'RUNS ISPF TABLIST',CLASS=A,MSGCLASS=A, // TIME=1440,NOTIFY=&SYSUID //* Most of the values required can be updated to your site specific //* values using the command 'TSO ISRDDN' in your ISPF session. //* Update all the lines tagged with //update marker to desired //* site specific values. //ISPF EXEC PGM=IKJEFT01,REGION=2048K,DYNAMNBR=25 //SYSPROC DD DISP=SHR,DSN=USER.Z23D.CLIST //SYSEXEC DD DISP=SHR,DSN=<HLQ1>.TEST.REXXLIB //ISPPLIB DD DISP=SHR,DSN=ISP.SISPPENU //ISPSLIB DD DISP=SHR,DSN=ISP.SISPSENU // DD DISP=SHR,DSN=<HLQ1>.TEST.ISPSLIB //ISPMLIB DD DSN=ISP.SISPMENU,DISP=SHR //ISPTLIB DD DDNAME=ISPTABL // DD DSN=ISP.SISPTENU,DISP=SHR //ISPTABL DD LIKE=ISP.SISPTENU,UNIT=VIO //ISPPROF DD LIKE=ISP.SISPTENU,UNIT=VIO //ISPLOG DD SYSOUT=*,RECFM=VA,LRECL=125 //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSDBOUT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSDBOUT DD SYSOUT=* //SYSHELP DD DSN=SYS1.HELP,DISP=SHR //SYSOUT DD SYSOUT=* //* Input list of tablenames //TABLIST DD DISP=SHR,DSN=<HLQ1>.DSN81210.TABLIST //* Output pds //ISPFILE DD DISP=SHR,DSN=<HLQ1>.TEST.JOBGEN //SYSTSIN DD * ISPSTART CMD(ZSTEPS <MFUSER> <FTPUSER> <AWS TransferFamily IP>) /*

在使用REXX脚本之前,请进行以下更改:

  1. 将REXX脚本保存在上一步JCLREXXEXEC编辑的SYSEXEC堆栈下定义的PDS库中,并以成员名称ZSTEPS为准。如果要对其进行重命名,则应更新JCL以满足您的需求。

  2. 此脚本使用跟踪选项打印其他信息,以防出现错误。相反,您可以在 EXECIOISPEXECTSO 语句之后添加错误处理代码,然后删除跟踪行。

  3. 此脚本使用 LODnnnnn 命名约定生成成员名称,命名约定最多可支持 10 万个成员。如果您有超过 10 万张表,请使用较短的前缀,然后调整 tempjob 语句中的数字。

ZSTEPSREXX脚本

/*REXX - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* 10/27/2021 - added new parms to accommodate ftp */ Trace "o" parse arg usrpfx ftpuser ftpsite Say "Start" Say "Ftpuser: " ftpuser "Ftpsite:" ftpsite Say "Reading table name list" "EXECIO * DISKR TABLIST (STEM LINE. FINIS" DO I = 1 TO LINE.0 Say I suffix = I Say LINE.i Parse var LINE.i schema table rest tabname = schema !! "." !! table Say tabname tempjob= "LOD" !! RIGHT("0000" !! i, 5) jobname=tempjob Say tempjob ADDRESS ISPEXEC "FTOPEN " ADDRESS ISPEXEC "FTINCL UNLDSKEL" /* member will be saved in ISPDSN library allocated in JCL */ ADDRESS ISPEXEC "FTCLOSE NAME("tempjob")" END ADDRESS TSO "FREE F(TABLIST) " ADDRESS TSO "FREE F(ISPFILE) " exit 0
大型机开发人员
任务描述所需技能

执行 Db2 卸载步骤。

JCL生成后,将有JCLs尽可能多的表需要卸载。

这个故事使用生JCL成的示例来解释结构和最重要的步骤。

您无需执行任何操作。以下信息仅供参考。如果您打算提交在上JCLs一步中生成的内容,请跳至提交LODnnnnnJCLs任务。

使用JCL带有IBM提供的 Db2 实用程序卸载 DSNUTILB Db2 数据时,必须确保卸载的数据不包含压缩的数字数据。为此,请使用DSNUTILBDELIMITED参数。

DELIMITED参数支持以CSV格式卸载数据,方法是添加一个字符作为文本字段的分隔符和双引号,删除VARCHAR列中的填充,并将EXTERNALFORMAT所有数值字段转换为(包括字段)。DATE

以下示例使用逗号字符作为分隔符,显示了生成的卸载步骤的JCL样子。

UNLOAD DELIMITED COLDEL ',' FROM TABLE SCHEMA_NAME.TBNAME UNLDDN SYSREC01 PUNCHDDN SYSPUN01 SHRLEVEL CHANGE ISOLATION UR;
大型机开发人员、系统工程师

执行该SFTP步骤。

要使用来自的SFTP协议JCL,请使用该BPXBATCH实用程序。 

该SFTP实用程序无法直接访问MVS数据集。你可以使用 copy 命令 (cp) 将顺序文件复制&USRPFX..DB2.UNLOAD.&JOBNAME到USS目录中,它就会变成这个目录&TABNAME..csv

使用私钥 (id_rsa) 并使用RACF用户 ID 作为连接到 Transfer Family IP 地址的用户名运行该sftpAWS命令。

SH cp "//'&USRPFX..DB2.UNLOAD.&JOBNAME'" &TABNAME..csv; echo "ascii " >> uplcmd; echo "PUT &TABNAME..csv " >>>> uplcmd; sftp -b uplcmd -i .ssh/id_rsa &FTPUSER.@&FTP_TF_SITE; rm &TABNAME..csv;
大型机开发人员、系统工程师

提交 LODnnnnnJCLs.

之前的JCL版本生成了所有需要卸载、转换为 S3 存储桶并传输到 S3 存储桶的LODnnnnnJCL表。CSV

对所有已生成的内容运行JCLs该submit命令。

大型机开发人员、系统工程师

相关资源

有关本文档中使用的不同工具和解决方案的更多信息,请参阅以下内容:

其他信息

在 Amazon S3 上获得 Db2 数据后,您可以通过多种方式获得新的见解。由于 Amazon S3 与AWS数据分析服务集成,因此您可以在分布式端自由使用或公开这些数据。例如,您可以执行以下操作:

在迁移用例中,由于您可以将任何数据从大型机传输到 S3,因此您可以执行以下操作:

  • 停用物理基础设施,使用 Amazon S3 Glacier 和 S3 Glacier Deep Archive 创建经济实惠的数据存档策略。 

  • 使用 Amazon S3 和其他AWS服务(例如 S3 Glacier 和 Amazon Elastic File System (AmazonEFS))构建可扩展、耐用、安全的备份和还原解决方案,以增强或取代现有的本地功能。