技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

Linux 从网上下载的可执行文件到本地无法无法执行

   从网上下载到本地的可执行文件无法执行是因为档案的属性被改变了,通过chown或chmod命令将档案的所有者更改为本人用户名,其次赋予可执行权限。本文出自 “smile_青春” 博客,请务必保留此出处http://smileyouth.blog.51cto.com/7273768/1268772... 全文

可执行文件无法执行

如何让普通用户执行一些root用户才能执行的命令

sudo某个普通用户能够临时以管理员或其他用户的身份执行某些命令 sudo的配置文件root用户才能够看到 /etc/sudoers: 440#visudo 打开配置文件  who   which_host=(whom)   command_list谁以谁的身份在哪些主机上能够执行哪些命令日志:谁以sudo登陆的记录/var/log/securesudo -k 执行过sudo之后都要执行一次,下一次执行要输入密码     -l 显示用户执行的所有命令 eg:jerry ALL=(root) /usr/sbin/useradd,/usr/sbin/userdel,/usr/sbin/usermod,/usr/bin/passwd,!/usr/bin/passwd root (不能更改root的密码)%usermanager系统上的组rUser_AliasAlias的名称中的字符必须全部使用大写字母User_Alias USERMANAGER = jerry,redhat, centos, ubuntuCmnd_Alias USERMANAGER = /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/bin/passwd, !/usr/bin/passwd rootHost_Alias LOCALNET = 172.16.0.0/16USERMANGER LOCALNET =(root) USERMANCMND... 全文

休闲 普通用户执行一些root的命令 职场

作业自动在每天的凌晨2点执行和解决作业不能执行的问题

作业自动在每天的凌晨2点执行和解决作业不能执行的问题 一 作业自动在每天的凌晨2点执行 --定义作业要执行的存储过程 create or replace procedure P_deleteOrCreateSeq authid current_user is v_count        int; strsql varchar2(2000); begin             select     count(*)     into     v_count     from     user_objects             where     object_type     =     'SEQUENCE'     and     object_name     =     'SEQ_T_B_OPERLOG';             if     v_count    > 0     then                         strsql := 'drop     sequence     seq_t_b_OperLog';                         execute     immediate    strsql;             end if;             strsql:='create sequence seq_t_b_OperLog    minvalue 1000000000 maxvalue 9999999999 start with 1000000000 increment by 1 nocache';                            execute immediate strsql; end P_deleteOrCreateSeq; --作业自动在每天的凌晨2点执行 --定义作业:    variable job1 number;                 begin                dbms_job.submit(:job1,'P_deleteOrCreateSeq;',to_date('2009-05-28 12:50:00', 'yyyy-mm-dd hh24:mi:ss'),'TRUNC(sysdate) + 1 +1/12');--每天的凌晨2点执行                 commit;            end;    --运行作业      begin     dbms_job.run(:job1);     commit;     end;--查看作业 select job,next_date,next_sec,failures,broken from user_jobs;     --DBMS_JOB.SUBMIT的使用说明:PROCEDURE   Submit   (   job               OUT   binary_ineger,                                          What             IN     varchar2,                                          next_date   IN     date,                                          interval     IN     varchar2,                                          no_parse     IN     booean:=FALSE)       job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。    what参数是将被执行的PL/SQL代码块。    next_date参数指识何时将运行这个工作。    interval参数何时这个工作将被重执行。    no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE    指示此PL/SQL代码在它第一次执行时应进行语法分析,    而FALSE指示本PL/SQL代码应立即进行语法分析。    二 解决作业不能执行的问题--可能会遇到的问题:   begin    dbms_job.run(:job2);    commit;  end;运行作业时报错:ORA-12011: execution of 1 jobs failedORA-06512: at "SYS.DBMS_IJOB", line 406ORA-06512: at "SYS.DBMS_JOB", line 272ORA-06512: at line 2job2---------71解决途径:查看oracle日志文件alert_isbn.logD:\oracle\product\10.1.0\admin\isbn\bdump里的日志文件alert_isbn.log有错误说明Wed May 27 22:33:56 2009Errors in file d:\oracle\product\10.1.0\admin\isbn\bdump\isbn_j000_752.trc:ORA-12012: error on auto execute of job 73ORA-01031: insufficient privilegesORA-06512: at "LAB1107.P_DELETEORCREATESEQ", line 15ORA-06512: at line 1问题所在:当前用户(lab1107)权限不够,存储过程里用到什么权限,就要赋予当前用户相应的权限就OK。例如:我的存储过程中用到了创建序列的权限,所以可以在system用户下: grant   create sequence    to lab1107;有的可能要在system用户下给当前用户(lab1107)赋予DBA权限;  grant   dba    to lab1107;本文出自 “在路上” 博客,请务必保留此出处http://yuwenhu.blog.51cto.com/672091/161393... 全文

oralce 职场 休闲 作业自动执行

创意与执行

创意是解决问题的解法,执行是解决问题的过程。 做多了平庸的项目后,越来越觉得创意真的是画龙点睛之笔。 没有创意的执行,只是机械的劳作。本文出自 “LinuxDevelopersSecurity” 博客,请务必保留此出处http://ayuepm.blog.51cto.com/8738658/1554363... 全文

创意 执行

执行力有多重要

    最近自己被现状困扰着,自己不慢现在的生活,但是自己却没有能力或者机会做出改变,和很多人一样过的浑浑噩噩,这个经过自己的深入思考,发现是执行力这块出的问题.    从小学到大学,你的执行力有多强,那么你的学校和班级的排名就可以看出来,很多非常普通大学的大学生抱怨着,为什么你们公司只找211或者985的,我也有能力等等的话语,这个其实就是自己没有能力达到非常好level.其实可以好好想想,为什么别人能考生211或者985,自己觉得自己比较聪明相比较一部分的好大学的学生,这就是个人自制能力的差异了,别人可能没有你那么聪明,但别人的善于总结方法,多练习,而你呢,觉得自己聪明,不进行复习,练习,或者根本坐不住,这也就不奇怪了.... 全文

执行力

Oracle执行计划详解

Oracle执行计划详解---作者:TTT BLOG本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html---简介:    本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。    并有总结和概述,便于理解与记忆!+++目录---    一.相关的概念    Rowid的概念    Recursive Sql概念    Predicate(谓词)    DRiving Table(驱动表)    Probed Table(被探查表)    组合索引(concatenated index)    可选择性(selectivity)    二.oracle访问数据的存取方法    1) 全表扫描(Full Table Scans, FTS)    2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)    3)索引扫描(Index Scan或index lookup)有4种类型的索引扫描:     (1) 索引唯一扫描(index unique scan)     (2) 索引范围扫描(index range scan)           在非唯一索引上都使用索引范围扫描。使用index rang scan的3种情况:        (a) 在唯一索引列上使用了range操作符(> < <> >= <= between)        (b) 在组合索引上,只使用部分列进行查询,导致查询出多行        (c) 对非唯一索引列上进行的任何查询。       (3) 索引全扫描(index full scan)     (4) 索引快速扫描(index fast full scan)    三、表之间的连接    1,排序 - - 合并连接(Sort Merge Join, SMJ)    2,嵌套循环(Nested Loops, NL)    3,哈希连接(Hash Join, HJ)    另外,笛卡儿乘积(Cartesian Product)    总结Oracle连接方法    Oracle执行计划总结概述+++一.相关的概念Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值。不过你可以像使用其它列那样使用它,但是不能删除改列,也不能对该列的值进行 修改、插入。一旦一行数据插入数据库,则rowid在该行的生命周期内是唯一的,即即使该行产生行迁移,行的rowid也不会改变。Recursive SQL概念:有时为了执行用户发出的一个sql语句,Oracle必须执行一些额外的语句,我们将这些额外的语句称之为''recursive calls''或''recursive SQL statements''.如当一个DDL语句发出后,ORACLE总是隐含的发出一些recursive SQL语句,来修改数据字典信息,以便用户可以成功的执行该DDL语句。当需要的数据字典信息没有在共享内存中时,经常会发生Recursive calls,这些Recursive calls会将数据字典信息从硬盘读入内存中。用户不比关心这些recursive SQL语句的执行情况,在需要的时候,ORACLE会自动的在内部执行这些语句。当然DML语句与SELECT都可能引起recursive SQL.简单的说,我们可以将触发器视为recursive SQL.  Row Source(行源):用在查询中,由上一操作返回的符合条件的行的集合,即可以是表的全部行数据的集合;也可以是表的部分行数据的集合;也可以为对上2个row source进行连接操作(如join连接)后得到的行数据集合。Predicate(谓词):一个查询中的WHERE限制条件Driving Table(驱动表):该表又称为外层表(OUTER TABLE)。这个概念用于嵌套与HASH连接中。如果该row source返回较多的行数据,则对所有的后续操作有负面影响。注意此处虽然翻译为驱动表,但实际上翻译为驱动行源(driving row source)更为确切。一般说来,是应用查询的限制条件后,返回较少行源的表作为驱动表,所以如果一个大表在WHERE条件有有限制条件(如等值限 制),则该大表作为驱动表也是合适的,所以并不是只有较小的表可以作为驱动表,正确说法应该为应用查询的限制条件后,返回较少行源的表作为驱动表。在执行 计划中,应该为靠上的那个row source,后面会给出具体说明。在我们后面的描述中,一般将该表称为连接操作的row source 1.Probed Table(被探查表):该表又称为内层表(INNER TABLE)。在我们从驱动表中得到具体一行的数据后,在该表中寻找符合连接条件的行。所以该表应当为大表(实际上应该为返回较大row source的表)且相应的列上应该有索引。在我们后面的描述中,一般将该表称为连接操作的row source 2.组合索引(concatenated index):由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。当我们进行查询时可以使用“where col1 = ? ”,也可以使用“where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是“where col2 = ? ”查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引。可选择性(selectivity):比较一下列中唯一键的数量和表中的行数,就可以判断该列的可选择性。 如果该列的“唯一键的数量/表中的行数”的比值越接近1,则该列的可选择性越高,该列就越适合创建索引,同样索引的可选择性也越高。在可选择性高的列上进 行查询时,返回的数据就较少,比较适合使用索引查询。二.oracle访问数据的存取方法1) 全表扫描(Full Table Scans, FTS)  为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件一个多块读操作可以使一次I/O能读取多块数据块(db_block_multiblock_read_count参数设定),而不是只读取一个数据块,这极大的减 少了I/O总次数,提高了系统的吞吐量,所以利用多块读的方法可以十分高效地实现全表扫描,而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模 式下,每个数据块只被读一次。  使用FTS的前提条件:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过总量的5% —— 10%,或你想使用并行查询功能时。  使用全表扫描的例子:  SQL> explain plan for select * from dual;  Query Plan  -----------------------------------------  SELECT STATEMENT[CHOOSE] Cost=  TABLE ACCESS FULL DUAL2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)  行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。  这种存取方法不会用到多块读操作,一次I/O只能读取一个数据块。我们会经常在执行计划中看到该存取方法,如通过索引查询数据。  使用ROWID存取的方法:   SQL> explain plan for select * from dept where rowid = ''AAAAyGAADAAAAATAAF'';  Query Plan  ------------------------------------  SELECT STATEMENT [CHOOSE] Cost=1  TABLE ACCESS BY ROWID DEPT [ANALYZED]3)索引扫描(Index Scan或index lookup)  我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这 种查找方式称为索引扫描或索引查找(index lookup)。一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,在此情况下该次i/o只会读取一个数据库块。  在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。  索引扫描可以由2步组成:  (1) 扫描索引得到对应的rowid值。   (2) 通过找到的rowid从表中读出具体的数据。  每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的 I/O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这 是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果多大表进行索引扫描,取出的数据如果大于总量的5% —— 10%,使用索引扫描会效率下降很多。如下列所示:  SQL> explain plan for select empno, ename from emp where empno=10;  Query Plan  ------------------------------------  SELECT STATEMENT [CHOOSE] Cost=1  TABLE ACCESS BY ROWID EMP [ANALYZED]  INDEX UNIQUE SCAN EMP_I1  但是如果查询的数据能全在索引中找到,就可以避免进行第2步操作,避免了不必要的I/O,此时即使通过索引扫描取出的数据比较多,效率还是很高的  SQL> explain plan for select empno from emp where empno=10;-- 只查询empno列值  Query Plan  ------------------------------------  SELECT STATEMENT [CHOOSE] Cost=1  INDEX UNIQUE SCAN EMP_I1  进一步讲,如果sql语句中对索引列进行排序,因为索引已经预先排序好了,所以在执行计划中不需要再对索引列进行排序  SQL> explain plan for select empno, ename from emp  where empno > 7876 order by empno;  Query Plan  --------------------------------------------------------------------------------  SELECT STATEMENT[CHOOSE] Cost=1  TABLE ACCESS BY ROWID EMP [ANALYZED]  INDEX RANGE SCAN EMP_I1 [ANALYZED]  从这个例子中可以看到:因为索引是已经排序了的,所以将按照索引的顺序查询出符合条件的行,因此避免了进一步排序操作。  根据索引的类型与where限制条件的不同,有4种类型的索引扫描:  索引唯一扫描(index unique scan)  索引范围扫描(index range scan)  索引全扫描(index full scan)  索引快速扫描(index fast full scan)(1) 索引唯一扫描(index unique scan)  通过唯一索引查找一个数值经常返回单个ROWID.如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描。  使用唯一性约束的例子:  SQL> explain plan for  select empno,ename from emp where empno=10;  Query Plan  ------------------------------------  SELECT STATEMENT [CHOOSE] Cost=1  TABLE ACCESS BY ROWID EMP [ANALYZED]  INDEX UNIQUE SCAN EMP_I1(2) 索引范围扫描(index range scan)  使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围操作符(如>、<、<>、>=、<=、between)  使用索引范围扫描的例子:  SQL> explain plan for select empno,ename from emp  where empno > 7876 order by empno;  Query Plan  --------------------------------------------------------------------------------  SELECT STATEMENT[CHOOSE] Cost=1  TABLE ACCESS BY ROWID EMP [ANALYZED]  INDEX RANGE SCAN EMP_I1 [ANALYZED]  在非唯一索引上,谓词col = 5可能返回多行数据,所以在非唯一索引上都使用索引范围扫描。  使用index rang scan的3种情况:  (a) 在唯一索引列上使用了range操作符(> < <> >= <= between)  (b) 在组合索引上,只使用部分列进行查询,导致查询出多行  (c) 对非唯一索引列上进行的任何查询。(3) 索引全扫描(index full scan)  与全表扫描对应,也有相应的全索引扫描。而且此时查询出的数据都必须从索引中可以直接得到。  全索引扫描的例子:  An Index full scan will not perform single block i/o''s and so it may prove to be inefficient.  e.g.  Index BE_IX is a concatenated index on big_emp (empno, ename)  SQL> explain plan for select empno, ename from big_emp order by empno,ename;  Query Plan  --------------------------------------------------------------------------------  SELECT STATEMENT[CHOOSE] Cost=26  INDEX FULL SCAN BE_IX [ANALYZED](4) 索引快速扫描(index fast full scan)  扫描索引中的所有的数据块,与 index full scan很类似,但是一个显著的区别就是它不对查询出的数据进行排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。  索引快速扫描的例子:  BE_IX索引是一个多列索引: big_emp (empno,ename)  SQL> explain plan for select empno,ename from big_emp;  Query Plan  ------------------------------------------  SELECT STATEMENT[CHOOSE] Cost=1  INDEX FAST FULL SCAN BE_IX [ANALYZED]  只选择多列索引的第2列:  SQL> explain plan for select ename from big_emp;  Query Plan  ------------------------------------------  SELECT STATEMENT[CHOOSE] Cost=1  INDEX FAST FULL SCAN BE_IX [ANALYZED]三、表之间的连接  Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联。在后面的叙 述中,我们将会使用“row source”来代替“表”,因为使用row source更严谨一些,并且将参与连接的2个row source分别称为row source1和row source 2.Join过程的各个步骤经常是串行操作,即使相关的row source可以被并行访问,即可以并行的读取做join连接的两个row source的数据,但是在将表中符合限制条件的数据读入到内存形成row source后,join的其它步骤一般是串行的。有多种方法可以将2个表连接起来,当然每种方法都有自己的优缺点,每种连接类型只有在特定的条件下才会 发挥出其最大优势。  row source(表)之间的连接顺序对于查询的效率有非常大的影响。通过首先存取特定的表,即将该表作为驱动表,这样可以先应用某些限制条件,从而得到一个 较小的row source,使连接的效率较高,这也就是我们常说的要先执行限制条件的原因。一般是在将表读入内存时,应用where子句中对该表的限制条件。  根据2个row source的连接条件的中操作符的不同,可以将连接分为等值连接(如WHERE A.COL3 = B.COL4)、非等值连接(WHERE A.COL3 > B.COL4)、外连接(WHERE A.COL3 = B.COL4(+))。上面的各个连接的连接原理都基本一样,所以为了简单期间,下面以等值连接为例进行介绍。  在后面的介绍中,都以以下Sql为例进行说明:  SELECT A.COL1, B.COL2  FROM A, B  WHERE A.COL3 = B.COL4;  假设A表为Row Soruce1,则其对应的连接操作关联列为COL 3;  B表为Row Soruce2,则其对应的连接操作关联列为COL 4;  连接类型:  目前为止,无论连接操作符如何,典型的连接类型共有3种:排序 - - 合并连接(Sort Merge Join (SMJ) )  嵌套循环(Nested Loops (NL) )  哈希连接(Hash Join)另外,还有一种Cartesian product(笛卡尔积),一般情况下,尽量避免使用。1,排序 - - 合并连接(Sort Merge Join, SMJ)  内部连接过程  1) 首先生成row source1需要的数据,然后对这些数据按照连接操作关联列(如A.col3)进行排序。  2) 随后生成row source2需要的数据,然后对这些数据按照与sort source1对应的连接操作关联列(如B.col4)进行排序。  3) 最后两边已排序的行被放在一起执行合并操作,即将2个row source按照连接条件连接起来  下面是连接步骤的图形表示:  MERGE  /\  SORTSORT  ||  Row Source 1Row Source 2  如果row source已经在连接关联列上被排序,则该连接操作就不需要再进行sort操作,这样可以大大提高这种连接操作的连接速度,因为排序是个极其费资源的操 作,特别是对于较大的表。预先排序的row source包括已经被索引的列(如a.col3或b.col4上有索引)或row source已经在前面的步骤中被排序了。尽管合并两个row source的过程是串行的,但是可以并行访问这两个row source(如并行读入数据,并行排序)。  SMJ连接的例子:  SQL> explain plan for  select/*+ ordered */ e.deptno, d.deptno  from emp e, dept d  where e.deptno = d.deptno  order by e.deptno, d.deptno;  Query Plan  -------------------------------------  SELECT STATEMENT [CHOOSE] Cost=17MERGE JOIN  SORT JOIN  TABLE ACCESS FULL EMP [ANALYZED]  SORT JOIN  TABLE ACCESS FULL DEPT [ANALYZED]  排序是一个费时、费资源的操作,特别对于大表。基于这个原因,SMJ经常不是一个特别有效的连接方法,但是如果2个row source都已经预先排序,则这种连接方法的效率也是蛮高的。2,嵌套循环(Nested Loops, NL)  这个连接方法有驱动表(外部表)的概念。其实,该连接过程就是一个2层嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小 row source的表作为驱动表(用于外层循环)的理论依据。但是这个理论只是一般指导原则,因为遵循这个理论并不能总保证使语句产生的I/O次数最少。有时 不遵守这个理论依据,反而会获得更好的效率。如果使用这种方法,决定使用哪个表作为驱动表很重要。有时如果驱动表选择不正确,将会导致语句的性能很差、很差。  内部连接过程:  Row source1的Row 1 —— Probe ->Row source 2  Row source1的Row 2 —— Probe ->Row source 2  Row source1的Row 3 —— Probe ->Row source 2  ……。  Row source1的Row n —— Probe ->Row source 2  从内部连接过程来看,需要用row source1中的每一行,去匹配row source2中的所有行,所以此时保持row source1尽可能的小与高效的访问row source2(一般通过索引实现)是影响这个连接效率的关键问题。这只是理论指导原则,目的是使整个连接操作产生最少的物理I/O次数,而且如果遵守这 个原则,一般也会使总的物理I/O数最少。但是如果不遵从这个指导原则,反而能用更少的物理I/O实现连接操作,那尽管违反指导原则吧!因为最少的物理 I/O次数才是我们应该遵从的真正的指导原则,在后面的具体案例分析中就给出这样的例子。  在上面的连接过程中,我们称Row source1为驱动表或外部表。Row Source2被称为被探查表或内部表。  在NESTED LOOPS连接中,Oracle读取row source1中的每一行,然后在row sourc2中检查是否有匹配的行,所有被匹配的行都被放到结果集中,然后处理row source1中的下一行。这个过程一直继续,直到row source1中的所有行都被处理。这是从连接操作中可以得到第一个匹配行的最快的方法之一,这种类型的连接可以用在需要快速响应的语句中,以响应速度为 主要目标。  如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。  如果不使用并行操作,最好的驱动表是那些应用了where 限制条件后,可以返回较少行数据的的表,所以大表也可能称为驱动表,关键看限制条件。对于并行查询,我们经常选择大表作为驱动表,因为大表可以充分利用并 行功能。当然,有时对查询使用并行操作并不一定会比查询不使用并行操作效率高,因为最后可能每个表只有很少的行符合限制条件,而且还要看你的硬件配置是否 可以支持并行(如是否有多个CPU,多个硬盘控制器),所以要具体问题具体对待。  NL连接的例子:  SQL> explain plan for  select a.dname,b.sql  from dept a,emp b  where a.deptno = b.deptno;  Query Plan  -------------------------  SELECT STATEMENT [CHOOSE] Cost=5NESTED LOOPS  TABLE ACCESS FULL DEPT [ANALYZED]  TABLE ACCESS FULL EMP [ANALYZED]3,哈希连接(Hash Join, HJ)  这种连接是在oracle 7.3以后引入的,从理论上来说比NL与SMJ更高效,而且只用在CBO优化器中。  较小的row source被用来构建hash table与bitmap,第2个row source被用来被hansed,并与第一个row source生成的hash table进行匹配,以便进行进一步的连接。Bitmap被用来作为一种比较快的查找方法,来检查在hash table中是否有匹配的行。特别的,当hash table比较大而不能全部容纳在内存中时,这种查找方法更为有用。这种连接方法也有NL连接中所谓的驱动表的概念,被构建为hash table与bitmap的表为驱动表,当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。  HASH连接的例子:  SQL> explain plan for  select /*+ use_hash(emp) */ empno  from emp, dept  where emp.deptno = dept.deptno;  Query Plan  ----------------------------  SELECT STATEMENT[CHOOSE] Cost=3HASH JOIN  TABLE ACCESS FULL DEPT  TABLE ACCESS FULL EMP  要使哈希连接有效,需要设置HASH_JOIN_ENABLED=TRUE,缺省情况下该参数为TRUE,另外,不要忘了还要设置 hash_area_size参数,以使哈希连接高效运行,因为哈希连接会在该参数指定大小的内存中运行,过小的参数会使哈希连接的性能比其他连接方式还 要低。另外,笛卡儿乘积(Cartesian Product)  当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量不使用笛卡儿乘积,否则,自己想结果是什么吧!  注意在下面的语句中,在2个表之间没有连接。  SQL> explain plan for  select emp.deptno,dept,deptno  from emp,dept  Query Plan  ------------------------  SLECT STATEMENT [CHOOSE] Cost=5MERGE JOIN CARTESIAN  TABLE ACCESS FULL DEPT  SORT JOIN  TABLE ACCESS FULL EMP  CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行,dept表有m行,笛卡尔乘积的结果就是得到n * m行结果。最后,总结一下,在哪种情况下用哪种连接方法比较好:排序 - - 合并连接(Sort Merge Join, SMJ):  a) 对于非等值连接,这种连接方式的效率是比较高的。  b) 如果在关联的列上都有索引,效果更好。  c) 对于将2个较大的row source做连接,该连接方法比NL连接要好一些。  d) 但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库性能下降,因为过多的I/O.嵌套循环(Nested Loops, NL):  a) 如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。  b) NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。哈希连接(Hash Join, HJ):  a) 这种方法是在oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。  b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。  c) 只能用于等值连接中  +++Oracle执行计划的概述  ---Oracle执行计划的相关概念:Rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内唯一。Recursive sql:为了执行用户语句,系统附加执行的额外操作语句,譬如对数据字典的维护等。Row source(行源):oracle执行步骤过程中,由上一个操作返回的符合条件的行的集合。Predicate(谓词):where后的限制条件。Driving table(驱动表):又称为连接的外层表,主要用于嵌套与hash连接中。一般来说是将应用限制条件后,返回较少行源的表作为驱动表。在后面的描述中,将driving table称为连接操作的row source 1。Probed table(被探查表):连接的内层表,在我们从driving table得到具体的一行数据后,在probed table中寻找符合条件的行,所以该表应该为较大的row source,并且对应连接条件的列上应该有索引。在后面的描述中,一般将该表称为连接操作的row source 2.Concatenated index(组合索引):一个索引如果由多列构成,那么就称为组合索引,组合索引的第一列为引导列,只有谓词中包含引导列时,索引才可用。  可选择性:表中某列的不同数值数量/表的总行数如果接近于1,则列的可选择性为高。Oracle访问数据的存取方法:Full table scans, FTS(全表扫描):通过设置db_block_multiblock_read_count可以设置一次IO能读取的数据块个数,从而有效减少全表扫描时的IO总次数,也就是通过预读机制将将要访问的数据块预先读入内存中。只有在全表扫描情况下才能使用多块读操作。Table Access by rowed(通过rowid存取表,rowid lookup):由于rowid中记录了行存储的位置,所以这是oracle存取单行数据的最快方法。Index scan(索引扫描index lookup):在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的rowid值,索引扫描分两步1,扫描索引得到rowid;2,通过 rowid读取具体数据。每步都是单独的一次IO,所以如果数据经限制条件过滤后的总量大于原表总行数的5%-10%,则使用索引扫描效率下降很多。而如果结果数据能够全部在索引中找到,则可以避免第二步操作,从而加快检索速度。  根据索引类型与where限制条件的不同,有4种类型的索引扫描:Index unique scan(索引唯一扫描):存在unique或者primary key的情况下,返回单个rowid数据内容。Index range scan(索引范围扫描):1,在唯一索引上使用了range操作符(>,<,<>,>=,<=,between);2,在组合索引上,只使用部分列进行查询;3,对非唯一索引上的列进行的查询。  Index full scan(索引全扫描):需要查询的数据从索引中可以全部得到。Index fast full scan(索引快速扫描):与index full scan类似,但是这种方式下不对结果进行排序。目前为止,典型的连接类型有3种:Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序;然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序;最后两边已经排序的行被放在一起执行合并操作。排序是一个费时、费资源的操作,特别对于大表。所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序,则这种连接方法的效率也比较高。Nested loops(NL嵌套循环):连接过程就是将driving table和probed table进行一次嵌套循环的过程。就是用driving table的每一行去匹配probed table 的所有行。Nested loops可以先返回已经连接的行,而不必等待所有的连接操作处理完成才返回数据,这可以实现快速的响应时间。Hash join(哈希连接):较小的row source被用来构建hash table与bitmap,第二个row source用来被hashed,并与第一个row source生产的hash table进行匹配。以便进行进一步的连接。当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。但需要设置合适的hash_area_size参数且只能用于等值连接中。另外,还有一种连接类型:Cartesian product(笛卡尔积):表的每一行依次与另外一表的所有行匹配,一般情况下,尽量避免使用。... 全文

oracle执行计划

Linux开机自动执行脚本

测试环境:Fedora7,管理员:root,普通用户:test1  实现目标:在Linux启动时,自动运行位于普通用户test1根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志文件追加一条记录,源码如下:  from datetime import datetime  now=datetime.now()  f=open('test.log','a')  f.write('%s '%now)  f.close()  Linux在启动时,会自动执行/etc/rc.d目录下的初始化程序,因此我们可以把启动任务放到该目录下,有两种办法:  方案一:... 全文

自动执行脚本

4.查看执行计划

2013-08-06------------------查看执行计划------------------------------SQL> conn /as sysdbaConnected.SQL> grant plustrace to plsql;Grant succeeded.SQL> conn plsql/plsqlConnected.SQL> set autotrace on... 全文

Oracle执行计划

如何正确执行DB2命令?

以下的文章主要向大家介绍的是如何正确执行DB2命令,以下就是文章对正确执行DB2命令主要内容的详细描述,如果你在此方面有不明白的地方,你就可以浏览以下的文章,或许会帮上你的忙。本文教你轻松掌握执行DB2命令的方式……执行DB2命令可以通过如下的方式:... 全文

执行DB2命令

pssh并行执行远程操作

一、pssh简介pssh原名为parallel-ssh,底层使用python编写,需要python解释器和核心库支持(中心主机安装python即可),可以并行在多个主机上执行远程命令行操作,parallel-ssh工具执行时最多生成32个进程,适用于小批量管理主机,执行一些并行批量化命令行操作... 全文

pssh 并行执行

php 计算页面执行时间

<?php  $runtime_start = microtime(true); //程序开始处  $runtime_stop = microtime(true);  //程序结尾处  echo "耗时: ".round($runtime_stop-$runtime_start,6)." second(s)";  ... 全文

PHP 页面执行

Linux后台执行命令

 linux启动过程 BIOS自检MBR记录GRUB引导程序INIT进程-->读取/etc/inittab确定启动级别读取开机脚本与配置文件 开机脚本/etc/rc.local 看运行级别runlevel服务启动管理查看开机启动的服务chkconfig --list(结合| grep )在2345级别控制服务chkconfig 服务名 on/off在指定级别 chkconfig --level 45 服务名 on/off管理多个服务工具ntsysv一般是管理当前系统级别的启动,如果要管理指定级别ntsysv --level 45 进程管理查看命令ps auxps -elf实时查看top在进行进程管理的时候,结合| grep,效果更好 杀进程kill根据PID来杀killall根据进程名来杀 -9信号,强行结束进程 任务计划一次性任务计划at 小时:分钟 年-月-日自己写任务脚本CTRL+D结束编辑at -l 查看任务计划at -r 删除任务计划 周期性任务计划crontab -e 编辑任务计划crontab -l 查看任务计划crontab -r 删除任务计划-u 指定用户 周期性任务计划的书写格式* * * * * 命令脚本分时日月周/3 每31-5 这一段时间1,2,5 这几个时间5 这个时刻* 任意时间 实验:每天早上7:50自动开启sshd服务,22点50时关闭每隔5天清空一次FTP服务器公共目录/var/ftp/pub每周六的7:30时,重新启动httpd服务每周一、三、五的17:30时,打包备份/etc/httpd目录 50 7 * * * service sshd start50 22 * * * service sshd stop* * */5 * * rm -rf /var/ftp/pub/*30 7 * * 6 service httpd restart 30 17 * * 1,3,5 tar -cvf httpd.tar /etc/httpd                                                          Linux后台执行命令                                        《一》Linux后台运行命令最简的就是使用快捷键来完成,但是还是会有些其他的Linux后台运行命令例如cron和crontab这两个命令,这两个命令可以设置一些定时的任务,涉及进程调度,这里加以详细介绍。 cron and crontab c r o n是系统主要的调度进程,可以在无需人工干预的情况下运行作业。c r o n t a b命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个c r o n t a b文件来保存调度信息。可以使用它运行任意一个s h e l l脚本或某个命令,每小时运行一次,或一周三次,这完全取决于你。每一个用户都可以有自己的c r o n t a b文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件。系统管理员是通过c r o n . d e n y和c r o n . a l l o w这两个文件来禁止或允许用户拥有自己的c r o n t a b文件。 crontab的域 为了能够在特定的时间运行作业,需要了解c r o n t a b文件每个条目中各个域的意义和格式。 下面就是这些域: 第1列分钟1~5 9 第2列小时1~2 3(0表示子夜) 第3列日1~3 1 第4列月1~1 2 第5列星期0~6(0表示星期天) 第6列要运行的命令 下面是c r o n t a b的格式: 分< >时< >日< >月< >星期< >要运行的命令  其中< >表示空格。 c r o n t a b文件的一个条目是从左边读起的,第一列是分,最后一列是要运行的命令,它位于星期的后面。 可以用横杠-来表示一个时间范围,例如你希望星期一至星期五运行某个作业,那么可以在星期域使用1 - 5来表示。 还可以在这些域中使用逗号“,”,例如你希望星期一和星期四运行某个作业,只需要使用1 , 4来表示。 可以用星号*来表示连续的时间段。如果你对某个表示时间的域没有特别的限定,也应该在该域填入*。该文件的每一个条目必须含有5个时间域,而且每个域之间要用空格分隔。 该文件中所有的注释行要在行首用#来表示。 c r o n t a b文件例子: 30 21* * * /apps/bin/cleanup.sh 上面的例子表示每晚的2 1 : 3 0运行/ a p p s / b i n目录下的c l e a n u p . s h。 45 4 1,10,22 * * /apps/bin/backup.sh  上面的例子表示每月1、1 0、2 2日的4 : 4 5运行/ a p p s / b i n目录下的b a c k u p . s h。 10 1 * * 6,0 /bin/find -name "core" -exec rm {} \; 上面的例子表示每周六、周日的1 : 1 0运行一个f i n d命令。 0,30 18-23 * * * /apps/bin/dbcheck.sh 上面的例子表示在每天1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/ a p p s / b i n目录下的d b c h e c k . s h。 0 23 * * 6 /apps/bin/qtrend.sh 上面的例子表示每星期六的11 : 0 0 p m运行/ a p p s / b i n目录下的q t r e n d . s h。 你可能已经注意到上面的例子中,每个命令都给出了绝对路径。当使用c r o n t a b运行s h e l l脚本时,要由用户来给出脚本的绝对路径,设置相应的环境变量。记住,既然是用户向c r o n提交了这些作业,就要向c r o n提供所需的全部环境。不要假定c r o n知道所需要的特殊环境,它其实并不知道。所以你要保证在s h e l l脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。 如果c r o n不能运行相应的脚本,用户将会收到一个邮件说明其中的原因。 c r o n t a b命令的一般形式为: crontab [-u user] -e -l -r 其中: -u 用户名。 -e 编辑c r o n t a b文件。 -l 列出c r o n t a b文件中的内容。 -r 删除c r o n t a b文件。 如果使用自己的名字登录,就不用使用- u选项,因为在执行c r o n t a b命令时,该命令能够知道当前的用户。 创建一个新的crontab文件 在向c r o n进程提交一个c r o n t a b文件之前,要先设置环境变量E D I TO R.c r o n进程根据它来确定使用哪个编辑器编辑c r o n t a b文件。大部份的U N I X和L I N U X用户都使用v i,如果你也是这样,那么你就编辑$ H O M E目录下的. p r o f i l e文件,在其中加入这样一行: EDITOR=vi; export EDITOR 然后保存并退出。 创建一个名为< u s e r > c r o n的文件,其中< u s e r >是用户名,例如, samcron。在该文件中加入如下的内容。 #(put your own initials here) echo the date to the console every #15 minutes between 6pm and 6am 0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console 保存并退出。确信前面5个域用空格分隔。 在上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中,用t t y 1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。 为了提交你刚刚创建的c r o n t a b文件,可以把这个新创建的文件作为c r o n命令的参数: $su sam crontab samcron 为了方便演示,切换到sam用户环境下,然后用crontab samcron提交给c r o n进程,它将每隔1 5分钟运行一次。 同时,新创建文件的一个副本已经被放在/ v a r / s p o o l / c r o n目录中,文件名就是用户名(即sam)。 #su # cat /var/spool/cron/sam # DO NOT EDIT THIS FILE - edit the master and reinstall. # (samcron installed on Wed Nov 10 21:41:55 2004) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) #(put your own initials here) echo the date to the console every #15 minutes between 6pm and 6am 0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console 回到root下,查看/var/spool/cron/sam 列出crontab文件 为了列出c r o n t a b文件,可以用: $ crontab -l # DO NOT EDIT THIS FILE - edit the master and reinstall. # (samcron installed on Wed Nov 10 21:41:55 2004) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) #(put your own initials here) echo the date to the console every #15 minutes between 6pm and 6am 0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console 你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对c r o n t a b文件做一备份: $ crontab -l > $HOME/mycron 这样,一旦不小心误删了c r o n t a b文件,可以用上一节所讲述的方法迅速恢复。 编辑crontab文件 如果希望添加、删除或编辑c r o n t a b文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑c r o n t a b文件,相应的命令为: $ crontab -e 可以像使用v i编辑其他任何文件那样修改c r o n t a b文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。 例如,加入下面的一条: #DT:delete core files,at 3:30am on 1,7,14,21,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name "core" -exec rm {} \; 现在保存并退出。最好在c r o n t a b文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。 现在让我们使用前面讲过的crontab -l命令列出它的全部信息: #(put your own initials here) echo the date to the console every #15 minutes between 6pm and 6am 0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console #DT:delete core files,at 3:30am on 1,7,14,21,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name "core" -exec rm {} \; 删除crontab文件 为了删除c r o n t a b文件,可以用: $ crontab -r 恢复丢失的crontab文件 如果不小心误删了c r o n t a b文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/ v a r / s p o o l / c r o n / < u s e r n a m e >,其中< u s e r n a m e >是用户名。如果由于权限问题无法完成拷贝,可以用: $ crontab  其中,< f i l e n a m e >是你在$ H O M E目录中副本的文件名。 建议在自己的$ H O M E目录中保存一个该文件的副本。编辑副本,然后重新提交新的文件。 有些c r o n t a b的变体有些怪异,所以在使用c r o n t a b命令时要格外小心。如果遗漏了任何选项,c r o n t a b可能会打开一个空文件,或者看起来像是个空文件。这时敲d e l e t e键退出,不要按< C t r l - D >,否则你将丢失c r o n t a b文件。Linux后台运行命令后面将介绍at。                                      《二》 Linux后台运行命令第二讲,这里介绍at命令,这个命令与cron有一定的关系,这里还会详细介绍at命令的使用方法。我们应该对Linux后台运行命令加以比较分析,可以看出at与cron和crontab命令的区别。 at a t命令允许用户向c r o n守护进程提交作业,使其在稍后的时间运行。一旦一个作业被提交, a t命令将会保留所有当前的环境变量,包括路径,不象c r o n t a b,只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出进行了重定向,绝大多数情况下是重定向到某个文件中。 和c r o n t a b一样,根用户可以通过/ e t c目录下的a t . a l l o w和a t . d e n y文件来控制哪些用户可以使用a t命令,哪些用户不行。不过一般来说,对a t命令的使用不如对c r o n t a b的使用限制那么严格。 a t命令的基本形式为: at [-f script] [-m -l -r] [time] [date] 其中, -f:script 是所要提交的脚本或命令。 -l:列出当前所有等待运行的作业。a t q命令具有相同的作用。 -r:清除作业。为了清除某个作业,还要提供相应的作业标识( I D);有些U N I X变体只接受a t r m作为清除命令。 -m:作业完成后给用户发邮件。 time:at命令的时间格式非常灵活;可以是H、H H . H H M M、H H : M M或H : M,其中H和M分别是小时和分钟。还可以使用a . m .或p . m .。 date:日期格式可以是月份数或日期数,而且a t命令还能够识别诸如t o d a y、t o m o r r o w这样的词。 使用at命令提交命令或脚本 使用a t命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用a t命令提示符。一般来说在提交若干行的系统命令时,使用a t命令提示符方式,在提交s h e l l脚本时,使用命令行方式。 提示符方式: 以在a t命令后面跟上日期/时间并回车。然后就进入了a t命令提示符,这时只需逐条输入相应的命令,然后按‘ < C T R L - D >’退出。 命令行方式: at [-f script] [-m -l -r] [time] [date] 例一:提示符方式 # su sam $ at 10:40 warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh at> find /etc -name "passwd" -print at> <EOT> job 1 at 2004-11-02 10:40 其中, < E O T >就是< C T R L - D >。在10:40系统将执行一个简单的f i n d命令。提交的作业被分配了一个唯一标识job 1。该命令在完成以后会将全部结果以邮件的形式发送给我。 下面这些日期/时间格式都是a t命令可以接受的: at 5.00am May23 at 11.20pm at now +2 hour at 9am tomorrow at 15:00 May24 at now + 10 minutes 例二:命令行方式 如果希望向a t命令提交一个s h e l l脚本,使用其命令行方式即可。在提交脚本时使用- f选项。 如: $ touch db_table.sh $ at 3:00pm tomorrow -f db_table.sh warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh job 3 at 2004-11-02 15:00 在上面的例子中,一个叫做d b _ t a b l e . s h的脚本将在2004-11-02 15:00运行。 还可以使用e c h o命令向a t命令提交作业: $ echo find /etc -name "passwd" -print | at now +1 minute warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh job 4 at 2004-11-01 19:07 列出所提交的作业 一个作业被提交后,可以使用at -l命令来列出所有的作业: $ at -l 1       2004-11-02 10:40 a sam 3       2004-11-02 15:00 a sam 4       2004-11-01 19:07 a sam 其中,第一行是作业标识,后面是作业运行的日期/时间。最后一列a代表a t。 还可以使用a t q命令来完成同样的功能,它是a t命令的一个链接。 直接>atq,相当于>at -l 当提交一个作业后,它就被拷贝到/ v a r / s p o o l / a t目录中,准备在要求的时间运行。 # pwd /var/spool/at # ls -l 清除一个作业 清除作业的命令格式为: atrm [job no] 或at -r [job no] 要清除某个作业,首先要执行at -l命令,以获取相应的作业标识,然后对该作业标识使用at -r 命令,清除该作业。 $ at -l 1       2004-11-02 10:40 a sam 3       2004-11-02 15:00 a sam 4       2004-11-01 19:07 a sam $at -r 3 $at -l 1       2004-11-02 10:40 a sam 4       2004-11-01 19:07 a sam 有些系统使用at-r [job no]命令清除作业。 Linux后台运行命令at就介绍到这里。                                        《三》Linux后台运行命令前面介绍了cron和crontab、at这两个命令,后面这里继续介绍&,使用这个命令将不会占据终端,将进程放入后台运行。还是要讲Linux后台运行命令加以比较学习,结合举例印象更深。 & 当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。 该命令的一般形式为: 命令& 在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。 不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中: command >out.file 2>&1 & 在上面的例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。 例一: 查找名为“httpd.conf”的文件,并把所有标准输出和错误输出重定向到f i n d . d t的文件中: # find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 & [2] 7832 [1]   Done                    find /etc/ -name "httpd.conf" -print >find.dt 2>&1 & 成功提交该命令之后,系统给出了它的进程号7832。 # cat find.dt /etc/httpd/conf/httpd.conf [2]+  Done                    find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 & 查看find.dt,可以看到执行结果 例二: 在后台执行脚本,如:有一个叫psl的脚本 $ps psl & [7878] 用ps命令查看进程 用提交命令时所得到的进程号来监控它的运行。用p s命令和g r e p命令列出这个进程: # ps -x |grep 7832 7868 pts/0    S      0:00 grep 7832 如果系统不支持ps x命令,可以用: # ps -ef |grep 7832 root      7866  7790  0 23:40 pts/0    00:00:00 grep 7832 在用p s命令列出进程时,它无法确定该进程是运行在前台还是后台。 杀死后台进程 杀死后台进程可以使用k i l l命令。当一个进程被放到后台运行时, s h e l l会给出一个进程号,我们可以根据这个进程号,用k i l l命令杀死该进程。该命令的基本形式为: kill -signal [process_number] 现在暂且不要考虑其中的各种不同信号。 在杀进程的时候,执行下面的命令(你的进程号可能会不同)并按回车键。系统将会给出相应的信息告诉用户进程已经被杀死。 $kill 7832 如果系统没有给出任何信息,告诉你进程已经被杀死,那么不妨等一会儿,也许系统正在杀该进程,如果还没有回应,就再执行另外一个k i l l命令,这次带上一个信号选项: $kill - 9 7868 如果用上述方法提交了一个后台进程,那么在退出时该进程将会被终止。下一讲还会介绍另一个Linux后台运行命令n o h u p。                                          《四》Linux后台运行命令cron和crontab、at和&都是在账户登录时运行,如果你不是管理员,那么有可能要退出账户,但是如果进程在退出时还没能运行完,那么这个Linux后台运行命令就会非常有用。 nohug 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用n o h u p命令。该命令可以在你退出帐户之后继续运行相应的进程。n o h u p就是不挂起的意思( no hang up)。 该命令的一般形式为: 代码: nohup command &  使用Linux后台运行命令nohup提交作业 如果使用n o h u p命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为n o h u p . o u t的文件中,除非另外指定了输出文件: 代码: nohup command > myout.file 2>&1  在上面的例子中,输出被重定向到m y o u t . f i l e文件中。 让我们来看一个例子,验证一下在退出帐户后相应的作业是否能够继续运行。我们先提交一个名为p s 1的日志清除进程: 代码: $nobup ps1 & 现在退出该s h e l l,再重新登录,然后执行下面的命令: 代码: $ps x |grep ps1 我们看到,该脚本还在运行。如果系统不支持ps x命令,使用ps -ef|grep ps1命令。                                               《五》Linux后台运行命令已经介绍了cron和crontab、at、&以及nohug,还有一些关系到Linux后台运行命令的只是这里也一并介绍一下,以完善Linux后台运行命令这个系列的文章,达到系统学习的目的。 一次提交几个作业 如果希望一次提交几个命令,最好能够把它们写入到一个s h e l l脚本文件中,并用n o h u p命令来执行它。 例如,下面的所有命令都用管道符号连接在一起;我们可以把这些命令存入一个文件,并使该文件可执行。 cat /home/accounts/qrt_0499 | /apps/bin/trials.awk | sort | lp $cat > quarterend cat /home/accounts/qtr_0499 | /apps/bin/trials.awk | sort | lp <ctrl-D> 现在让它可执行: $ chmod 744 quarterend 我们还将该脚本的所有输出都重定向到一个名为q t r. o u t的文件中。 nobup ./quarterend > qtr.out 2> 后台运行作业的: 有时我们必须要对大文件进行大量更改,或执行一些复杂的查找,这些工作最好能够在系统负荷较低时执行。 创建一个定时清理日志文件或完成其他特殊工作的脚本,这样只要提交一次,就可以每天晚上运行,而且无需你干预,只要看看相应的脚本日志就可以了。c r o n和其他工具可以使系统管理任务变得更轻松。 *,?,[...],[!...]等 ? 匹配文件名中的任何字符串。 ? 匹配文件名中的单个字符。 ? 匹配文件名中的字母或数字字符。 下面就是这些特殊字符: * 匹配文件名中的任何字符串,包括空字符串。 ? 匹配文件名中的任何单个字符。 [...] 匹配[ ]中所包含的任何字符。 [!...] 匹配[ ]中非感叹号!之后的字符。 当s h e l l遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名。 a、*:使用星号*可以匹配文件名中的任何字符串。就不用多说了,和win下差不多 b、?:使用可以匹配文件名中的任何单个字符。和win差不多 c、[]:使用[ . . . ]可以用来匹配方括号[ ]中的任何字符。可以使用一个横杠-来连接两个字母或数字,以此来表示一个范围。 1)列出以i或o开头的文件名: #ls [io]* 2)列出log.开头、后面跟随一个数字、然后可以是任意字符串的文件名: #ls log.[0-9]* 3)与例二相反,列出log.开头、后面不跟随一个数字、然后可以是任意字符串的文件名 #ls log.[!0-9]* 4)列出所有以LPS开头、中间可以是任何两个字符,最后以1结尾的文件名: #ls LPS??1 5)列出所有以大写字母开头的文件名: $ ls [A-Z]* 6)列出所有以小写字母开头的文件名: $ ls [a-z]* 7)为了列出所有以数字开头的文件名: $ ls [0-9]* 8)列出所有以. 开头的文件名(隐含文件,例如. p r o f i l e、. r h o s t s、. h i s t o r y等): $ ls .* 这样就结束了Linux后台运行命令这个系列了。   本文出自 “技术之路---桀” 博客,请务必保留此出处http://litaotao.blog.51cto.com/6224470/1187979... 全文

Linux 后台执行命令

crontab 不能执行sudo

sudo: sorry, you must have a tty to run sudocrontab的时候sudo经常会碰到这个情况,其实修改一下sudo的配置就好了vi /etc/sudoers (最好用visudo命令) 注释掉 Default requiretty 一行 #Default requiretty意思就是sudo默认需要tty终端。注释掉就可以在后台执行了... 全文

crontab 不能执行sodu

DB2批量执行SQL脚本的实现

下面为您介绍的是DB2批量执行SQL脚本的实现方法,如果您在DB2批量执行方面遇到过类似的问题的话,不妨一看,相信对您学习DB2批量执行方面会有所帮助。环境:Windows系统DB2客户端或者服务端一、准备工作运行db2cmd或者db2cw打开DB2命令行处理器进入SQL脚本存放目录... 全文

DB2批量执行

spark 执行诡异问题

今天在centos 6.3上搭建了hadoop+hive+spark 系统,在运行/usr/local/spark-1.0.0/bin/spark-shell  出现找不到hive 相关的类,于是修改了spark-env.sh在spark_classpath 里添加了  hive 的库路径... 全文

spark 执行 诡异问题

php记录代码执行时间

$t1 = microtime(true); // ... 执行代码 ... $t2 = microtime(true); echo '耗时'.round($t2-$t1,3).'秒';简单说一下. microtime() 如果带个 true 参数, 返回的将是一个浮点类型. 这样 t1 和 t2 得到的就是两个浮点数, 相减之后得到之间的差. 由于浮点的位数很长, 或者说不确定, 所以再用个 round() 取出小数点后 3 位. 这样我们的目的就达到了。http://www.cnblogs.com/eczhou/archive/2012/08/16/2642167.html... 全文

php 记录代码 执行时间

python 外部命令执行

 Python 也可以通过os、subprocess执行外部shell命令对POSIX类型系统进行操作。  os 一个很强大的命令,可以通过os下的一些方法去执行shell命令,并且可以对对象执行完的标准输出、标准输入和标准错误输出进行操作。1.os.system    """"... 全文

os python 外部命令执行

mysql环境下执行shell命令

 mysql> \! ls /data/to*/data/syndb.mysql-bin.000017.34889129.sql不能tab键,不方便  推荐使用以下方法:mysql> [1]+  Stopped                 mysql -uroot -p //ctrl+z[root@localhost ~]# jobs[1]+  Stopped                 mysql -uroot -p[root@localhost ~]# fg 1mysql -uroot -p mysql>   复习一下vim里的用法::!command ll /data/可tab键切换,不是补齐。 本文出自 “notepad” 博客,请务必保留此出处http://sndapk.blog.51cto.com/5385144/1134885... 全文

mysql环境下执行shell命令

手工分析DB2 sql文执行计划

在DB2数据库监控中,DB2 sql文执行计划是非常重要的,下面就为您详细介绍手工DB2 sql文执行计划方面的知识,供您按考学习。手工DB2 sql文执行计划:EXPLAIN 表可以在您第一次使用 Visual Explain 时自动进行创建。即使没有创建它们,您也可以手工进行创建,如下:... 全文

DB2 sql文执行计划

python执行系统命令的方法

    做为系统工程师来说,经常会用到python脚本去调用一下系统命令,现把经常使用的集中调用方法总结如下:一,os.system(command)在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态。这个函数执行命令的结果无法保存,只能显示在标准输出。但是,命令执行是否成功的退出状态可以通过变量得到,非0即为不正常。... 全文

系统命令 python 执行

2 3 4 5 6 7 8 9 10 11