??xml version="1.0" encoding="utf-8" standalone="yes"?>久久艹国产,国产成人精品久久亚洲,久久精品免费一区二区http://www.shnenglu.com/colys/category/4141.htmlLIFE AS CODEzh-cnTue, 20 May 2008 19:44:58 GMTTue, 20 May 2008 19:44:58 GMT60分散数据库压?分表处理设计思想和实?/title><link>http://www.shnenglu.com/colys/articles/32397.html</link><dc:creator>colys</dc:creator><author>colys</author><pubDate>Tue, 18 Sep 2007 01:51:00 GMT</pubDate><guid>http://www.shnenglu.com/colys/articles/32397.html</guid><wfw:comment>http://www.shnenglu.com/colys/comments/32397.html</wfw:comment><comments>http://www.shnenglu.com/colys/articles/32397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/colys/comments/commentRss/32397.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/colys/services/trackbacks/32397.html</trackback:ping><description><![CDATA[<div><strong> 一、概q?/strong> </div> <div> </div> <div>分表是个目前是比较炒的比较行的概念,特别是在大负载的情况下,分表是一个良好分散数据库压力的好Ҏ(gu)?/div> <div> </div> <div>首先要了解ؓ(f)什么要分表Q分表的好处是什么。我们先来大概了解以下一个数据库执行SQL的过E:(x)</div> <div>接收到SQL --> 攑օSQL执行队列 --> 使用分析器分解SQL --> 按照分析l果q行数据的提取或者修?--> q回处理l果</div> <div> </div> <div>当然Q这个流E图不一定正,q只是我自己主观意识上这么我认ؓ(f)。那么这个处理过E当中,最Ҏ(gu)出现问题的是什么?是_(d)如果前一个SQL? 有执行完毕的话,后面的SQL是不?x)执行的Q因Zؓ(f)了保证数据的完整性,必须Ҏ(gu)据表文gq行锁定Q包括共享锁和独享锁两种锁定。共享锁是在锁定的期_(d) 其它U程也可以访问这个数据文Ӟ但是不允怿Ҏ(gu)作,相应的,独n锁就是整个文件就是归一个线E所有,其它U程无法讉Kq个数据文g。一般MySQL? 最快的存储引擎MyISAMQ它是基于表锁定的,是说如果一锁定的话Q那么整个数据文件外部都无法讉KQ必ȝ前一个操作完成后Q才能接收下一个操作, 那么在这个前一个操作没有执行完成,后一个操作等待在队列里无法执行的情况叫做dQ一般我们通俗意义上叫?#8220;锁表”?/div> <div> </div> <div>锁表直接D的后果是什么?是大量的SQL无法立即执行Q必ȝ队列前面的SQL全部执行完毕才能l箋执行。这个无法执行的SQL׃(x)D没有l果Q或者gq严重,影响用户体验?/div> <div> </div> <div>特别是对于一些用比较频J的表,比如SNSpȝ中的用户信息表、论坛系l中的帖子表{等Q都是访问量大很大的表,Z保证数据的快速提取返回给用户Q必M用一些处理方式来解决q个问题Q这个就是我今天要聊到的分表技术?/div> <div> </div> <div> </div> <div>分表技术顾名思义Q就是把若干个存储相同类型数据的表分成几个表分表存储Q在提取数据的时候,不同的用戯问不同的表,互不冲突Q减锁表的? 率。比如,目前保存用户分表有两个表Q一个是user_1表,q有一个是 user_2 表,两个表保存了不同的用户信息,user_1 保存了前10万的用户信息Quser_2保存了后10万名用户的信息,现在如果同时查询用户 heiyeluren1 ?heiyeluren2 q个两个用户Q那么就是分表从不同的表提取出来Q减锁表的可能?/div> <div> </div> <div> </div> <div>我下面要讲述的两U分表方法我自己都没有实验过Q不保证准确能用Q只是提供一个设计思\。下面关于分表的例子我假设是在一个脓(chung)吧系l的基础上来q行处理和构建的。(如果没有用过贴吧的用戯紧Google一下)</div> <div> </div> <div> </div> <div> </div> <div><strong> 二、基于基表的分表处理</strong> </div> <div> </div> <div>q个Z基础表的分表处理方式大致的思想是Q一个主要表Q保存了所有的基本信息Q如果某个项目需要找到它所存储的表Q那么必Mq个基础表中 查找出对应的表名{项目,好直接访问这个表。如果觉得这个基表速度不够快,可以完全把整个基表保存在~存或者内存中Q方便有效的查询?/div> <div> </div> <div>我们Z贴吧的情况,构徏假设如下?张表Q?/div> <div> </div> <div>1. 贴吧版块? 保存贴吧中版块的信息</div> <div>2. 贴吧主题表:(x)保存贴吧中版块中的主题信息,用于览</div> <div>3. 贴吧回复表:(x)保存主题的原始内容和回复内容</div> <div> </div> <div> </div> <div>“贴吧版块?#8221;包含如下字段Q?/div> <div>版块ID       board_id          int(10)</div> <div>版块名称    board_name      char(50)</div> <div>子表ID       table_id            smallint(5)</div> <div>产生旉    created             datetime</div> <div> </div> <div>“贴吧主题?#8221;包含如下字段Q?/div> <div>主题I(y)D          topic_id        int(10)</div> <div>主题名称        topic_name     char(255)</div> <div>版块ID          board_id          int(10)</div> <div>创徏旉       created           datetime</div> <div> </div> <div>“贴吧回复?#8221;的字D如下:(x)</div> <div>回复ID        reply_id           int(10)</div> <div>回复内容      reply_text        text</div> <div>主题I(y)D        topic_id           int(10)</div> <div>版块ID        board_id         int(10)</div> <div>创徏旉      created            datetime</div> <div> </div> <div>那么上面保存了我们整个脓(chung)吧中的表l构信息Q三个表对应的关pLQ?/div> <div> </div> <div>版块 --> 多个主题</div> <div>主题 --> 多个回复</div> <div> </div> <div>那么是_(d)表文件大的关系是:(x)</div> <div>版块表文?< 主题表文?< 回复表文?/div> <div> </div> <div>所以基本可以确定需要对主题表和回复表进行分表,已增加我们数据检索查询更Ҏ(gu)候的速度和性能?/div> <div> </div> <div>看了上面的表l构Q会(x)明显发现Q在“版块?#8221;中保存了一?table_id"字段Q这个字D就是用于保存一个版块对应的主题和回复都是分表保存在什么表里的?/div> <div> </div> <div>比如我们有一个叫?#8220;PHP”的脓(chung)吧,board_id?Q子表ID也是1Q那么这条记录就是:(x)</div> <div> </div> <div>board_id | board_name | table_id | created</div> <div>1 | PHP | 1 | 2007-01-19 00:30:12</div> <div> </div> <div>相应的,如果我需要提?#8220;PHP”吧里的所有主题,那么必L照表里保存的table_id来组合一个存储了主题的表名称Q比如我们主题表的前~?#8220;topic_”Q那么组合出?#8220;PHP”吧对应的主题表应该是Q?#8220;topic_1”Q那么我们执行:(x)</div> <div> </div> <div>Select * FROM topic_1 Where board_id = 1 orDER BY topic_id DESC LIMIT 10</div> <div> </div> <div>q样p够获取这个主题下面回复列表,方便我们q行查看Q如果需要查看某个主题下面的回复Q我们可以l用版块表中保存的“table_id”来进行查询。比如我们回复表的前~?#8220;reply_”Q那么就可以l合?#8220;PHP”吧的ID?的主题的回复Q?/div> <div> </div> <div>Select * FROM reply_1 Where topic_id = 1 orDER BY reply_id DESC LIMIT 10</div> <div> </div> <div>q里Q我们能够清晰的看到Q其实我们这里用了基础表,基础表就是我们的版块表。那么相应的Q肯定会(x)_(d)(x)基础表的数据量大了以后如何保证它的速度和效率?</div> <div> </div> <div>当然Q我们就必须使得q个基础表保持最好的速度和性能Q比如,可以采用MySQL的内存表来存储,或者保存在内存当中Q比如Memcache之类的内存缓存等{,可以按照实际情况来进行调整?/div> <div> </div> <div>一般基于基表的分表机制在SNS、交友、论坛等Web2.0|站中是个比较不错的解决Ҏ(gu)Q在q些|站中,完全可以单独使用一个表来来保存基本标识和目标表之间的关pR用表保存对应关系的好处是以后扩展非常方便Q只需要增加一个表记录?/div> <div> </div> <div> </div> <div>?strong> 优势</strong> 】增加删除节炚w常方便,为后期升U维护带来很大便?/div> <div>?strong> 劣势</strong> 】需要增加表或者对某一个表q行操作Q还是无法离开数据库,?x)生瓶?/div> <div> </div> <div> </div> <div> </div> <div><strong> 三、基?/strong> <strong> Hash</strong> <strong> 法的分表处?/strong> </div> <div> </div> <div>我们知道Hash表就是通过某个Ҏ(gu)的Hash法计算出的一个|q个值必L惟一的,q且能够使用q个计算出来的值查扑ֈ需要的|q个叫做哈希表?/div> <div> </div> <div>我们在分表里的hash法跟这个思想cMQ通过一个原始目标的ID或者名U通过一定的hash法计算出数据存储表的表名,然后讉K相应的表?/div> <div> </div> <div>l箋拿上面的贴吧来说Q每个脓(chung)吧有版块名称和版块IDQ那么这两项值是固定的,q且是惟一的,那么我们可以考虑通过对这两项g的一进行一些运得Z个目标表的名U?/div> <div> </div> <div>现在假如我们针对我们q个贴吧pȝQ假讄l最大允?亿条数据Q考虑每个表保?00万条记录Q那么整个系l就不超q?00个表p够容U뀂按照这个标准,我们假设在脓(chung)吧的版块ID上进行hashQ获得一个key|q个值就是我们的表名Q然后访问相应的表?/div> <div> </div> <div>我们构造一个简单的hash法Q?/div> <div> </div> <div>function get_hash($id){</div> <div>     $str = bin2hex($id);</div> <div>     $hash = substr($str, 0, 4);</div> <div>     if (strlen($hash)<4){</div> <div>         $hash = str_pad($hash, 4, "0");</div> <div>     }</div> <div>     return $hash;</div> <div>}</div> <div> </div> <div>法大致是传入一个版块ID|然后函数q回一?位的字符Ԍ如果字符串长度不够,使用0q行补全?/div> <div> </div> <div>比如Qget_hash(1)Q输出的l果?#8220;3100”Q输入:(x)get_hash(23819)Q得到的l果是:(x)3233Q那么我们经q简单的跟表前缀l合Q就能够讉Kq个表了。那么我们需要访问ID?的内Ҏ(gu)候哦Q组合的表将是:(x)topic_3100、reply_3100Q那么就可以直接对目标表q行讉K了?/div> <div> </div> <div>当然Q用hash法后,有部分数据是可能在同一个表的,q一点跟hash表不同,hash表是量解决冲突Q我们这里不需要,当然同样需要预和分析表数据可能保存的表名?/div> <div> </div> <div> </div> <div>如果需要存储的数据更多Q同L(fng)Q可以对版块的名字进行hash操作Q比如也是上面的二进制{换成十六q制Q因为汉字比数字和字母要多很多,那么重复几率更小Q但是可能组合成的表更多了Q相应就必须考虑一些其它的问题?/div> <div> </div> <div>归根l底Q用hash方式的话必须选择一个好的hash法Q才能生成更多的表,然数据查询的更迅速?/div> <div> </div> <div> </div> <div>?strong> 优点hash法直接得出目标表名Uͼ效率很高</strong> 】通过</div> <div>?strong> 劣势</strong> 】扩展性比较差Q选择了一个hash法Q定义了多少数据量,以后只能在这个数据量上跑Q不能超q过q个数据量,可扩展性稍?/div> <div> </div> <div> </div> <div> </div> <div><strong> 四、其它问?/strong> </div> <div> </div> <div><strong> 1. </strong> <strong> 搜烦问题</strong> </div> <div>现在我们已经q行分表了,那么无法直接对表进行搜索,因ؓ(f)你无法对可能pȝ中已l存在的几十或者几百个表进行检索,所以搜索必d助W三方的lg来进行,比如Lucene作ؓ(f)站内搜烦引擎是个不错的选择?/div> <div> </div> <div><strong> 2. </strong> <strong> 表文仉?/strong> </div> <div>我们知道MySQL的MyISAM引擎每个表都?x)生成三个文Ӟ?.frm?.MYD?.MYI 三个文gQ分表用来保存表l构、表数据和表索引。Linux下面每个目录下的文g数量最好不要超q?000个,不然索数据将更慢Q那么每个表都会(x)生成? 个文Ӟ相应的如果分表超q?00个表Q那么将索非常慢Q所以这时候就必须再进行分Q比如在q行数据库的分离?/div> <div> </div> <div>使用基础表,我们可以新增加一个字D,用来保存q个表保存在什么数据。用Hash的方式,我们必须截取hashgW几位来作ؓ(f)数据库的名字。这P完好的解册个问题?/div> <div> </div> <div> </div> <div><strong> 五、ȝ</strong> </div> <div> </div> <div>在大负蝲应用当中Q数据库一直是个很重要的瓶颈,必须要突_(d)本文讲解了两U分表的方式Q希望对很多够有启发的作用。当Ӟ本文代码和设x有经qQ何代码测试,所以无法保证设计的完全准确实用Q具体还是需要读者在使用q程当中认真分析实施?/div> <div> </div> <br><img src ="http://www.shnenglu.com/colys/aggbug/32397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/colys/" target="_blank">colys</a> 2007-09-18 09:51 <a href="http://www.shnenglu.com/colys/articles/32397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句导入导出大全[攉] http://www.shnenglu.com/colys/articles/22813.htmlcolyscolysWed, 25 Apr 2007 10:07:00 GMThttp://www.shnenglu.com/colys/articles/22813.htmlhttp://www.shnenglu.com/colys/comments/22813.htmlhttp://www.shnenglu.com/colys/articles/22813.html#Feedback0http://www.shnenglu.com/colys/comments/commentRss/22813.htmlhttp://www.shnenglu.com/colys/services/trackbacks/22813.htmlEXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'

/*********** 导入Excel
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/*动态文件名
declare @fn varchar(20),@s varchar(1000)
set @fn = 'c:\test.xls'
set @s ='''Microsoft.Jet.OLEDB.4.0'',
''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$'
exec(@s)
*/

SELECT cast(cast(U目~号 as numeric(10,2)) as nvarchar(255))+' ' 转换后的别名
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/********************** EXCEL导到q程SQL
insert OPENDATASOURCE(
'SQLOLEDB',
'Data Source=q程ip;User ID=sa;Password=密码'
).库名.dbo.表名 (列名1,列名2)
SELECT 列名1,列名2
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions


/** 导入文本文g
EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'

/** 导出文本文g
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'
?br>EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'

导出到TXT文本Q用逗号分开
exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'


BULK INSERT 库名..表名
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)


--/* dBase IV文g
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')
--*/

--/* dBase III文g
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')
--*/

--/* FoxPro 数据?br>select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
--*/

/**************导入DBF文g****************/
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:\VFP98\data;
SourceType=DBF',
'select * from customer where country != "USA" order by country')
go
/***************** 导出到DBF ***************/
如果要导出数据到已经生成l构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

insert into openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
select * from ?br>
说明:
SourceDB=c:\ 指定foxpro表所在的文g?br>aa.DBF 指定foxpro表的文g?




/*************导出到Access********************/
insert into openrowset('Microsoft.Jet.OLEDB.4.0',
'x:\A.mdb';'admin';'',A? select * from 数据库名..B?br>
/*************导入Access********************/
insert into B?selet * from openrowset('Microsoft.Jet.OLEDB.4.0',
'x:\A.mdb';'admin';'',A?

文g名ؓ(f)参数
declare @fname varchar(20)
set @fname = 'd:\test.mdb'
exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'',
'''+@fname+''';''admin'';'''', topics) as a ')

SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...产品

********************* 导入 xml 文g

DECLARE @idoc int
DECLARE @doc varchar(1000)
--sample XML document
SET @doc ='



Customer was very satisfied




Important
Happy Customer.




'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 1)
WITH (oid char(5),
amount float,
comment ntext 'text()')
EXEC sp_xml_removedocument @idoc



???????

/**********************Excel导到Txt****************************************/
想用
select * into opendatasource(...) from opendatasource(...)
实现一个Excel文g内容导入C个文本文?br>
假设Excel中有两列Q第一列ؓ(f)姓名Q第二列为很行帐?16?
且银行帐号导出到文本文g后分两部分,?位和?位分开?br>

邹健Q?br>如果要用你上面的语句插入的话,文本文g必须存在,而且有一?姓名,银行账号1,银行账号2
然后可以用下面的语句进行插?br>注意文g名和目录Ҏ(gu)你的实际情况q行修改.

insert into
opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Text;HDR=Yes;DATABASE=C:\'
)...[aa#txt]
--,aa#txt)
--*/
select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
from
opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'
--,Sheet1$)
)...[Sheet1$]



如果你想直接插入q生成文本文?p用bcp

declare @sql varchar(8000),@tbname varchar(50)

--首先excel表内容导入到一个全局临时?br>select @tbname='[##temp'+cast(newid() as varchar(40))+']'
,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
into '+@tbname+' from
opendatasource(''MICROSOFT.JET.OLEDB.4.0''
,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls''
)...[Sheet1$]'
exec(@sql)

--然后用bcp从全局临时表导出到文本文g
set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c'
exec master..xp_cmdshell @sql

--删除临时?br>exec('drop table '+@tbname)


/********************导整个数据库*********************************************/

用bcp实现的存储过E?br>

/*
实现数据导入/导出的存储过E?br>Ҏ(gu)不同的参?可以实现导入/导出整个数据?单个?br>调用CZ:
--导出调用CZ
----导出单个?br>exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1
----导出整个数据?br>exec file2table 'zj','','','xzkh_sa','C:\docman',1

--导入调用CZ
----导入单个?br>exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0
----导入整个数据?br>exec file2table 'zj','','','xzkh_sa','C:\docman',0

*/
if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
drop procedure File2Table
go
create procedure File2Table
@servername varchar(200) --服务器名
,@username varchar(200) --用户?如果用NT验证方式,则ؓ(f)I?'
,@password varchar(200) --密码
,@tbname varchar(500) --数据?dbo.表名,如果不指?.dbo.表名,则导出数据库的所有用戯
,@filename varchar(1000) --导入/导出路径/文g?如果@tbname参数指明是导出整个数据库,则这个参数是文g存放路径,文g名自动用表名.txt
,@isout bit --1为导?0为导?br>as
declare @sql varchar(8000)

if @tbname like '%.%.%' --如果指定了表?则直接导出单个表
begin
set @sql='bcp '+@tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+'" /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
end
else
begin --导出整个数据?定义游标,取出所有的用户?br>declare @m_tbname varchar(250)
if right(@filename,1)<>'\' set @filename=@filename+'\'

set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U'''
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
set @sql='bcp '+@tbname+'..'+@m_tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+@m_tbname+'.txt " /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go


/************* Oracle **************/
EXEC sp_addlinkedserver 'OracleSvr',
'Oracle 7.3',
'MSDAORA',
'ORCLDB'
GO

delete from openquery(mailser,'select * from yulin')

select * from openquery(mailser,'select * from yulin')

update openquery(mailser,'select * from yulin where id=15')set disorder=555,catago=888

insert into openquery(mailser,'select disorder,catago from yulin')values(333,777)

colys 2007-04-25 18:07 发表评论
]]>
Oracle job 理 http://www.shnenglu.com/colys/articles/job.htmlcolyscolysWed, 25 Apr 2007 05:00:00 GMThttp://www.shnenglu.com/colys/articles/job.htmlhttp://www.shnenglu.com/colys/comments/22794.htmlhttp://www.shnenglu.com/colys/articles/job.html#Feedback0http://www.shnenglu.com/colys/comments/commentRss/22794.htmlhttp://www.shnenglu.com/colys/services/trackbacks/22794.htmlSVRMGR> select * from dba_jobs;

初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000  ;job_queue_interval = 10  //调度作业h频率Uؓ(f)单位
DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1  select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
2 select job,what,last_date,next_date,interval from  dba_jobs where job in (1,3);


查询job的情c?br>show paramter background_dump_dest.
看alter.log 和trace

SVRMGR> select * from dba_jobs;

初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000

job_queue_interval = 10  //调度作业h频率Uؓ(f)单位


DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1  select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
2 select job,what,last_date,next_date,interval from  dba_jobs where job in (1,3);


查询job的情c?br>show paramter background_dump_dest.
看alter.log 和trace

请问我如何停止一个JOB
SQL> exec dbms_job.broken(1,true)

PL/SQL q程已成功完成?br>SQL>commit  //必须提交否则无效

启动作业
SQL> exec dbms_job.broken(1,false)

PL/SQL q程已成功完成?/p>

停其他用L(fng)job
SQL>exec sys.dbms_ijob.broken(98,true);
SQL>commit;


============================

exec dbms_job.broken(:job) 停止
exec dbms_job.broken(186,true) //标记位broken
exec dbms_job.broken(186,false)//标记为非broken
exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行旉
exec dbms_job.remove(:job)Q删?br>exec dbms_job.remove(186);
commitQ?/p>

把一个broken job重新q行


三、查看相关job信息
1、相兌?br>dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在q行job相关信息


创徏JOB
variable jobno number;
begin
  dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
  commit;
end;
print jobno

例如Q我们已l徏立了一个存储过E,其名UCؓ(f)my_jobQ在sql/plus中以scott用户w䆾dQ执行如下命令:(x)
sql> variable n number;
sql> begin
dbms_job.submit(:n‘my_job;’,sysdate,
‘sysdateQ?/360’);
commit;
end;
Sql> print :n;

pȝ提示执行成功?
Sql> print :n;
pȝ打印此Q务的~号Q例如结果ؓ(f)300?

单例?br>一个简单例子:(x)

创徏试?br>SQL> create table TEST(a date);

表已创徏?/p>

创徏一个自定义q程
SQL> create or replace procedure MYPROC as
  2  begin
  3  insert into TEST values(sysdate);
  4  end;
  5  /

q程已创建?/p>

创徏JOB
SQL> variable job1 number;
SQL>
SQL> begin
  2  dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分钟Q即一分钟q行testq程一?br>  3  end;
  4  /

PL/SQL q程已成功完成?/p>

q行JOB
SQL> begin
  2  dbms_job.run(:job1);
  3  end;
  4  /

PL/SQL q程已成功完成?/p>

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 旉 from TEST;


-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24

删除JOB
SQL> begin
  2  dbms_job.remove(:job1);
  3  end;
  4  /

PL/SQL q程已成功完成?/p>

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/p>


a、利用dbms_job.run()立即执行该job
   sql>begin
   sql>dbms_job.run(:jobno) 该jobno为submitq程提交时返回的job number
   sql>end;
   sql>/
b、利用dbms_job.broken()重新broken标记为false
   sql>begin
   sql>dbms_job.broken (:job,false,next_date)
   sql>end;
   sql>/

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
SQL> create table a(a date);
Table created

创徏一个过E?br>SQL> create or replace procedure test as
  2  begin
  3  insert into a values(sysdate);
  4  end;
  5  /
Procedure created

提交作业
SQL> declare
  2  job1 number;   //定义一个数字型变量
  3  begin
  4  dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');  //按分钟算一?440分钟
  5  end;
  6  /
PL/SQL procedure successfully completed
job1
---------
4
SQL> commit;
Commit complete

q行作业
SQL> begin
  2  dbms_job.run(4);
  3  end;
  4  /
PL/SQL procedure successfully completed

删除作业
SQL> begin
  2  dbms_job.remove(4);
  3  end;
  4  /
PL/SQL procedure successfully completed
SQL> commit;
Commit complete


job change//修改作业
execute dbms_job.change(186,null,null,'sysdate+3');
execute dbms_job.change(186,'scott.test(update)');

DBA_JOBS
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?br>字段Q列Q?nbsp;         cd                 描述
JOB                NUMBER          d的唯一标示?
LOG_USER           VARCHAR2(30)    提交d的用?
PRIV_USER          VARCHAR2(30)    赋予d权限的用?
SCHEMA_USER        VARCHAR2(30)    对Q务作语法分析的用h?
LAST_DATE          DATE            最后一ơ成功运行Q务的旉
LAST_SEC           VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小Ӟ分钟和秒
THIS_DATE     DATE            正在q行d的开始时_(d)如果没有q行d则ؓ(f)null
THIS_SEC     VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小Ӟ分钟和秒
NEXT_DATE          DATE            下一ơ定时运行Q务的旉
NEXT_SEC           VARCHAR2(8)     如HH24:MM:SS格式的next_date日期的小Ӟ分钟和秒
TOTAL_TIME         NUMBER          该Q务运行所需要的L_(d)单位为秒
BROKEN             VARCHAR2(1)     标志参数QY标示d中断Q以后不?x)运?
INTERVAL           VARCHAR2(200)   用于计算下一q行旉的表辑ּ
FAILURES    NUMBER     dq行q箋没有成功的次?
WHAT               VARCHAR2(2000)  执行d的PL/SQL?
CURRENT_SESSION_LABEL RAW          MLSLABEL 该Q务的信QOracle?x)话W?
CLEARANCE_HI      RAW MLSLABEL     该Q务可信Q的Oracle最大间?
CLEARANCE_LO      RAW              MLSLABEL 该Q务可信Q的Oracle最间?
NLS_ENV           VARCHAR2(2000)   dq行的NLS?x)话讄?
MISC_ENV          RAW(32)          dq行的其他一些会(x)话参?


描述                    INTERVAL参数?
每天午夜12?nbsp;           'TRUNC(SYSDATE + 1)'
每天早上8?0?nbsp;        'TRUNC(SYSDATE + 1) + Q?*60+30Q?(24*60)'
每星期二中午12?nbsp;        'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12?nbsp;   'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11?'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6?0?nbsp;   'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + Q?×60+10Q?Q?4×60Q?



colys 2007-04-25 13:00 发表评论
]]>
Ʒþþþû| þҹ³˿Ƭ| þþƷһպ| ۺþþ| þ99Ʒ鶹լլ| ˾Ʒþ| þþƷAVþþ| AVþþþò | þһѵ | ŷͽxxxxѿþþ| ɫþùƷ12p| avþþƷ| 99þþƷѿһ | ɫ99þþþø߳ۺӰԺ| þۺ97ɫһһ | þۺ༤| þþɫۺϾɫ99| Ʒþþþþ12| þþþþþùѿ| ˾þü91| þҹۺϾþ| 㽶þþƷ | 97þþƷˬ| һɫþHEZYO| ȫɫƴɫƬѾþþ| þþþAVۺ| þۺϹapp | ƷۺϾþþþþ888ѿ| ɫʹþۺ| þþƷĻ| Ʒþþþþþþþ| ݺɫݺݺݺݺɫۺϾþ| һõþۺϺݺݰ| ŷ޹Ʒþø| þþþþþþŮ| պAVëƬƷþþ| ҹƷþ| þþƷAV㽶| þݺҹҹavapp| ɫۺϾþ֮ۺϾþ| þƵ|