飘逸的Groovy,利用Groovy+windows执行计划 实现动态RunstatusDb2数据库

阅读更多

端午三天假,学习了JRuby,Groovy.最后还是觉得Groovy比较容易上手。用Groovy有点当年写basic的感觉,不再有java那样那么多条条框框。开发的时候更多的是在用代码描述自己的执行逻辑,而不是为了实现某种逻辑功能去编写大量符合java"定式"的类。

Groovy给我的感觉就2个字"飘逸",在编码方面很多地方java工作量是非常繁琐而Groovy封装的相当成功,或许AOP的精华也就在此。

每个月我要对DB2数据库进行Runstatus操作,要备份语句,上传语句到目的机器,并执行。每个月如此,只是每个月要执行的语句会变化,因为表也在不断变化中。这部分工作很机械,以前就像过写一个什么东西自动化一把。可惜没做.... 刚好学了Groovy就用它实现吧

下面贴出Groovy程序 DB2Runstatus.groovy

import groovy.sql.Sql

import java.text.SimpleDateFormat 

import telnet.TelnetSample



//实现生成脚本文件

def user="用户名"

def pass="密码"

def schema=this.args[0]

def bartDateFormat = new SimpleDateFormat("yyyy-MMMM-dd-EEEE"); 

def filePath="D:/数据库维护/Runstats/" //这个目录要事先建立好

def fileDir=filePath+bartDateFormat.format(new Date())

def fileName=fileDir+"/"+"${schema}.sql"

def linesp="\n"



def fileObjectDir=new File(fileDir)

//没有目录先创建目录

if(!fileObjectDir.exists())

    fileObjectDir.mkdir()

def sql = Sql.newInstance("jdbc:db2://10.154.144.38:50000/hndpdb", "${user}",

"${pass}", "com.ibm.db2.jcc.DB2Driver")

file1 =new  File(fileName)

//先删除已经存在的文件

if(file1.exists())

    file1.delete()

sql.eachRow("select Rtrim(TABSCHEMA)||'.'||TABNAME AS TABLE from syscat.tables where TABSCHEMA='${schema}'", 

{ 

    file1 << " RUNSTATS ON TABLE ${it.TABLE} ON KEY COLUMNS WITH DISTRIBUTION ON ALL COLUMNS AND SAMPLED DETAILED INDEXES ALL  ALLOW WRITE ACCESS ${linesp}"

    file1 << " REORG TABLE  ${it.TABLE} ALLOW READ ACCESS ${linesp}"

    file1 << " REORG INDEXES ALL FOR  TABLE  ${it.TABLE}  ALLOW READ ACCESS ${linesp}"

    file1 << " RUNSTATS ON TABLE ${it.TABLE} ON KEY COLUMNS WITH DISTRIBUTION ON ALL COLUMNS AND SAMPLED DETAILED INDEXES ALL  ALLOW WRITE ACCESS ${linesp}"

}

)

sql.close()

//上传脚本文件

def ftpName=fileDir+"/"+"${schema}.ftp"

ftpFile=new File(ftpName)

//先删除已经存在的文件

if(ftpFile.exists())

    ftpFile.delete()

//生成ftp脚本

ftpFile <<"""open 10.154.144.40

${user}

${pass}

cd deep/tmp

prompt

delete ${schema}.sql

put ${fileName}

bye

"""

//执行脚本

def command = "ftp -s:${ftpName}"

def proc = command.execute()                

proc.waitFor()                              

println "输出: ${proc.in.text}"

println "错误信息: ${proc.err.text}"



//远程端执行sql

TelnetSample telnet = new TelnetSample( "10.154.144.40", 

                         "${user}", 

                         "${pass}")

 telnet.sendCommand( "cd deep/tmp" );

  telnet.sendCommand( "db2 connect to hndpdb user ${user} using ${pass}" );

 telnet.sendCommand( "nohup db2 -vf ${schema}.sql &" );



短短60行的代码就实现了从备份到FTP再执行的任务,HOHO~ 执行的方式也很简单,再CLI模式下 groovy DB2Runstatus.groovy [表模式名] 假设我要执行ODS层的runstatus==> groovy DB2Runstatus.groovy ODS

这样在D:/数据库维护/Runstats/ 目录下 会生成一个当前日期的文件夹,文件夹下会生成一个 ODS.sql 文件和 ODS.ftp文件 分别上 执行语句和FTP语句再执行完之后就会自动 telnet 到目标机器 用Nohup挂载 执行( 这里我登陆的是 AIX 所以用nohup 其他的系统自己参考)

然后把完整的调用方式 写成一个bat文件 run.bat

groovy DB2Runstatus.groovy ODS 



groovy DB2Runstatus.groovy DW 



groovy DB2Runstatus.groovy WI 

再配置到windows执行计划里面去 就OK了

执行groovy的环境必须 JDK >=1.5 并且配置好 环境变量%GRROVY_HOME%

你可能感兴趣的:(Groovy,Windows,SQL,DB2,AIX)