我要在oracle 10g创建一个job,每天凌晨9点执行一个过程,过程名假定为 pro_1001 谢谢指点
在sql developer的jobs下右键菜单新建比较简单。
10年积累的做网站、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有天津免费网站建设让你可以放心的选择与我们合作。
介绍几个数据字典视图:
dba_jobs 本数据库定义到任务队列的任务
dba_jobs_running 目前正在运行的任务
user_jobs 当前用户拥有的任务
时间间隔 参数interval 设置
每天运行一次 'sysdate+1'
每小时运行一次 'sysdate+1/24'
每10分钟运行一次 'sysdate+10/(24*60)'
每30秒运行一次 'sysdate+30/(24*60*60)'
每星期一次 'sysdate+7'
不再运行该任务并删除它 null
以上时间间隔不能保证任务的下一次运行在一个特定的时间,仅仅能够指定一个任务两次运行之间的时间间隔
特定日期或时间的例子
每天午夜12点 'trunc(sysdate+1)'
每天早上8点30分 'trunc(sysdate+1)+(8*60+30)/(24*60)'
每星期二中午12点 'next_day(trunc(sysdate),"tuesday"+12/24)'
每个月第一天的午夜12点 'trunc(last_day(sysdate)+1)'
在总结之前,先把Job的参数一一说明一下:
job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作;
what参数是将被执行的PL/SQL代码块;
next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值,默认值是:“4000-1-1”;
interval参数何时这个工作将被重执行。
其中Interval这个值是决定Job何时,被重新执行的关键。
附上自己写的两个例子:
--每天凌晨一点执行
DECLARE
X NUMBER;
BEGIN
sys.dbms_job.submit(job = X,
what = 'begin pro_job_test.pro_job_day; end;',
next_date =to_date('13-07-2011 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval = ' TRUNC(SYSDATE+1)+1/24 ');
SYS.DBMS_OUTPUT.PUT_LINE( 'Job Number is: ' || to_char(x));
commit;
END;
--每月1日执行
DECLARE
X NUMBER;
BEGIN
sys.dbms_job.submit(job = X,
what = 'begin pro_job_test.pro_job_month; end;',
next_date =to_date('01-08-2011 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval = 'trunc(last_day(sysdate)+1)');
SYS.DBMS_OUTPUT.PUT_LINE( 'Job Number is: ' || to_char(x));
commit;
END;
oracle aq队列 能实现并行吗?创建两个队列也不能实现
并行概念
并行执行(parallel execution)是Oracle企业版才有的特性(标准版中没有这个特性),指能够将一个大型串行任务(任何DML,或者一般的DDL)物理地划分为多个较小的部分,这些较小的部分可以同时得到处理。
并行包括:
并行查询:这是指能使用多个操作系统进程或线程来执行一个查询。Oracle会发现能并行执行的操作(如全表扫描或大规模排序),并创建一个查询计划来实现)。
并行DML(PDML):这在本质上与并行查询很相似,但是PDML主要是使用并行处理来执行修改(INSERT、UPDATE、DELETE和MERGE)。
并行DDL:并行DDL是指Oracle能并行地执行大规模的DDL操作。例如,索引重建、创建一个新索引、数据加载以及大表的重组等都可以使用并行处理。
并行恢复:这是指数据库能并行地执行实例(甚至介质)恢复,以减少从故障恢复所需的时间。
过程并行化:这是指能并行地运行所开发的代码。
何时使用并行
在应用并行执行之前,需要保证以下两点成立:
必须有一个非常大的任务,如对50GB数据进行全面扫描。
必须有足够的可用资源(CPU、I/O、内存)。在并行全面扫描50GB数据之前,你要确保有足够的空闲CPU(以容纳并行进程),还要有足够的I/O通道。
如果只有一个小任务(通常OLTP系统中执行的查询就是这种典型的小任务),或者你的可用资源不足(这也是OLTP系统中很典型的情况),其中CPU和I/O资源通常已经得到最大限度的使用,那就根本不用考虑并行执行。
如果一个任务只需要几秒(或更短时间)就能串行地完成,引入并行执行后,相关的管理开销可能会让整个过程花费更长的时间。
举例如,写一页文档若12个人来写,需要开会分段等,可能并不如一个人来写更快。而如果写1200页,12个人写需要的时间只为原来的1/12,就算分配任务可能也就1/12,还是比一个人写要快多了。
并行查询
并行查询允许将一个SQL SELECT语句划分为多个较小的查询,每个部分的查询并发地运行,然后会将各个部分的结果组合起来,提供最终的答案。
在并行进程和扫描文件之间并不存在1对1映射,可以多个进程扫描同一个文件。
各个并行进程可称为并行执行服务器(parallel execution server),有时也称为并行查询(parallel
query,PQ)从属进程。各个并行执行服务器都是单独的会话,就像是专业服务器进程一样连接数据库。每个并行执行服务器分别负责扫描表中一个部分(各
个部分都不重叠),汇总其结果子集,将其输出发回给协调服务器(即原始会话的服务器进程),它再将这些子结果汇总为最终答案。
在默认情况下,Oracle是不启用并行查询的。启用并行查询有多种方法,可以直接在查询中使用一个提示,或者修改表要求考虑并行执行路径等。
【并行查询方法】
1)暗示hints式,临时有效
select /*+parallel(table_name num)*/ count(*) from table_name;
多表关联时多表并行:
select /*+parallel(table_name1,num1) parallel(table_name2,num2)*/ count(*) from table_name1, table_name2;
2)alter table对象式,长期有效
alter table table_name parallel num;
3)alter session会话式,会话生命周期有效
alter session force parallel query parallel num;
4)并行DDL式,会话生命周期有效
alter session enable parallel dml;
对于前两种方式,若省略num则Oracle将自动根据负载确定并行度。并行度要随着系统上工作负载的增减而变化。如果有充足的空闲资源,并行度会
上升;如果可用资源有限,并行度则会下降。这样就不会为机器强加一个固定的并行度。利用这种方法,允许Oracle动态地增加或减少查询所需的并发资源
量。
【查看默认并行数】
1)确定会话SID
select sid from v$mystat where rownum = 1;
2)在其他会话中查询
select sid,qcsid,server#,degree from v$px_session where qcsid = num;
一般而言,如果能访问尽可能多的资源(CPU、内存和I/O),并行执行就能最好地发挥作用。但这并不是说如果整个数据集都在一个磁盘上,就从并行
查询得不到任何好处。不过如果整个数据集都在一个磁盘上,可能确实不如使用多个磁盘那样能有更多收获。即使使用一个磁盘,在响应时间上也可能可以得到一定
的速度提升。原因在于:给定的一个并行执行服务器在统计行时并不读取这些行,反之亦然。所以,与执行串行相比,两个并行执行服务器可以在更短的时间内完成
所有行的统计。
数据分布在多个物理设备上可以提高I/O,如表分区、跨磁盘等。
在Oracle 11g Release2及以上版本中,引入了一项新功能来限制资源过度使用:并行语句排除(Parallel
Statement
Queuing,PSQ)。使用PSQ时,数据库会限制并发执行的并行查询数,并把更多的并行请求放在一个执行队列中。CPU资源用尽时数据库会阻止新的
请求变为活动状态。这些请求并没有失败,它们只是会延迟开始,也就是说它们将排队。资源可用时,数据库就会开始执行队列中的查询。
并行DML
Oracle文档将并行DML(PDML)一词的范围限制为只包括INSERT、UPDATE、DELETE和MERGE(不像平常的DML那样还
包括SELECT)。在PDML期间,Oracle可以使用多个并行执行服务器来执行INSERT、UPDATE、DELETE或MERGE,而不是只利
用一个串行进程。在一个有充足I/O带宽的多CPU主机上,对于大规模的DML操作,可能会得到很大的速度提升。
不过,不能把PDML当成提高OLTP应用速度的一个特性。因为并行操作设计为要充分、完全地利用一台机器上的所有资源。通过这种设计,一个用户可
以完全使用机器上的所有磁盘、CPU和内存。在某些数据仓库中(有大量数据,而用户很少),这可能正是你想要的。而在一个OLTP系统中(大量用户都在做
很短、很快的事务),可能就不能希望如此了,你不想让用户能够完全占用机器资源。
类似于Oracle执行的分布式查询,PDML操作采用同样的方式执行,即每个并行执行服务器相当于一个单独数据库实例中的一个进程。这些事务都结束后,会执行一个相当于快速2PC的过程来提交这些单独的独立事务。这些事务要么都由PDML协调会话提交,要么无一提交。
由于PDML采用的一种伪分布式的实现,因此存在一些限制:
PDML操作期间不支持触发器。这是一个很合理的限制,因为触发器可能会向更新增加大量开销,而你使用PDML的本来目的是为了更快一些,这两方面是矛盾的,不能放在一起。
PDML期间,不支持某些声明方式的引用完整性约束,因为表中的每一片(部分)会在单独的会话中作为单独的事务进行修改。例如,PDML操作不支持自引用完整性。如果真的支持自引用完整性,可能会出现死锁和其他锁定问题。
在提交或回滚之前,不能访问用PDML修改的表。
PDML不支持高级复制(因为复制特性的实现要基于触发器)。
不支持延迟约束(也就是说,采用延迟模式的约束)。
如果表是分区的,PDML只可能在有位图索引或LOB列的表上执行,而且并行度取决于分区数。在这种情况下,无法在分区内并行执行一个操作,因为每个分区只有一个并行执行服务器来处理。
执行PDML时不支持分布式事务。
PDML不支持聚簇表。
并行DDL
从维护的观点看,以及从管理的角度来说,并行DDL才是Oracle中并行执行最突出的优点。如果认为并行查询主要是为最终用户设计的,那么并行
DDL则是为DBA/开发人员设计的。如果没有并行执行,DBA将很难真正充分利用硬件的全部能力。但如果利用并行执行,则完全可以做到。以下SQL
DDL命令允许“并行化”:
CREATE INDEX:多个并行执行服务器可以扫描表、对数据排序,并把有序的段写出到索引结构。
CREATE TABLE AS SELECT:执行SELECT的查询可以使用并行查询来执行,表加载本身可以并行完成。
ALTER INDEX REBUILD:索引结构可以并行重建。
ALTER TABLE MOVE:表可以并行移动。
ALTER TABLE SPLIT|COALESCE PARTITION:单个表分区可以并行地分解或合并。
ALTER INDEX SPLIT PARTITION:索引分区可以并行地分解。
前4个命令还适用于单个的表/索引分区,也就是说,可以并行地MOVE一个表的单个分区。
并行DDL和使用外部表的数据加载
利用并行DDL,再加上外部表,就能通过一个简单的CREATE TABLE AS SELECT or INSERT /*+ APPEND
*/来实现并行直接路径加载。不用再编写脚本,不必再分解文件,也不用协调要运行的N个脚本。简单地说,通过结合并行DDL和外部表,不仅提供了纯粹的易
用性,而且全无性能损失。
并行DDL和区段截断
并行DDL依赖于直接路径操作。也就是说,数据不传递到缓冲区缓存以便以后写出;而是由一个操作(如CREATE TABLE AS
SELECT)来创建新的区段,并直接写入这些区段,数据直接从查询写到磁盘(放在这些新分配的区段中)。每个并行执行服务器执行自己的部分CREATE
TABLE AS SELECT工作,并且都会写至自己的区段。INSERT /*+ APPEND
*/(直接路径插入)会在一个段的HWM“之上“写,每个并行执行服务器再写至其自己的一组区段,而不会与其他并行执行服务器共享。因此,如果执行一个并
行CREATE TABLE AS
SELECT,并使用4个并行执行服务器来创建表,就至少有4个分区,可能还会更多。每个并行执行服务器会分配其自己的区段,向其写入,等填满时,再分配
另一个新的区段,并行执行服务器不会使用由其他并行执行服务器非品牌的区段。
linux下怎么创建oracle数据库
1. 设置ORACLE_SID
默认的ORACLE_SID是orcl,我个人强烈建议起个唯一、且意义的名字,比如**testdb,**proddb等等,在Oracle用户下执行:
export ORACLE_SID=lxdbtest
2. 重建PFILE
在$ORACLE_HOME/dbs目录下重建pfile(initORACLE_SID.ora,本例为initlxdbtest.ora),除了以下三个参数,其它参数都可以不用设置(使用默认值):
db_name=lxdbtest
control_files='/home/oracle/app/oradata/lxdbtest/control01.ctl','/home/oracle/app/oradata/lxdbtest/control02.ctl','/home/oracle/app/oradata/lxdbtest/control03.ctl'
memory_target=2G
为了安全起见,控制文件一定要指定多份,在生产库上,要把它们分开放在不同的物理磁盘上,这里因为是测试库,所以才放在同一个磁盘上。
3. 启动实例至nomount状态
有了pfile就可以启动实例至nomount状态了:
$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Thu Jul 25 21:01:16 2013
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL startup nomount
ORACLE instance started.
Total System Global Area 2137886720 bytes
Fixed Size 2215064 bytes
Variable Size 1224737640 bytes
Database Buffers 905969664 bytes
Redo Buffers 4964352 bytes
SQL
4. 执行CREATE DATABASE语句
CREATE DATABASE lxdbtest
LOGFILE GROUP 1
('/home/oracle/app/oradata/lxdbtest/redo01a.log','/data/oradata/lxdbtest/redo01b.log')
SIZE 100M BLOCKSIZE 512,
GROUP 2
('/home/oracle/app/oradata/lxdbtest/redo02a.log','/data/oradata/lxdbtest/redo02b.log')
SIZE 100M BLOCKSIZE 512,
GROUP 3
('/home/oracle/app/oradata/lxdbtest/redo03a.log','/data/oradata/lxdbtest/redo03b.log')
SIZE 100M BLOCKSIZE 512
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 600
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DATAFILE '/home/oracle/app/oradata/lxdbtest/system01.dbf' SIZE 2048M REUSE AUTOEXTEND OFF
SYSAUX DATAFILE '/home/oracle/app/oradata/lxdbtest/sysaux01.dbf' SIZE 2048M REUSE AUTOEXTEND OFF
DEFAULT TABLESPACE users
DATAFILE '/home/oracle/app/oradata/lxdbtest/users01.dbf'
SIZE 2048M REUSE AUTOEXTEND OFF
DEFAULT TEMPORARY TABLESPACE temptbs
TEMPFILE '/home/oracle/app/oradata/lxdbtest/temp01.dbf'
SIZE 2048M REUSE AUTOEXTEND OFF
UNDO TABLESPACE undotbs
DATAFILE '/home/oracle/app/oradata/lxdbtest/undotbs01.dbf'
SIZE 2048M REUSE AUTOEXTEND OFF;
有几点需要注意:
1)每个日志文件组的日志要放在不同的物理磁盘上,万一有一个磁盘损坏,也不会丢失数据
2)根据需要选择合适的字符集
3)创建了5个基本的表空间:SYSTEM,SYSAUX,默认表空间,默认临时表空间,默认UNDO表空间
5. 根据需要创建应用程序所需的表空间
对于关键业务的数据,应该创建单独的表空间给它使用(最好把表和索引分开放在表空间)
SQL create tablespace p95169tbs
2 datafile '/home/oracle/app/oradata/lxdbtest/p95169tbs01.dbf' size 10G,
3 '/home/oracle/app/oradata/lxdbtest/p95169tbs02.dbf' size 10G;
Tablespace created.
6. 构建数据字典视图
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/sqlplus/admin/pupbld.sql
7. 修改system,sys的密码
alter user sys identified by ***;
alter user system identified by ***;
8. 创建SPFILE
SQL create spfile from pfile;
File created.
重启数据库后,将以spfile取代pfile.
最后,再顺便说下如何删除数据库。在删除数据库之前,数据库必须是在mount和restricted session状态,具体如下:
SQL startup mount
SQL alter system enable restricted session;
System altered.
SQL drop database;
Database dropped.
数据库删除成功后,所有的在线日志文件、数据文件都会一并被删除,但归档日志和备份文件不会被删除。
oracle 如何运用队列和触发器在员工表中每插入一个新员工自动生成员工编号
创建一个序列:abc_table_s
插入表的value里引用:abc_table_s.nextval
oracle 如何创建每小时执行的jobs
dbms_job.submit( job out binary_integer,
what in archar2,
next_date in date,
interval in varchar2,
no_parse in boolean)
●job:输出变量,是此任务在任务队列中的编号;
●what:执行的任务的名称及其输入参数;
●next_date:任务执行的时间;
●interval:任务执行的时间间隔。
interval取值'SYSDATE + 1/24'就是每天运行一次
求oracle DBA 大神. ora-600, 队列表.
这个问题在MyOracleSupport上有文档讲
Getting ORA-600 [kcbgcur_3] When Creating a Queue Table (Doc ID 555035.1)
这个错误是因为之前有人drop过这个队列表,但是没有成功。导致AQ Metadata损坏。
依次尝试如下步骤
DBMS_AQADM.DROP_QUEUE_TABLE(queue_table = 'qtable_name');
DBMS_AQADM.DROP_QUEUE_TABLE(queue_table = 'qtable_name', force = TRUE);
尝试创建队列表,如果不行
重启实例以清除内存残留信息
尝试创建队列表,如果还不行,需要手动的清除AQ metadata.这个得找Oracle Support部门开SR。我也不知道怎么手动清除。
名称栏目:oracle队列怎么创建,如何创建oracle实例
本文网址:http://scgulin.cn/article/heosce.html