Category Archives: oracle

oracle job定时,启动,停止,察看状态。运行脚本

job里面的last_date和next_date,以及interval之间是什么关系,last_date到底是记的job的开始执行时间,还是执行结束的时间。next_date到底是job的开始时间还是结束时间加上interval得出的呢?
如果一个Job的执行时间比较长(比如超过了interval),会不会出现多个同样的job同时执行呢?
last_date=开始时间last_date+interval=next_date
但要清楚,next_date通常不是真正的开始时间,真正的开始时间往往比next_date晚几秒,也就是延时。
1job的next time是在job开始执行的时候就算好了不过是在job成功执行之后才写上去当job的执行时间超过interval时候也就是说在job的执行过程中nexttime就已经过了那么nexttime就变为job执行完时的时间2SQL> exec dbms_job.broken(21,true);
PL/SQL过程被成功完成
SQL> select * from user_jobs;
SQL> exec dbms_job.run(21);
PL/SQL过程被成功完成
SQL> select * from user_jobs;
试写一计划任务:
declare
v_job number :=1;
begin
dbms_job.submit(v_job,’sp_fact_charge_code;’,sysdate,’sysdate+1/1440′);
commit;
end;
/
解释一下上面的程序
程序主体有四个参数,分别意为:v_job是计划任务号,’sp_fact_charge_code’是计划任务名,如果是多个计划任务,就都用分号隔开,第三个sysdate意为立即执行此任务,第四个参数是间隔时间的设置,此处为每分钟执行一次,1/1440=1/24/60。
查看任务:select * from user_jobs;select * from all_jobs;
查看正在运行的任务(不推荐使用,速度慢):select * from dba_jobs_running;
另外值得一提的是,在安装oracle配置的时候,有这么一个参数:
job_queue_processes=4  (默认4)
这个参数是定义当前最多可同时运行几个job,它的最大值能设置为36。
除了submit参数外,其余的几个参数有:
        dbms_job.run(v_job);         //运行job
        dbms_job.broken(v_job,true,next_date);        //停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。
        dbms_job.remove(v_job);        //删除某个job
        dbms_job.what(v_job,’sp_fact_charge_code;’);        //修改某个job名
        dbms_job.next_date(v_job,sysdate);       修改下一次运行时间
例题,设定每天2:10:10运行
trunc(sysdate)+2/24+10/24/60+10/24/60/60        //运行时间
trunc(sysdate)+1+2/24+10/24/60+10/24/60/60        //间隔运行时间
例题,设定每月2号的2:10:10运行
trunc(sysdate,’mm’)+1+2/24+10/24/60+10/24/60/60        //运行时间
trunc(add_mouths(sysdate,1),’mm’)+1+2/24+10/24/60+10/24/60/60           //间隔运行时间
例题,设定每个季度……
trunce(sysdate,’Q’)+1+2/24+10/24/60+10/24/60/60         //运行时间
trunce(add_mouths(sysdate,3),’Q’))+1+2/24+10/24/60+10/24/60/60         //间隔运行时间
另外年为‘Y;
例题,设定每周一……
next_day(sysdate’星期一‘)

Oracle备份与恢复案例

一. 理解什么是数据库恢复
   当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过程大致可以分为复原(Restore)与恢复(Recover)过程。
 
数据库恢复可以分为以下两类:
 
1.1实例故障的一致性恢复

当实例意外地(如掉电、后台进程故障等)或预料地(发出SHUTDOUM ABORT语句)中止时出现实例故障,此时需要实例恢复。实例恢复将数据库恢复到故障之前的事务一致状态。如果在在线后备发现实例故障,则需介质恢复。在其它情况Oracle在下次数据库起动时(对新实例装配和打开),自动地执行实例恢复。如果需要,从装配状态变为打开状态,自动地激发实例恢复,由下列处理:

(1) 为了解恢复数据文件中没有记录的数据,进行向前滚。该数据记录在在线日志,
包括对回滚段的内容恢复。
(2) 回滚未提交的事务,按步1重新生成回滚段所指定的操作。
(3) 释放在故障时正在处理事务所持有的资源。
(4) 解决在故障时正经历一阶段提交的任何悬而未决的分布事务。

1.2介质故障或文件错误的不一致恢复

介质故障是当一个文件、一个文件的部分或磁盘不能读或不能写时出现的故障。文件错误一般指意外的错误导致文件被删除或意外事故导致文件的不一致。这种状态下的数据库都是不一致的,需要DBA手工来进行数据库的恢复,这种恢复有两种形式,决定于数据库运行的归档方式和备份方式。
 
(1) 完全介质恢复可恢复全部丢失的修改。一般情况下需要有数据库的备份且数据库运行在归档状态下并且有可用归档日志时才可能。对于不同类型的错误,有不同类型的完全恢复可使用,其决定于毁坏文件和数据库的可用性。
 
(2) 不完全介质恢复是在完全介质恢复不可能或不要求时进行的介质恢复。重构受损的数据库,使其恢复介质故障前或用户出错之前的一个事务一致性状态。不完全介质恢复有不同类型的使用,决定于需要不完全介质恢复的情况,有下列类型:基于撤消、基于时间和基于修改的不完全恢复。

基于撤消(CANCEL)恢复:在某种情况,不完全介质恢复必须被控制,DBA可撤消在指定点的操作。基于撤消的恢复地在一个或多个日志组(在线的或归档的)已被介质故障所破坏,不能用于恢复过程时使用,所以介质恢复必须控制,以致在使用最近的、未损的日志组于数据文件后中止恢复操作。
 
基于时间(TIME)和基于修改(SCN)的恢复:如果DBA希望恢复到过去的某个指定点,是一种理想的不完全介质恢复,一般发生在恢复到某个特定操作之前,恢复到如意外删除某个数据表之前。
 
第二章. 数据库恢复案例测试环境

2.1 数据库环境
以下的所有案例都是通过测试经过,环境为:
  OS:Windows 2000 Server
  DB:Oracle 816
  DBNAME:TEST

数据文件:
SQL> select file#,status,enabled,name from v$datafile;
 
    FILE# STATUS  ENABLED      NAME
—————————————————————-
         1 SYSTEM  READ WRITE D:\Oracle\ORADATA\TEST\SYSTEM01.DBF
         2 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\RBS01.DBF
         3 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\USERS01.DBF
         4 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\TEMP01.DBF
         5 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\TOOLS01.DBF
         6 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\INDX01.DBF

控制文件:
SQL> select * from v$controlfile;
 
STATUS  NAME
———————————————————————
        D:\Oracle\ORADATA\TEST\CONTROL01.CTL
        D:\Oracle\ORADATA\TEST\CONTROL02.CTL
        D:\Oracle\ORADATA\TEST\CONTROL03.CTL

联机日志:
SQL> select * from v$logfile;
 
    GROUP# STATUS      MEMBER
———————————————————————
      1     STALE      D:\Oracle\ORADATA\TEST\REDO01.LOG
      2               D:\Oracle\ORADATA\TEST\REDO02.LOG
      3     STALE      D:\Oracle\ORADATA\TEST\REDO03.LOG
 
2.2 数据库备份脚本
冷备份脚本:
rem     script:coldbak.sql
rem     creater:chenjiping
rem     date:5.8.2003
rem     desc:offline full backup database
 
–connect database
connect internal/password;
–shutdown database
shutdown immediate;
–Copy Data file
!xcopy d:\Oracle\oradata\test\*.dbf d:\database/H/R;
–Copy Control [...]

oracle 10.2.0.4 EM的一个bug(EM对于用rman删除归档日志后不敏感)

1:访问EM
2:由于在运行大数据量操作时,db_recovery_file_dest目录被急剧增加的归档占满,em报出archiver在归档日志的时候出错
3:用rmam,delete noprompt archivelog all;(说明测试数据库所以归档日志不重要可以删除)
3:继续访问EM,无法成功,报错信息如下
Enterprise Manager is not able to connect to the database instance. The state of the components are listed below. 
Status Open But Unavailable 
Host localhost.localdomain 
Port 1521 
SID test 
Oracle Home /oracle/product/10.2.0/db_1 
Details Archiver is unable to archive a redo log because the output device is full or unavailable. 
The instance is open.
还提示是否需要进行实例恢复
4:原以为真是数据库实例出了问题,重新sqlplus 访问并检查数据状态,发现是正常的
5:只好重启一下em了,emctl stop dbconsole然后emctl start dbconsole以后,访问em的地址就正常了
6:看来em这块功能还是有些不够完好。