Oracle 10g sheduler Job如何备份和恢复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 10g sheduler Job如何备份和恢复相关的知识,希望对你有一定的参考价值。

假设源数据库中有个sheduler job:JOB_BAK_DATA,并在其中定期执行一个存储过程
我使用数据库备份命令:
exp user1/pwd1@dbname file=e:\dbBackup.dmp
并使用命令恢复到一个新的数据库中:
imp user2/pwd2@newDBName fromuser=user1 touser=user2 file=e:\dbBackup.dmp
成功导入。
但检查发现所有的用户对象都成功导入,可是所有的sheduler job都没有导入,也就是没有导入JOB_BAK_DATA这个job。
sheduler job应该如何备份和恢复?
我不想使用10g之前的dbms_job,因为dbms_job只能有编号不能命名,当数据库中job特别多时,要寻找一个目标job太费劲了。
而sheduler job可以命名。

参考技术A exp/imp不能导出SCHEDULER信息,
可以使用 expdb impdb追问

能再说的具体些吗?谢谢

如何停止 Oracle dbms_job

【中文标题】如何停止 Oracle dbms_job【英文标题】:How to stop Oracle dbms_job 【发布时间】:2016-12-06 07:22:23 【问题描述】:

我的 dbms_job 已经运行了将近三十天。

总时间不断增加,但我找不到正在运行的作业的任何信息。

当我执行“select * from dba_jobs;”的sql时,结果显示没有作业在运行。

我将它设置为损坏,但它不起作用。

如何安全地停止这个 dbms_job?

【问题讨论】:

您使用古老的 dbms_job 而不是 dbms_scheduler 有什么具体原因吗? dbms_scheduler 更易于维护、更易于使用并且总体而言更出色,恕我直言。 【参考方案1】:

DBA_JOBS 列出了在数据库中创建的所有作业。您可以使用DBA_JOBS_RUNNING 视图列出当前在实例中运行的所有作业。

当我执行“select * from dba_jobs;”的sql时,结果显示没有作业在运行。

这显示了使用DBMS_JOBS 包创建的所有作业。该作业可能是使用 DBMS_SCHEDULER 包创建的。

SQL> select job from user_jobs;

       JOB
----------
        99

我只使用名为99DBMS_JOBpackage 创建了一份工作。 其他是使用DBMS_SCHEDULERpackage 创建的,可以使用:

SQL> select job_name from user_scheduler_jobs;

根据文档-

停止工作

请注意,一旦作业启动并运行,就没有简单的方法来停止作业。

停止工作并不容易。

不知道您使用的是哪个版本的 Oracle 数据库。但是从 Oracle 10g 开始,您可以使用以下查询来列出计划的作业。

SQL>select * from all_scheduler_jobs;

ALL_SCHEDULER_JOBS

ALL_SCHEDULER_JOBS 显示有关当前用户可访问的调度程序作业的信息。More...

使用以下查询查找当前正在运行的作业。

SQL>select job_name, session_id, running_instance, elapsed_time, cpu_used
from user_scheduler_running_jobs;

然后停止-

SQL>EXEC DBMS_SCHEDULER.STOP_JOB (job_name => 'JOB_NAME');

【讨论】:

xxx_JOBSxxx_SCHEDULER_JOBS 是两个完全不同的野兽。前者已经存在多年,已经过时,后者是继任者。 如果优雅停止不起作用,您也可以尝试使用 force 参数立即停止它:EXEC DBMS_SCHEDULER.STOP_JOB (job_name => 'JOBNAME', force => TRUE);【参考方案2】:

没有终止会话,你运气不好。

来自Documentation:

请注意,一旦作业启动并运行,就没有简单的方法来停止作业。

这就是您不应再使用dbms_job 的众多原因之一。请改用dbms_scheduler

【讨论】:

其实我不知道为什么要使用dbms_job,它以前存在。我想知道为什么当我执行“select * from dba_jobs;”时我没有得到任何结果。我如何获得会话并杀死它? 作业是否存在于 DBA_JOBS_RUNNING 中?如果是,您可以从那里获取 SID。 不,该作业不在 DBA_JOBS_RUNNING 中。【参考方案3】:

在“select * from DBA_JOBS_RUNNNG”中签出 SID 那是会话ID 杀死该会话,并且它的更改将被回滚,因此如果批量更新已完成 90%,则中止可能需要“更多”时间而不是让它完成......

【讨论】:

以上是关于Oracle 10g sheduler Job如何备份和恢复的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 10g实现存储过程异步调用

ORACLE如何停止一个JOB

oracle10g没有行列转换函数的替代方法(转)

ORACLE的Job是不是有日志文件,如果有如何查看ORACLE 的Job的日志?

Oracle 10g中如何创建表

Oracle的自动维护任务