任务调度EBSORACLE计划优化实践(ebs oracle计划)

任务调度:EBS ORACLE计划优化实践

在以企业资源计划(EBS)为代表的大型软件系统中,数据库作为其核心组成部分,在软件的正常运行和业务高效处理中有着至关重要的作用。而令人困扰的是,由于EBS中数据库的操作任务繁琐且复杂,因此企业在使用EBS时经常会遇到数据库性能瓶颈等问题。本文将围绕EBS ORACLE计划优化实践问题,提出解决问题的方法。

一、EBS ORACLE计划的概念

EBS ORACLE计划,简单来说是指在EBS环境中通过Oracle序列、定时任务等方式实现指定任务自动执行的一个机制。在EBS软件中,一些常规性的任务,比如检查用户会话、备份EBS系统等,这些工作都可以通过 EBS ORACLE计划进行自动执行。

二、EBS ORACLE计划的优化

在EBS使用中,为了保证系统的稳定和高效性,必须对EBS ORACLE计划进行优化。由于EBS系统中存在大量的数据库操作和计划任务,如果管理不当,可能会引起EBS突然卡死、任务超时等问题,给业务带来不小困扰。下面对于EBS ORACLE计划的优化问题提出以下建议:

(一)定期清理历史记录

在EBS系统中,随着时间的推移,计划任务的执行记录不断积累,若不及时清理,将会导致系统运行速度变慢,同时也占用大量磁盘空间。因此,建议定期清理历史记录,清理完毕后将会大大减轻数据库的负担,提高系统运行效率。请看下面Python代码实现:

“`python

#!/usr/bin/env python

# coding:utf-8

# python 清理ebs计划任务

import os

os.environ[‘NLS_LANG’] = ‘AMERICAN_AMERICA.AL32UTF8’

import cx_Oracle

import datetime

DB_HOST = ‘192.168.1.222’ # 数据库IP地址

DB_PORT = 1521 # 数据库端口

DB_SID = ‘ebs’ # 数据库实例名

DB_USER = ‘apps’ # 数据库用户名

DB_PWD = ‘password’ # 数据库密码

DB_CHARSET = ‘utf8’

# 表名:%_REQUEST_HISTORY

def clean_requests():

conn = cx_Oracle.connect(

‘{0}/{1}@{2}:{3}/{4}’.format(DB_USER, DB_PWD, DB_HOST, DB_PORT, DB_SID))

cursor = conn.cursor()

try:

nowtime = datetime.datetime.now()

starttime = (nowtime – datetime.timedelta(days=30)).date()

sql = “””delete %_request_history where request_date

cursor.execute(sql, startdate=starttime)

conn.commit()

except Exception as e:

conn.rollback()

rse e

finally:

cursor.close()

conn.close()

if __name__ == ‘__mn__’:

clean_requests()


此处为Python语言,利用cx_Oracle中的库和数据库连接就可以实现清理计划的历史记录。其余Python技术实现内容就不在此阐述。

(二)优化计划执行时间

在EBS系统中,任务链中的每一个任务都有其对应的计划时间,而这一计划时间对于业务节点完成时间的影响非常大。因此,在设计EBS ORACLE计划时,应注意将各个计划节点时间合理地分配,避免过多任务的同时执行,导致系统资源过度占用,从而影响业务处理的效率。

(三)避免重复执行

在EBS系统中,有些计划任务在短时间内触发了多次执行,如备份日志等,如果未妥善处理,这将极大增加EBS系统的运行负担,甚至极容易导致数据库死锁、卡死等故障。因此,针对这一问题,我们可以采用Python编程的方式,定时修改任务计划的执行时间,从而避免重复执行的问题。

下面是Python实现示例:

```python
#!/usr/bin/env python
# coding:utf-8
import os
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'
import cx_Oracle
import datetime
import time
DB_USER = 'apps'
DB_PWD = 'password'
DB_HOST = '192.168.1.222'
DB_PORT = 1521
DB_SID = 'ebs'

interval = 5 # 自动执行时间间隔,单位:分钟

def get_app_si(fc, task_name):
"""
获取所需管理信息
:param fc: 数据库连接游标
:param task_name: 所调度任务名
:return: 调度信息列表
"""
fc.prepare(r"SELECT application_name, deferred_to_date, request_id,"
r" request_date, request_time, real_start_date,"
r" real_start_time, actual_finish_date, actual_finish_time"
r" FROM fnd_conc_req_summary_v where concurrent_program_name=:name")
fc.execute(None, {"name": task_name})
res = []
fetch = fc.fetchone()
if fetch:
res = list(fetch)
return res

def delay_task(fc, task_name):
"""
延迟任务时间
:param fc: 数据库连接游标
:param task_name: 所调度任务名
"""
res = get_app_si(fc=fc, task_name=task_name)
if not res:
return
end_time = datetime.datetime.combine(res[3], res[4])
delay_time = end_time + datetime.timedelta(minutes=interval)
rq_id = res[2]
rq_start_date = delay_time.date().strftime("%Y-%m-%d")
rq_start_time = delay_time.time().strftime("%H:%M:%S")
# 格式化修改SQL
d_sql = "UPDATE FND_CONCURRENT_REQUESTS SET " \
"REQUESTED_START_DATE = TO_DATE('{sjrq}','YYYY-MM-DD'), " \
"REQUESTED_START_TIME = TO_DATE('{sjqj}','HH24:MI:SS')" \
"WHERE REQUEST_ID = {id}".format(sjrq=rq_start_date, sjqj=rq_start_time, id=rq_id)
# 执行修改
fc.execute(d_sql)
fc.connection.commit()
if __name__ == '__mn__':
while True:
conn = cx_Oracle.connect('{0}/{1}@{2}:{3}/{4}'.format(DB_USER, DB_PWD, DB_HOST, DB_PORT, DB_SID))
cursor = conn.cursor()
delay_task(fc=cursor, task_name='XXDRZHJD - 外网自有数据库每日数据备份')
cursor.close()
conn.close()
time.sleep(2 * 60)

Python代码中,我们采用了cursor游标方式连接数据库,连通后根据所调度任务名,查询出任务的相关信息,通过Python的时间对象,将其当前执行时间进行延迟(在原有执行时间的基础上加上一定时长),最后再通过数据库SQL语言,将这一改变提交到EBS系统中,从而实现计划任务延迟执行。

三、总结

本文旨在通过EBS ORACLE计划优化实践的介绍,强调数据库在EBS系统中扮演至关重要的角色,对EBS计划任务进行了介绍,针对任务自动执行过程中的性能优化问题提出解决方法。其中,针对历史记录的清理、计划执行时间的优化、避免重复执行的问题,我们提出了实际可行的优化方案,可以有效减轻数据库运行负担,提高系统的运行效率。


数据运维技术 » 任务调度EBSORACLE计划优化实践(ebs oracle计划)