【问题标题】:How do I script DB2 commands in z/OS?如何在 z/OS 中编写 DB2 命令脚本?
【发布时间】:2019-01-15 23:31:12
【问题描述】:

在中型系统(AS/400、IBM i 等)上使用 DB2 25 年后,我现在的任务是成为大型机 (z/OS) 上 DB2 的数据库管理员。对于这里的“新手问题”,我深表歉意,但我仍然对大型机有所了解。

目前,每天早上,我都会在“DB2 命令”屏幕中使用 DISPLAY 命令手动检查几个表空间的状态:

例如

Cmd 1       ===>       -DISPLAY DB(DN*) SPACENAM(*) USE LOCKS LIMIT(*)
Cmd 2       ===>       -DISPLAY DB(DP*) SPACENAM(*) USE LOCKS LIMIT(*)

这会在屏幕上显示几页输出,在每个屏幕满屏后暂停。如果有任何表空间处于无效状态,我可以做点什么。

最后,我想发出几个这样的 DISPLAY 语句,将输出定向到输出数据集。然后,我可以手动检查该数据集,也可以编写一个程序来解析输出数据集并报告(或修复)任何异常情况。

这对于所有大型机 DB2 DBA 来说可能非常容易,但是我如何编写这些命令的脚本呢?我使用 REXX 吗?如果有,怎么做?

感谢您的帮助!

戴夫

【问题讨论】:

    标签: db2 mainframe zos rexx db2-zos


    【解决方案1】:

    最简单的方法是将 TSO 终端控制程序下的命令作为批处理作业运行。

    这可能看起来像这样(省略工作卡):

     //*----------------------------------------------                 
     //DISDB    EXEC PGM=IKJEFT01,DYNAMNBR=20                          
     //*----------------------------------------------                 
     //STEPLIB   DD DISP=SHR,DSN=DB2.DSNLOAD                           
     //SYSPRINT DD SYSOUT=*                                            
     //SYSTSPRT DD DISP=SHR,DSN=YOUR.OUTPUT.DATASET                                            
     //SYSTSIN  DD *                                                   
       DSN SYSTEM(DBSYS)                                                
       -DISPLAY DB(DN*) SPACENAM(*) USE LOCKS LIMIT(*)                                                  
       -DISPLAY DB(DP*) SPACENAM(*) USE LOCKS LIMIT(*)                 
     //                                                                
    

    唯一的问题是SYSTSPRT 将包含您的输入命令、结果输出和一些其他杂乱的混合,但它基本上是零努力实现的。

    【讨论】:

      【解决方案2】:

      您说您手动DB2 命令 屏幕中发出命令。我认为在 z/OS 中,TSO 中有一个类似的菜单。在 TSO 中发出DB2I 命令,您应该会看到一个菜单,其中包含选项 7 DB2 命令。这是手动方式。

      如果您想批量运行一系列命令,即脚本化,请提交运行 DSN TSO 命令的作业。

      //jobname JOB ...
      //STEP01  EXEC PGM=IKJEFT01
      //SYSTSPRT DD SYSYOUT=*
      //SYSTSIN  DD *
       DSN SYSTEM(subsysid)
       -dis db(...) ....
      ... more commmands
      /*
      

      输出将被写入 DD SYSTSPRT。

      除非您想以编程方式解释命令的结果,否则无需编写 REXX 脚本。

      HTH

      【讨论】:

        【解决方案3】:

        一个非常基本的 REXX 解决方案:

        /* REXX*/                                                   
        DB2NAME = 'DSN'        /* <== change db2name here */                                     
        "DELSTACK"                                                  
        QUEUE "-DISPLAY DB(DN*) SPACENAM(*) USE LOCKS LIMIT(*)"  
        QUEUE "-DISPLAY DB(DP*) SPACENAM(*) USE LOCKS LIMIT(*)"
        QUEUE "END"                                                 
        X = OUTTRAP(IN.)                                            
        "DSN SYSTEM("!!DB2NAME!!")"                                 
        X = OUTTRAP(OFF)                                            
        DO I = 1 TO IN.0                                            
          SAY IN.I                                                  
        END                                                         
        

        【讨论】:

        • 谢谢,克劳德!对于我对大型机和 REXX 缺乏经验,我深表歉意,但我在这里做错了什么?未找到命令 DSN 提前致谢!戴夫
        • 嗨 Dave,您是否在 TSO 会话中运行了 REXX? JCL phunsoft 建议对您有用吗?它执行我建议在 REXX 中执行的相同 DSN 命令处理器。您也可以尝试从 ISPF 命令 shell 运行 DSN SYSTEM 命令,以检查一切是否设置正确。
        【解决方案4】:

        您可以编写 rexx 脚本来建立与 Db2 子系统的连接,然后执行相同的命令。让我找到示例并发送给您。这是您可以用来从 REXX ADDRESS DSNREXX 连接到 DB2 的命令连接''DB01'

        【讨论】:

          【解决方案5】:

          如果有用户更喜欢 unix shell,您可以通过 ssh 进入 unix 系统服务并使用命令行处理器和 db2 提供的存储过程。

          .profile sn -p 设置环境变量:

          # DB2 CLP
          export JAVA_HOME=/usr/lpp/java/java180/J8.0_64
          export CLASSPATH=$CLASSPATH:/usr/lpp/db2/db2c10/base/lib/clp.jar
          export JCCJAR=$JCCJAR:/usr/lpp/db2/db2c10/jdbc/classes
          export CLASSPATH=$CLASSPATH:$JCCJAR/db2jcc4.jar
          export CLASSPATH=$CLASSPATH:$JCCJAR/db2jcc_license_cisuz.jar
          export CLASSPATH=$CLASSPATH:$JCCJAR/db2jcc_license_cu.jar
          export PATH=$PATH:$JAVA_HOME:$JAVA_HOME/bin
          export CLPPROPERTIESFILE=~/clp.properties
          # alias to allow using shorter db2clp versis long path.
          alias  db2clp="/usr/lpp/java/java180/J8.0/bin/java com.ibm.db2.clp.db2"
          

          示例 clp.properties 文件。 注意 - 我使用哈希作为 SQL 终止字符。这允许我创建本地存储过程,在过程中使用分号作为行终止符,并使用哈希作为过程终止符代码。

          #Specify the value as ON/OFF or leave them blank
          DisplaySQLCA=ON
          AutoCommit=OFF
          InputFilename=
          OutputFilename=
          DisplayOutput=ON
          StopOnError=OFF
          TerminationChar=#
          Echo=ON
          StripHeaders=OFF
          MaxLinesFromSelect=ALL
          MaxColumnWidth=132
          IsolationLevel=UR
          

          text.sql 包含:

          CONNECT TO localhost:446/STLEC1
          CALL SYSPROC.ADMIN_COMMAND_DB2 ('-DISPLAY BPOOL(BP0)', 40, NULL, NULL,?, ?, ?, ?, ?, ?, ?, ?) #
          

          通过shell命令批量执行CLP:

          export IBM_DB_UID=your-userid-here
          export IBM_DB_PM=your-password-here
          db2clp -f text.sql -u $IBM_DB_UID/$IBM_DB_PWD
          

          您可以将结果分类到一个文件中,然后在输出上使用 python、node 或 unix 命令。

          有用的链接: 命令行处理器: https://www.ibm.com/support/knowledgecenter/en/SSEPEK_12.0.0/comref/src/tpc/db2z_commandlineprocessor.html

          随 Db2 提供的过程: https://www.ibm.com/support/knowledgecenter/en/SSEPEK_12.0.0/sqlref/src/tpc/db2z_suppliedstoredprocedures.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-04-08
            • 1970-01-01
            • 1970-01-01
            • 2021-06-12
            • 2021-04-02
            • 2016-11-22
            • 2023-03-21
            • 1970-01-01
            相关资源
            最近更新 更多