Oracle通过JOB定时执行存储过程实现两表数据比对

时间:2022-08-25 18:29:42

需求:

第三方云平台管理的虚拟机会进行关机、资源扩展等操作,因此开关机状态、CPU、内存、磁盘大小等数据需要进行同步。这里第三方云平台是BMC CLM云平台,底层虚拟化平台是Vcenter。进行同步的内容包括:PowerState,MemoryMB,NumCPU,HDNAME,CapacityKB,唯一键是Cluster,VMName,HDNAME

解决思路:

1 首先通过VMware vSphere PowerCLI工具每天抓取这些需要同步的数据

2 通过sqlload将数据放入BMC Cloud Lifecycle Management平台的oracle数据库中

3 在oracle数据库中建立存储过程,通过minus函数比对插入数据和已有数据的差异,并将差异结果放入一个表中。创建一个Oracle JOB每天执行这个存储过程。

4 差异结果已经找出,调用BMC内部接口只同步这几台机器即可,大大减少了数据量和工作负载

具体实现:

1 VMware vSphere PowerCLI每天抓取虚拟机配置信息

#脚本和上篇文章类似
Get-VM  | %{$_.HardDisks | Select @{N="Cluster";E={$_.Parent.VMHost.Parent}},@{N="VMName";E={$_.Parent.Name}},@{N="PowerState";E={$_.Parent.PowerState}},`
@{N="MemoryMB";E={$_.Parent.MemoryMB}},@{N="NumCPU";E={$_.Parent.NumCPU}},@{N="HDNAME";E={$_.Name}},CapacityKB}`
| Export-Csv -NoTypeInformation -encoding utf8 c:\VMInfo\"Export67VMConfig$(Get-Date -Format 'yyyyMMdd').csv"

2 通过sqlload将数据放入BMC Cloud Lifecycle Management平台的oracle数据库中

具体sqlload方法参看前面文章

3 Oracle定期比对

这里注意minus函数的使用,这个函数比对全部字段,任意一个字段不同,都会视为差异

说明:下面sql语句中 表VM_Config_Dayly是每天插入的全部数据的表,表VM_Config_Update_Dayly是差异数据存放的表

3.1 首先创建比对作业的存储过程

create or replace procedure sp_update_vmdata
as
BEGIN
  delete from VM_Config_Update_Dayly;   --插入前清空历史数据
commit;
insert into VM_Config_Update_Dayly        --插入下面查询出的数据
  (uuid,
   CLUSTER1,
   VMNAME,
   POWERSTATE,
   MEMORYMB,
   NUMCPU,
   HDNAME,
   CAPACITYKB)
  select con.uuid,                        --查询差异数据的准确值
         con.CLUSTER1,
         con.VMNAME,
         con.POWERSTATE,
         con.MEMORYMB,
         con.NUMCPU,
         con.HDNAME,
         con.CAPACITYKB
    from VM_Config_Dayly con,
         (select cl.shortdescription CLUSTER1, --把差异数据取出来
                 co.name VMNAME,
                 (case co.state
                   when 'Running' then
                    'PoweredOn'
                   else
                    'PoweredOff'
                 end) as POWERSTATE,
                 co.totalphysicalmemory MEMORYMB,
                 co.cloudtotalcpu NUMCPU,
                 lo.name HDNAME,
                 lo.blocksize  CapacitiyKB
            from BMC_CORE_BMC_COMPUTERSYSTEM co,
                 BMC_CORE_BMC_DEPENDENCY     de,
                 BMC_CORE_BMC_CLUSTER        cl,
                 BMC_CORE_BMC_LOGICALDISK    lo,
                 BMC_CORE_BMC_COMPONENT      cp
           where co.instanceid = de.destination_instanceid
             and de.source_instanceid = cl.instanceid
             and de.source_classid = 'BMC_CLUSTER'

             and co.instanceid = cp.source_instanceid
             and cp.destination_instanceid = lo.instanceid
             and cp.destination_classid = 'BMC_LOGICALDISK'

             and co.cloudclass = 'virtualguest'
          MINUS
          select CLUSTER1,
                 VMNAME,
                 POWERSTATE,
                 MEMORYMB,
                 NUMCPU,
                 HDNAME,
                 CAPACITYKB
            from VM_Config_Dayly t) diff
   where con.CLUSTER1 = diff.CLUSTER1
     and con.vmname = diff.vmname
     and con.hdname = diff.hdname;
commit;
end sp_update_vmdata;

3.2 创建JOB定期执行存储上面的存储过程

declare  job_update_vmdata number;
begin
用户.dbms_job.submit(job_update_vmdata,),'trunc(sysdate+1)+9/24');
commit;
end;
--注意上面的用户默认是sys,但不写也可以,我老是报错就栽倒在这了

4 差异结果同步

目前BMC还不支持同步功能的自动调用,但可以手动触发同步功能,如下图点击

Oracle通过JOB定时执行存储过程实现两表数据比对

oracle 构造列和默认列值  可以如下

select sysdate,1 t from dual

select sysdate,'value' Header from dual

参考

Oracle PL/SQL比较两个字段是否一样

ORACLE通过JOB定时执行存储过程

oracle 两表数据对比---minus

Oracle job procedure 存储过程定时任务

Oracle通过JOB定时执行存储过程实现两表数据比对的更多相关文章

  1. 创建JOB定时执行存储过程

    创建JOB定时执行存储过程有两种方式 方式1:通过plsql手动配置job,如下图: 方式2:通过sql语句,如下sql declare job_OpAutoDta pls_integer;--声明一 ...

  2. Oracle定时执行存储过程(转)

    定时执行存储过程在平时开发中经常会用到,年前的时候自己也做了一个,由于时间关系一直没能记录,现记录下来.       首先用一个完整的例子来实现定时执行存储过程. 任务目标:每小时向test表中插入一 ...

  3. oracle job 定时执行 存储过程

    oracle job 定时执行 存储过程   一:简单测试job的创建过程案例: 1,先创建一张JOB_TEST表,字段为a 日期格式 SQL> create table JOB_TEST(a ...

  4. [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; selec ...

  5. oracle job有定时执行功能

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务.   oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的 ...

  6. 0327定时执行--存储过程--dbms_job--dbms_scheduler.create_job

    --oracle job 定时执行 存储过程 --建一张测试表 create table Person( name ), sex ) ); / --创建测试的存储过程 create or replac ...

  7. ORACLE 定时执行存储过程

    推荐用dbms_scheduler方式更好 (2012-11-19注) /* 查询: select job,broken,what,interval,t.* from user_jobs t; job ...

  8. oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。

    来源于:http://www.cnblogs.com/wangfg/p/5110831.html 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; s ...

  9. Oracle定时执行存储过程

    首先查看 SQL> show parameter job NAME                                 TYPE        VALUE-------------- ...

随机推荐

  1. [转]如何设置eclipse中js默认打开为java Editor

    打开window-preference -> General-Editors-File Associator 看到右边的.js下边就是设置默认打开方式了 转自百度知道:http://zhidao ...

  2. CentOS 6.5升级Python和安装IPython(亲测可用)

    python的升级(2.6------>2.7.x) 如下地址:http://note.youdao.com/share/?id=2928aeda020123bfdf2a2c76bc75e4a7 ...

  3. 【poj3237】 Tree

    http://poj.org/problem?id=3237 (题目链接) 树链剖分模板题,然而这150+行的程序我调了一天,历经艰辛,终于ac.. 题意 给出一个n个节点的带权树,要求维护操作:1. ...

  4. java.util.ConcurrentModificationException 解决办法(转)

    今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码:   public cla ...

  5. .NET中的三种Timer的区别和用法(转)

      最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是: //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗 ...

  6. Nginx学习之配置RTMP模块搭建推流服务

    写在开始 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求. ...

  7. 深入理解java虚拟机之垃圾收集器

    Java一个重要的优势就是通过垃圾管理器GC (Garbage Collection)自动管理和回收内存,程序员无需通过调用方法来释放内存.也因此很好多的程序员可能会认为Java程序不会出现内存泄漏的 ...

  8. windows 分页缓冲池 非分页缓冲池

    最近在windows server 2012机器上在做性能测试时,发现8G物理内存,内存使用率占到了90%多,在“进程”列表中所有进程内存相加才2个多G,同时任务管理器->“性能”标签一项中,非 ...

  9. C# 哈希表HashTable的简单使用

    本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...

  10. FOR XML PATH做为数据表中单列或者多列的字符串拼接的方法,放到一列中去,很好用。

    先看看自己弄得例子,SELECT sName+',',hoppy+','  FROM student2 where hoppy='游泳' FOR XML PATH('')--PATH后面跟的是行标题, ...