请上传宽度大于 1200px,高度大于 164px 的封面图片
    调整图片尺寸与位置
    滚轮可以放大缩小图片尺寸,按住图片拖动可调整位置,多余的会自动被裁剪掉
取消
状元(uid:2639)
职业资格认证:尚未取得认证
Oracle数据库厉行计划详解
Oracle数据库厉行计划的相关知识是本文我们主要要介绍的内容,我们首先介绍了厉行计划的概念,然后给出了两个厉行计划的实例进行说明,最后介绍了Oracle优化器的形式以及厉行计划对我们的用途,接下来就让我们一起来了解一下这部分内容。 什么是厉行计划 所谓厉行计划,望文生义,即便对一个查询任务,做出一份怎样去告终任务的翔实计划。举个生存中的例子,我从珠海要去英国,我能够抉择先去香港然后起色,也能够先去北京起色,可能去广州也能够。然而究竟怎样去英国划算,也即便我的开支起码,这是一件划算考究的事情。同样对于查询而言,我们提交的SQL仅仅是描写出了我们的目标地是英国,但至于怎么去,等闲我们的SQL中是未曾给出提醒消息的,是由数据库来定夺的。 我们先容易的看一个厉行计划的比拟:SQL> set autotrace traceonly 厉行计划一: SQL> select count(*) from t; COUNT(*) ---------- 24815 Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE 10  SORT (AGGREGATE) 21 TABLE Access (FULL) OF 'T' 厉行计划二: SQL> select count(*) from t; COUNT(*) 24815 Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1) 10  SORT (AGGREGATE) 21 INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE)(Cost=26 Card=28180) 这两个厉行计划中,第一个表示求和是穿越举行全表扫描来做的,把全副表中数据读入内存来逐条累加;第二个表示依据表中索引,把全副索引读进内存来逐条累加,而无须去读表中的数据。然而这两种措施究竟哪种快呢?等闲来说可能二比一快,但也不是绝对的。这是一个很容易的例子演示厉行计划的差异。对于混杂的SQL(表连接、嵌套子查询等),厉行计划可能几十种甚至上百种,然而究竟那种良好呢?我们事前并不懂得,数据库本身也不懂得,然而数据库会依据定然的法定可能普查消息(statistics)去抉择一个厉行计划,等闲来说抉择的是比拟优的,但也有抉择失手的时候,这即便这次谈论的价值所在。 Oracle优化器形式 Oracle优化器有两大类,基于法定的和基于代价的,在SQLPLUS中我们能够察看init文件中定义的缺省的优化器形式。 SQL> show parameters optimizer_mode NAME TYPEVALUE optimizer_mode string  CHOOSE SQL> 这是Oracle8.1.7 企业版,我们能够看出,默认安装后数据库优化器形式为CHOOSE,我们还能够设置为 RULE、FIRST_ROWS,ALL_ROWS。能够在init文件中对全副instance的所有会话设置,也能够独自对某个会话设置: SQL> ALTER SESSION SET optimizer_mode = RULE; 会话已改动。 SQL> ALTER SESSION SET optimizer_mode = FIRST_ROWS; 会话已改动。 SQL> ALTER SESSION SET optimizer_mode = ALL_ROWS; 会话已改动。 基于法定的查询,数据库依据表和索引等定义消息,按照定然的法定来发生厉行计划;基于代价的查询,数据库依据搜集的表和索引的数据的普查消息(穿越analyze 号召可能利用dbms_stats包来搜集)归纳来定夺拨取一个数据库感受最优的厉行计划(切实上无须定最优)。RULE是基于法定的,CHOOSE表示万一查询的表存在搜集的普查消息则基于代价来厉行(在CHOOSE形式下Oracle批准的是 FIRST_ROWS),否则基于法定来厉行。在基于代价的两种措施中,FIRST_ROWS指厉行计划批准起码资源尽快的归来局部收获给客户端,对于排序分页页揭示这种查询尤其实用,ALL_ROWS指以大局花费资源起码的措施归来收获给客户端。 基于法定的形式下,数据库的厉行计划等闲比拟安宁。但在基于代价的形式下,我们才有更大的时机抉择最优的厉行计划。也由于Oracle的许多查询方面的个性定然在基于代价的形式下能力揭示出来,因而我们等闲不抉择RULE(并且Oracle号称从 Oracle 10i版本数据库开始将不再扶持 RULE)。既然是基于代价的形式,也即便说厉行计划的抉择是依据表、索引等定义和数据的普查消息来定夺的,这个普查消息是依据 analyze 号召可能dbms_stats包来定期搜集的。率先存在着一种可能,即便由于搜集消息是一个很花费资源和工夫的动作,尤其当表数据量很大的时候,因为搜集消息是对全副表数据举行重新的全面普查,因而这是我们定然端庄琢磨的问题。我们只能在服务器安逸的时候定期的举行消息搜集。这解释我们在一段日期内,普查消息可能和数据库本身的数据并不合乎;另外即便Oracle的普查数据本身也存在着不准确局部(翔实参看Oracle DOCUMENT),更重要的一个问题即便及时普查数据相对曾经比拟准确,然而Oracle的优化器的抉择也并不是始终是最优的计划。这也攀附于Oracle对不同厉行计划的代价的计算法定(我们等闲是无法懂得翔实的计算法定的)。这好像我们定夺从香港还是从北京去英国,车票、机票等切实价格究竟是怎么核算出来的我们并不懂得,可能说我们目前打听的价格消息,在我们乘车前往的时候,恳挚价格跟我们的核算曾经发生了改变。所有的因素,都将波及我们的全副开支。 厉行计划安宁功能带给我们什么 Oracle存在着厉行计划抉择失手的可能。这也是我们经常碰见的一些假象,例如总有人说我的过程在测验数据库中跑的很好,但在产品数据库上即便跑的很差,甚至后者硬件条件比前者还好,这究竟是为什么?硬件资源、普查消息、参数设置都可能对厉行计划发生波及。由于因素太多,我们总是对未来怀着一种莫名的生怕,我的产品数据库上线后究竟跑的好不好?于是Oracle供给了一种安宁厉行计划的力气,也即便把在测验环境中的运行良好的厉行计划所发生的OUTLINES移植到产品数据库,使得厉行计划不会随着其他因素的改变而改变。 那么OUTLINES是什么呢?先要推荐一个内容,Oracle供给了在SQL中利用HINTS来领导优化器发生我们想要的厉行计划的力气。这在多表连接、混杂查询中尤其管用。HINTS的种类许多,能够设置优化器目标(RULE、CHOOSE、FIRST_ROWS、ALL_ROWS),能够指定表连接的次序,能够指定利用哪个表的哪个索引等等,能够对SQL举行许多精细的扼制。穿越这种措施发生我们想要的厉行计划的这些HINTS,Oracle能够存储这些HINTS,我们称之为OUTLINES。穿越STORE OUTLINES能够使得我们具有尔后发生雷同厉行计划的力气,也即便使我们具有了安宁厉行计划的力气。 这里想给出一个附带的解释即便,切实上,我们穿越工具修改SQL,例如利用SQL EXPERT修改后的SQL,这些不但仅是加了HINTS而且文本都曾经发生了改变的SQL,也能够存储OUTLINES,并可被利用到利用中。但这不是定然见效,我们定然测验察看是否见效。但由于就算给了讹谬的OUTLINES,数据库在厉行的时候,揖?智疏忽过去重新生成厉行计划而不会归来讹谬,因而我们才敢塌心的这么利用。当然在Oracle文档中并未曾指明能够这么做,文档中只是解释,万一存在OUTLINES的同时又在SQL中加了HINTS,则会利用OUTLINES而疏忽HINTS。这秉功能在LECCO将公布的产品中会利用这一功能,这么能够将SQL EXPERT的修改SQL的力气和安宁厉行计划的力气联合起来,那么我们就对不能改动源代码的利用具有了相当壮大的SQL优化力气。 可能我们会有疑问,假定安宁了厉行计划,那还搜集普查消息干吗?这是因为几个起因构成的,率先,目前的厉行计划对于未来发生了改变的数据未必即便轻便的,存在着目前的厉行计划不中意未来数据的改变后的效率,而新的普查消息的情形下所发生的厉行计划也并不是全副都科学的。那这个时候,我们能够批准新搜集的普查消息,然而却对新普查消息下不良的厉行计划批准Oracle供给的厉行计划安宁性这个力气安宁厉行计划,这么联合起来我们能够发生顺心的高效的数据库运行环境。 我们还必需关怀的一个东西,Oracle供给的dbms_stats包除非具有搜集普查消息的力气,还具有把数据库中普查消息(statistics)export/import的力气,还具有只搜集普查消息而使得普查消息不利用于数据库的力气(把普查消息搜集到一个特定的表中而不是即刻见效),在这个基础上我们就能够把普查消息export出来再import到一个测验环境中,再运行我们的利用,在测验环境中我们考察最新的普查消息会导致哪些厉行计划发生改变(DB EXPERT的Plan Version Tracer是模仿不同环境并积极察看不同环境中厉行计划改变的工具),是变好了还是变差了。我们能够把变差的这一局部在测验环境中利用hints可能利用工具(SQL EXPERT是在重写SQL这一领土现在最强有力的工具)发生良好的厉行计划的SQL,利用这些SQL能够发生OUTLINES,然后在产品数据库利用最新的普查消息的同时移植进这些OUTLINES。
Oracle新建表空间
create tablespace app_data   datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP01.DBF' size 50m,   'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP02.DBF' size 50m   minimum extent 500k   default storage (initial 500k   next 500k   minextents 3   maxextents 500   pctincrease 50);   表空间名为:app_data   表空间包含数据文件:APP01.DBF、APP02.DBF   各参数说明:   INITIAL: initial定义了第一个区(extent)的大小,第一个区(extent)最小需要两个块(block),也就是2*DB_BLOCK_SIZE.第一个区(extent)的默认大小是5个块(block).   NEXT: next指定了第二个区(extent)的大小,第二个区(extent)最小需要一个块(block),   默认为5个块(block).   MINEXTENTS:指定一个段(segment)被创建时,所分配的区(extent)的最小个数.最小以及默认都为1   MAXEXTENTS:决定了一个段(segment)所能拥有的区(extent)的最大值,这个大小取决于块(block)的大小.若MAXEXTENTS用关键词UNLIMITED指定,也就是等于2147483645这个值.
SQL Server管理工具
联机丛书 联机丛书是SQL Server中最重要的工具之一。建议:不需要记住所有内容,只要记住看过的内容,记住编程的基础知识,记住每天要使用的内容。 SQL Server配置管理器 配置管理器的管理项目分为两部分:服务管理、网络配置。 服务管理: 集成服务——支持Integration Services引擎 分析服务——支持Analysis Services引擎 全文Full Text目录——支持文本搜索功能 报表服务——支持Reporting Services的底层引擎 SQL Server代理——SQL Server中作业调度的主引擎。利用该服务,可以按照不同调度安排作业,其运行的示例包括备份以及例程输入与输出任务。 SQL Server——核心数据库引擎,其功能包括SQL Server数据存储、查询和系统配置。 SQL Server Browser——支持报告服务器,通过浏览局域网可以确认系统是否安装了SQL Server。 SQL Server VSS Write——SQL 编写器服务通过卷影复制服务框架,提供了用来备份和还原 SQL Server 的附加功能。 网络配置:网络库NetLib作为客户应用程序与网络协议之间的”绝缘体”,网络协议实质是用于在网卡之间相互通信的语言,在服务器端,它们的功能相同。 SQL Server 2008提供的NetLib包括:命名管道、TCP/IP、共享内存、VIA( 硬件存储器供应商可能支持的特殊虚拟接口)。 在客户机与服务器计算机上,相同的NetLib必须都可用,这样它们可以通过网络协议彼此进行通信。选择在服务器上不支持的客户机NetLib会导致通信连接失败,返回” Specified SQL Server Not Found ”消息。 无论采用哪种数据访问方法和驱动程序类型(SQL Native Client、ODBC、OLE DB),通常是驱动程序与NetLib通信,步骤: 1、 客户应用程序与驱动程序通信(SQL Native Client、ODBC) 2、 驱动程序调用客户机NetLib 3、 NetLib调用相应的网络协议,并将数据传送给服务器NetLib 4、 服务器NetLib将客户机的请求传送到SQL Server。 为了让客户机与服务器进行连接,服务器必须侦听协议,而客户机使用该协议试图与服务器通信,如果是TCP/IP协议,则要在相同端口上。
SQL存储过程: 用两种方法判断性别
本帖最后由 状元 于 2012-4-12 15:04 编辑 昨天有一朋友问我了这个问题,题目如下:创建一个名为CheckGender的存储过程,该过程接受一个名称作为其参数并检查名称的前缀为Ms. 还是Mr.如果前缀为Ms.则显示“你输入的是女性的名字”,如果前缀是Mr.则显示信息“你输入的是男性的姓名”,按照题目的要求自己设置信息执行上面的存储过程。 我读了两遍之后首先就想到了用两种方法一个是截取(substring),一个是模糊判断(like)。别的也有,不过我第一时间想到的就是这两个,下面我就把这两个判断分享给大家: 第一个方案: create proc CheckGender @sex varchar(80) as if substring(@sex,1,3)='MR.' begin print '你输入的是男性的名字' return end if substring(@sex,1,3)='MS.' begin print '你输入的是女性的名字' return end return 执行存储过程 exec CheckGender 'MR.chen' 输出的信息是 “你输入的是男性的姓名” 第二个方案: create proc CheckGender @sex varchar(80) output as if @sex like 'MR.%' begin print '你输入的是男性的名字' end if @sex like 'MS.%' begin print '你输入的是女性的名字' end 执行存储过程 exec CheckGender 'MR.chen' 输出的信息是 “你输入的是男性的姓名”
Oracle启动程序方式详细介绍
1、startup nomount 非安装启动,这种方式启动下可执行:重建控制文件、重建数据库读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。 2、startup mount dbname 安装启动,这种方式启动下可执行: 数据库日志归档、 数据库介质恢复、 使数据文件联机或脱机, 重新定位数据文件、重做日志文件。 执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,但此时不对数据文件和日志文件进行校验检查。 3、startup open dbname 先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,这种方式下可访问数据库中的数据。 4、startup,等于以下三个命令 startup nomount alter database mount alter database open 5、startup restrict 约束方式启动 这种方式能够启动数据库,但只答应具有一定特权的用户访问 非特权用户访问时,会出现以下提示: ERROR: ORA-01035: Oracle 只答应具有 RESTRICTED session 权限的用户使用 6、startup force 强制启动方式,当不能关闭数据库时,可以用startup force来完成数据库的关闭,先关闭数据库,再执行正常启动数据库命令 7、startup pfile=参数文件名 带初始化参数文件的启动方式 先读取参数文件,再按参数文件中的设置启动数据库 例:startup pfile=E:\Oracle\admin\oradb\pfile\init.ora 8、startup EXCLUSIVE
Oracle数据库SqlLoad常用技巧总结
Oracle数据库SqlLoad常用技巧的相关知识是本文我们主要要介绍的内容,本文我们总结了14种SqlLoad的使用技巧,并给出了测试用的文件源码,接下来我们就开始一一介绍这部分内容,希望能够对您有所帮助。 1、控制文件中注释用“--”。 2、为防止导入出现中文乱码,在控制文件中加入字符集控制 LOAD DATA CHARACTERSET ZHS16GBK 3、让某一列成为行号,用RECNUM关键字 load data infile * into table t replace ( seqno RECNUM //载入每行的行号 text Position(1:1024)) BEGINDATA fsdfasj 4、过滤某一列,用FILLER关键字 LOAD DATA TRUNCATE INTO TABLE T1 FIELDS TERMINATED BY ',' ( field1, field2 FILLER, field3 ) 5、过滤行 在INTO TABLE table_name后加WHEN过滤条件,但功能有限,如果以竖线分隔符的文件,不能实现字段级的过滤,定长的还好。 LOAD DATA INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis' APPEND INTO TABLE my_selective_table WHEN (01) 'T' and (30:37) = '20031217' ( region CONSTANT '31', service_key POSITION(01:11) INTEGER EXTERNAL, call_b_no POSITION(12:29) CHAR ) 6、过滤首行,用OPTIONS (SKIP 1)选项,也可以写在命令行中,如: sqlldr sms/admin control=test.ctl skip=1 7、TRAILING NULLCOLS的使用,作用是表的字段没有对应的值时允许为空 如: LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应的列的值的如果第一行改为 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了 (DEPTNO, DNAME "upper(:dname)", // 使用函数 LOC "upper(:loc)", LAST_UPDATED date 'dd/mm/yyyy', // 日期的一种表达方式 还有'dd-mon-yyyy' 等 ENTIRE_LINE ":deptno||:dname||:loc||:last_updated" ) BEGINDATA 10,Sales,Virginia,1/5/2000 20,Accounting,Virginia,21/6/1999 30,Consulting,Virginia,5/1/2000 40,Finance,Virginia,15/3/2001 8、添加、修改数据 (1)、 LOAD DATA INFILE * INTO TABLE tmp_test ( rec_no "my_db_sequence.nextval", region CONSTANT '31', time_loaded "to_char(SYSDATE, 'HH24:MI')", data1 POSITION(1:5) ":data1/100", data2 POSITION(6:15) "upper(:data2)", data3 POSITION(16:22)"to_date(:data3, 'YYMMDD')" ) BEGINDATA 11111AAAAAAAAAA991201 22222BBBBBBBBBB990112 (2)、 LOAD DATA INFILE 'mail_orders.txt' BADFILE 'bad_orders.txt' APPEND INTO TABLE mailing_list FIELDS TERMINATED BY "," ( addr, city, state, zipcode, mailing_addr "decode(:mailing_addr, null, :addr, :mailing_addr)", mailing_city "decode(:mailing_city, null, :city, :mailing_city)", mailing_state ) 9、合并多行记录为一行记录 通过关键字concatenate 把几行的记录看成一行记录: LOAD DATA INFILE * concatenate 3 // 通过关键字concatenate 把几行的记录看成一行记录 INTO TABLE DEPT replace FIELDS TERMINATED BY ',' (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED date 'dd/mm/yyyy' ) BEGINDATA 10,Sales, // 其实这3行看成一行 10,Sales,Virginia,1/5/2000 Virginia, 1/5/2000 10、用”|+|”分隔符,避免数据混淆:fields terminated by "|+|" 11、如果数据文件包含在控制文件中,用INFILE * 如下: LOAD DATA INFILE * append INTO TABLE tmp_test FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( data1, data2 ) BEGINDATA 11111,AAAAAAAAAA 22222,"A,B,C,D," 12、一次导入多个文件到同一个表 LOAD DATA INFILE file1.dat INFILE file2.dat INFILE file3.dat APPEND INTO TABLE emp ( empno POSITION(1:4) INTEGER EXTERNAL, ename POSITION(6:15) CHAR, deptno POSITION(17:18) CHAR, mgr POSITION(20:23) INTEGER EXTERNAL ) 13、将一个文件导入到不同的表 (1)、 LOAD DATA INFILE * INTO TABLE tab1 WHEN tab = 'tab1' ( tab FILLER CHAR(4), col1 INTEGER ) INTO TABLE tab2 WHEN tab = 'tab2' ( tab FILLER POSITION(1:4), col1 INTEGER ) BEGINDATA tab1|1 tab1|2 tab2|2 tab3|3 ============== (2)、 LOAD DATA INFILE 'mydata.dat' REPLACE INTO TABLE emp WHEN empno != ' ' ( empno POSITION(1:4) INTEGER EXTERNAL, ename POSITION(6:15) CHAR, deptno POSITION(17:18) CHAR, mgr POSITION(20:23) INTEGER EXTERNAL ) INTO TABLE proj WHEN projno != ' ' ( projno POSITION(25:27) INTEGER EXTERNAL, empno POSITION(1:4) INTEGER EXTERNAL ) 14、过滤掉的数据文件路径指定 /opt/app/oracle/product/10.2.0/bin/sqlldr APS/APS control=/home/oracle/APS_LOAD/ctl/AP_CONTRACT.CTL LOG=/home/oracle/APS_LOAD/log/$yesterday/AP_CONTRACT_$yesterday.log bad=/home/oracle/APS_LOAD/bad/DUE_BILL_$yesterday.bad rows=10000 readsize=20000000 bindsize=20000000 DISCARD=/home/oracle/APS_LOAD/bad/discard_ts.dis 15、附:测试用控制文件 LOAD DATA INFILE '/home/oracle/APS_LOAD/dat/APS_AP_CONTRACT.dat' TRUNCATE INTO TABLE AP_CONTRACT WHEN (01)<>'1' FIELDS TERMINATED BY "|" TRAILING NULLCOLS ( AGMT_NO "(TRIM(:AGMT_NO ))", CONTRACT_NO FILLER, -- "(TRIM(:CONTRACT_NO ))", LOAN_AMT "(TRIM(:LOAN_AMT ))", AGMT_HOLDER "(TRIM(:AGMT_HOLDER ))", LOAN_TYPE_CD "(TRIM(:LOAN_TYPE_CD ))", CURR_CD "(TRIM(:CURR_CD ))", BALANCE "(TRIM(:BALANCE ))", LOAN_DIRC_CD "(TRIM(:LOAN_DIRC_CD ))", AGMT_START_DATE "(TRIM(:AGMT_START_DATE ))", AGMT_END_DATE "(TRIM(:AGMT_END_DATE ))", AGMT_BELONG_ORG_NO "(TRIM(:AGMT_BELONG_ORG_NO ))", MANAGER_NO "(TRIM(:MANAGER_NO ))", PROCESS_RATE "(TRIM(:PROCESS_RATE ))", INSURE_METH_TYPE_CD "(TRIM(:INSURE_METH_TYPE_CD ))", AGMT_SIGN_DATE "(TRIM(:AGMT_SIGN_DATE ))", LOAN_PROP_CD "(TRIM(:LOAN_PROP_CD ))", LOAN_USE_TYPE "(TRIM(:LOAN_USE_TYPE ))", ENTRUST_LOAN_FLAG "(TRIM(:ENTRUST_LOAN_FLAG ))", ENTRUST_NAME "(TRIM(:ENTRUST_NAME ))", FARM_LOAN_FLAG "(TRIM(:FARM_LOAN_FLAG ))", FARM_LOAN_TYPE_CD "(TRIM(:FARM_LOAN_TYPE_CD ))", LOAN_BIZ_TYPE_CD "(TRIM(:LOAN_BIZ_TYPE_CD ))", ID_TEST RECNUM , CHAR_TEST CONSTANT '31', SQ "sqlldr.nextval", TEST_4 "TO_CHAR(SYSDATE,'YYYYMMDD HH24:MI:SS')", TEST_5 "(TRIM(:LOAN_BIZ_TYPE_CD)||'---'||TRIM(:AGMT_NO))" )
Oracle数据库进程之后台进程详解
本文我们主要介绍一下Oracle数据库的后台进程的相关知识,我们知道,Oracle实例包括两部分:SGA 和一组后台进程。后台进程执行保证数据库运行所需的实际维护任务。 例如,有一个进程为我们维护块缓冲区缓存,根据需要将块写出到数据文件。另一个进程负责当在线重做日志文件写满时将它复制到一个归档目标。另外还有一个进程负责在异常中止进程后完成清理,等等。每个进程都专注于自己的任务,但是会与所有其他进程协同工作。例如,负责写日志文件的进程填满一个日志后转向下一个日志时,它会通知负责对填满的日志文件进行归档的进程,告诉它有活干了。 可以使用一个V$视图查看所有可能的Oracle 后台进程,确定你的系统中正在使用哪些后台进程: SQL> select paddr, name, descriptionfrom v$bgprocess order by paddr desc; PADDR NAME DESCRIPTION -------- --------------------------------------------------------------------- 3621D49C QMNC AQ Coordinator 3621CEE8 ARC2 Archival Process 2 3621C934 ARC1 Archival Process 1 3621C380 ARC0 Archival Process 0 3621A148 MMNL Manageability Monitor Process 2 36219B94 MMON Manageability Monitor Process 362195E0 CJQ0 Job Queue Coordinator 3621902C RECO distributed recovery 36218A78 SMON System Monitor Process 362184C4 CKPT checkpoint 36217F10 LGWR Redo etc. PADDR NAME DESCRIPTION -------- --------------------------------------------------------------------- 3621795C DBW0 db writer process 0 362173A8 MMAN Memory Manager 36216DF4 PSP0 process spawner 0 36216840 PMON process cleanup 00 DIAG diagnosibility process 00 FMON File Mapping Monitor Process 00 LMON global enqueue servicemonitor 00 LMD0 global enqueue servicedaemon 0 ..... 00 ASMB ASM Background 00 GMON diskgroup monitor 157 rows selected. 注意:这个视图中PADDR 不是00 的行都是系统上配置和运行的进程(线程)。有两类后台进程:有一个中心(focused)任务的进程(如前所述)和完成各种其他任务的进程(即工具进程)。例如,内部作业队列( jobqueue)有一个工具后台进程,可以通过DBMS_JOB 包使用它。这个进程会监视作业队列,并运行其中的作业。在很多方面,这就像一个专用服务器进程,但是没有客户连接。 下面会分析各种后台进程,先来看有中心任务的进程,然后再介绍工具进程。 中心后台进程 图5-4 展示了有一个中心(focused)用途的Oracle 后台进程。 http://images.51cto.com/files/uploadimg/20110824/1043450.gif 启动实例时也许不会看到所有这些进程,但是其中一些主要的进程肯定存在。如果在ARCHIVELOG 模式下,你可能只会看到ARCn(归档进程),并启用自动归档。如果运行了Oracle RAC,这种Oracle 配置允许一个集群中不同机器上的多个实例装载并打开相同的物理数据库,就只会看到LMD0、LCKn、LMON 和LMSn。 意为简洁起见,图5-4 中没有画出共享服务器调度器(Dnnn)和共享服务器(Snnn)进程。因此,图5-4 大致展示了启动Oracle 实例并装载和打开一个数据库时可能看到哪些进程。例如,在我的Linux 系统上,启动实例后,有以下进程: $ ps -ef|grep 'ora_.*_dave*' oracle 4123 1 0 20:13 ? 00:00:05 ora_pmon_dave1 oracle 4125 1 0 20:13 ? 00:00:05 ora_psp0_dave1 oracle 4127 1 0 20:13 ? 00:00:02 ora_mman_dave1 oracle 4129 1 0 20:13 ? 00:00:05 ora_dbw0_dave1 oracle 4131 1 0 20:13 ? 00:00:21 ora_lgwr_dave1 oracle 4133 1 0 20:13 ? 00:00:13 ora_ckpt_dave1 oracle 4135 1 1 20:13 ? 00:01:12 ora_smon_dave1 oracle 4137 1 0 20:13 ? 00:00:04 ora_reco_dave1 oracle 4139 1 0 20:13 ? 00:00:16 ora_cjq0_dave1 oracle 4141 1 1 20:13 ? 00:01:33 ora_mmon_dave1 oracle 4143 1 0 20:13 ? 00:00:08 ora_mmnl_dave1 oracle 4145 1 0 20:13 ? 00:00:00 ora_d000_dave1 oracle 4147 1 0 20:13 ? 00:00:00 ora_s000_dave1 oracle 4156 1 0 20:13 ? 00:00:01 ora_arc0_dave1 oracle 4158 1 0 20:13 ? 00:00:05 ora_arc1_dave1 oracle 4163 1 0 20:14 ? 00:00:03 ora_qmnc_dave1 oracle 4167 1 0 20:15 ? 00:00:24 ora_q000_dave1 oracle 4169 1 020:15 ? 00:00:00 ora_q001_dave1 oracle 5109 1 1 21:48 ? 00:00:00 ora_j000_dave1 oracle 5141 5111 0 21:49 pts/4 00:00:00 grep ora_.*_dave2*
Oracle编程 操作不良习惯总结
接触oracle多年了,发现自己和身边的一些人在oracle的使用中存在一些不好的开发操作方式,特写出以便借鉴。   一.oracle编程方面:   1. oracle的代码书写格式不规范,可以参照oracle自带的代码格式进行编写。   2. oracle对象的命名规则要统一,不要使用数字、中文、拼音,要做到知名见义。   3. 表名、字段名必须要加注释。   例:comment on table 表名 is '对表注释的内容'; --给表添加注释   comment on column 表名.列名 is '对列注释的内容'; --给列添加注释   4. 表的约束必须单独建立,不要在列名后直接加primary, unique and foreign key constraints 等。   5. 存储过程中的输入输出参数必须命名规范,不要交叉书写。   6. 各参数及中间变量的定义,尽量使用 %type来定义,所有变量都要加注释。   7. 存储过程必须要有异常处理部分(中间过程除外,由调用它的过程来处理异常)。   8. 用游标返回结果时,异常处理部分也必须要有游标返回。   9. select语句要列出具体字段名,严禁使用select * 方式。   10. insert语句要列出具体字段名,严禁使用insert into tablename values ( … )方式,   或insert into tablename ( … ) values ( … )方式,或insert into tablename select * 方式。   11. 能用静态SQL实现的逻辑,尽量不使用动态SQL,如果使用动态SQL尽可能的绑定变量。   12. 如果存储过程或函数返回游标类型参数,必须在任何出口前打开游标,用完后必须关闭。   13. insert into语句不要随意回车换行,不然加载时会报错的。   14. 存储过程、函数的结尾用 ‘ END 对象名;’ 有时会报错的,直接写 END; 结束。   15. 不同类型的对象脚本应该写在不同的文件中,严禁混写。   16. 有多个域的数据库,数据脚本中必须使用 ‘域名.对象名’,防止混淆。   17. 存储过程、函数必须要有相应的注释说明。   二.oracle操作方面:   1. 各人使用各自账户登录,禁止随意使用系统帐号登录,严格控制dba账户。   2. 严禁在 PL/SQL 中用 select * from t_tablename for update 或select t.*,t.rowid from t_tablename t 点击锁图标方式编辑数据。   3. 严禁在业务高峰期使用页面工具导入大量数据,大数据量的导入导出必须使用专门的工具处理。   4. 严禁在业务高峰期在 PL/SQL 中直接test存储过程、函数,容易锁表。   5. 严禁在业务高峰期对大表加索引,建索引前最好看下索引表空间是否够用。   6. 严禁随意修改、编译数据库对象,修改、编译后要马上检查是否有失效的对象。   7. 建表空间前,先登录小型机查看/dev/目录下面的空间是否够用,然后再根据命名规则创建。   8. 日常建立的临时表、中间表用完后要及时清理,先truncate table,然后drop table。   9. 严禁在不操作的情况下长时间登录服务器,用完后必须及时退出。   10. 严禁在线网数据库进行无关的操作。   11. 严禁随意删除系统日志、告警日志、windows事件查看器中的日志、各服务器日志等。   12. 确实需要重启服务时,必须先征得相关部门和人员的同意,严禁私自重启服务。   13. 严禁在业务高峰期进行任何升级操作,特殊情况除外,必须通知到所有相关人员,做完后要及时测试。   14. 所有删除、更新操作前必须先进行备份,严禁不备份直接操作。   15. 使用truncate命令前一定要谨慎,确认无误后再操作。   16. 严禁使用‘kill -9 进程号’ 来结束小型机进程,搞不好会宕机的。   以上就是一些常见的不良使用习惯,希望能加以借签改正,养成良好的使用习惯。
探讨Oracle数据库的数据导入方法
本帖最后由 状元 于 2012-4-12 14:55 编辑 每个数据库管理员都会面临数据导入的问题,这有可能发生在数据库的新老移植过程中,或者是在数据库崩溃后的恢复重建过程中,还有可能是在创建测试数据库的模拟环境过程中,总之作为一名合格的数据库管理员,你应该做好接受各种数据导入请求的技术储备,同时还要尽量满足人本能的对导入速度的苛求。本文仅针对 Oracle 数据库所提供的加速数据导入的各种特性和技术进行探讨,其中的一些方法也可以转化应用于其他数据库。以下七种数据导入方法哪个最适用需要针对具体情况具体分析,我也附带列举了影响导入速度的各种因素供斟酌。为了比较各种数据导入方法的效果,我创建了示例表和数据集,并用各种方法导入示例数据集来计算总体导入时间和导入进程占用 CPU 时间,这里得出的时间仅供参考。需要说明的是,建议你使用 Oracle 9i 企业版数据库,当然你也可以尝试使用 Oracle 7.3 以上的标准版数据库。本文使用的机器配置为:CPU Intel P4,内存 256M,数据库 Oracle 9i 企业版。   示例表结构和数据集   为了演示和比较各种数据导入方法,我假定数据导入任务是将外部文件数据导入到 Oracle 数据库的CALLS表中,外部数据文件包含十万条呼叫中心记录,将近 6MB 的文件大小,具体的数据示例如下:   82302284384,2003-04-18:13:18:58,5001,投诉,手机三包维修质量   82302284385,2003-04-18:13:18:59,3352,咨询,供水热线的号码   82302284386,2003-04-18:13:19:01,3142,建议,增设公交线路   接受导入数据的表名是 CALLS,表结构如下: 以下是代码片段: Name Null? Type Comment   ------------ --------- ------------- -----------------   CALL_ID NOT NULL NUMBER Primary key   CALL_DATE NOT NULL DATE Non-unique index   EMP_ID NOT NULL NUMBER   CALL_TYPE NOT NULL VARCHAR2(12)   DETAILS VARCHAR2(25)   逐条数据插入INSERT   数据导入的最简单方法就是编写 INSERT 语句,将数据逐条插入数据库。这种方法只适合导入少量数据,如 SQL*Plus 脚本创建某个表的种子数据。该方法的最大缺点就是导入速度缓慢,占用了大量的 CPU 处理时间,不适合大批量数据的导入;而其主要优点就是导入构思简单又有修改完善的弹性,不需要多做其它的准备就可以使用。如果你有很多时间没法打发,又想折磨一下数据库和 CPU,那这种方法正适合你。   为了与其它方法做比较,现将十万条记录通过此方法导入到 CALLS 表中,总共消耗 172 秒,其中导入进程占用 CPU 时间为 52 秒。   逐条数据插入 INSERT,表暂无索引   为什么上一种方法占用了较多的 CPU 处理时间,关键是 CALLS 表中已创建了索引,当一条数据插入到表中时,Oracle 需要判别新数据与老数据在索引方面是否有冲突,同时要更新表中的所有索引,重复更新索引会消耗一定的时间。因此提高导入速度的好办法就是在创建表时先不创建索引或者在导入数据之前删除所有索引,在外部文件数据逐条插入到表中后再统一创建表的索引。这样导入速度会提高,同时创建的索引也很紧凑而有效,这一原则同样适用于位图索引(Bitmap Index)。对于主要的和唯一的关键约束(key constraints),可以使之先暂时失效(disabling)或者删除约束来获得同样的效果,当然这些做法会对已经存在的表的外键约束产生相关的影响,在删除前需要通盘斟酌。
简单介绍一下Oracle数据库的三个进程
本帖最后由 状元 于 2012-4-12 14:55 编辑 Oracle数据库有三个进程:User Process,Server Process和Background Process。它们的作用是什么呢?接下来我们就一一介绍。   User Process是运行在客户端的,它不在数据库服务器上,当然如果你在服务器上运行客户端那它就在服务器上。比如我们在Windows下运行的PL/SQL Developer的进程就是一个User Process。   Server Process为主要处理客户端和服务器连接的进程,当然它还有其他的功能。当一个客户端连接到服务器时,我们会在服务器的进程上看到多了一个进程,这个进程就是Server Process。   Background Process当数据库实例开始启动的时候,它就启动了。   客户端和服务器不在一个机器上,那么当客户端连接到服务器的时候,就是通过TCP/IP的方式进行连接的。当客户端和服务器都在一个机器上,并且这个机器是Linux的时候,那么这个时候的连接最有可能的是使用IPC连接的,IPC是Inter Process Communication,当然也有可能是通过TCP/IP方式的。我们可以通过/sbin/ifconfig这个文件查看Linux网卡的情况,我们会发现一个网卡叫eth0,另一个是lo,lo是一个本地回路(Local Loopback),IP地址永远为127.0.0.1,是用于本地通讯的。   Background Process是用来维护和强制物理和内存结构的关系。   主要的background processes:   DBWn PMON CKPT LGWR SMON   可选的background processes:   ARCn LMDn QMNn CJQn LMON RECO Dnnn LMS Snnn LCKn Pnnn
Oracle在Solaris操作系统上实现异步I/O
本帖最后由 状元 于 2012-4-12 14:55 编辑 VXFS文件系统是Veritas公司推出的一种高性能,高可用性的文件系统,一般用于数据中心。它是一种基于扩展的文件系统,能够让应用程序读取和写入大的连续块,适用于OLTP系统和DSS系统……   一、 VXFS文件系统的简介   VXFS文件系统是Veritas公司推出的一种高性能,高可用性的文件系统,一般用于数据中心。它是一种基于扩展的文件系统,能够让应用程序读取和写入大的连续块,适用于OLTP系统和DSS系统。   Oracle数据库在Solaris操作系统上的vxfs文件系统上是可以实现异步I/O的,那Oracle数据库在vxfs文件系统中究竟该不该使用异步I/O?如何去判断是否Oracle数据库是真正实现了异步I/O?下面就这几个问题来具体的看看Oracle数据库在vxfs文件系统上的异步I/O。   二、 VXFS文件系统上如何启用异步I/O   首先我们必须要知道Solaris操作系统上那些磁盘上的文件系统是vxfs格式的,如何来查看一下哪些磁盘是属于vxfs格式的呢,可以使用如下的命令来查看: 以下是代码片段: Df -F vxfs   /opt/oracle/db02 (/dev/vx/dsk/ipasdg/db02_vol):55665072 blocks 869766 files   /opt/oracle/db03 (/dev/vx/dsk/ipasdg/db03_vol):41688928 blocks 651380 files   /opt/oracle/db04 (/dev/vx/dsk/ipasdg/db04_vol):41688928 blocks 651380 files   /opt/oracle/arch (/dev/vx/dsk/ipasdg/arch_vol):164632064 blocks 2572348 files   /backup (/dev/vx/dsk/ipasdg/backup_vol):314529872 blocks 4914519 files   如果想在vxfs上面使用异步I/O,首先必须要安装一个叫做Quick I/O的模块,并且要启用Quick I/O,这个模块是需要单独向Veritas公司购买license的。默认的时候vxfs文件系统mount的时候是启用了Quick I/O的,如果在mount的时候指定了-o noqio的选项,那么Quick IO是被禁用的。   如果想查看在一个文件系统上是否采用了Quick IO,常用的fsadmin,fstype这些命令都无法看出来,/etc/mnttab、/etc/vfstab这些文件也没有记录相关的信息。这里 介绍一种方法可以查看文件是否是Quick I/O的文件:   ls -al 列出所有文件,包括Quick I/O文件和它的链接. 以下是代码片段: $ ls -al d* .d*   -rw-r--r-- 1 dba 104890368 Oct 2 13:42 .dbfile   lrwxrwxrwx 1 dba 17 Oct 2 13:42 dbfile -> \ .dbfile::cdev:vxfs:   ls -lL 显示是否Quick I/O被成功安装和启用。 以下是代码片段: $ ls -lL dbfile   crw-r--r-- 1 dba 45, 1 Oct 2 13:42 dbfile   第一个字符c,表明这是一个裸字符设备文件,如果没有这个字符则表明Quick I/O没有正确安装或者是没有一个合法的license key。   确认文件系统启用了Quick I/O后,然后就可以给Oracle配置异步I/O了,在Oracle的初始化参数中配置DISK_ASYNCH_IO = TRUE,然后重启数据库让其生效。   因为启用了Quick I/O后,在OS级别上是消除了缓冲的,所以数据库的buffer cache在启用了Quick I/O后是应该需要增加的。
用Oracle闪回功能恢复偶然丢失的数据
人为的错误是数据库系统失败的重要原因之一,根据调查约40%的系统问题是操作失误或者用户错误引起的,这些人为的错误又特别难以避免。传统上当发生数据丢失、数据错误问题时,解决的主要方法就是数据的导入/导出、备份/恢复技术。这些方法都需要发生数据错误之前有一个正确的备份,才能进行恢复。恢复时不取决于错误程度,而只取决于备份/恢复策略。这种方法既耗时又使数据库系统不能提供服务,对于一些用户偶然地删除数据这类小错误来说显得有些"大材小用"。那么如何来恢复这种偶然的错误操作造成的数据丢失呢?从Oracle 9i开始提供了基于回滚段的闪回查询(Flashback Query)功能,可用于恢复错误的DML操作。在Oracle 10g中对闪回查询做了较大改进,不再局限于闪回查询,还可用于恢复错误的DDL(Drop)操作、闪回表、闪回数据库等。   Oracle 9i的闪回查询概述   1、Oracle 9i的闪回查询功能   在Oracle 9i之前,如果用户错误操作数据后,除了不完全恢复外,没有好的解决办法。Oracle 9i中提供闪回查询,由一个新的包DBMS_FLASH来实现。用户使用闪回查询可以及时取得误操作DML(Delete、Update、Insert)前某一时间点数据库的映像视图,用户可以利用系统时间或系统改变号(SCN:System Change Number)来指定这个只读视图,并可以针对错误进行相应的恢复措施。闪回查询功能完全依赖于自动回滚段管理(AUM),对于Drop等误操作不能恢复。闪回特性可应用在以下方面:   (1)自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复。   (2)恢复Email和声音Email:当用户意外删除了Email或者声音信息时,可以通过移回到固定时间点来恢复删除。   (3)账号平衡状况:可以查看以前的历史数据。如银行外币管理中用于记录特定时间的汇率。在以前,汇率变更被记录在一个历史表中,现在就可以通过闪回功能进行查询。   (4)用于趋势分析的决策支持系统:决策支持系统和联机分析应用必须执行一个长时间的事务。使用闪回查询,这些应用可以对历史数据执行分析和建模。例如,特定产品如矿泉水随季节变化需求情况的变化。   2、回滚段概述   回滚段用于存放数据修改之前的位置和值,回滚段的头部包含正在使用的该回滚段事务的信息。回滚段的作用如下:   (1)事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务时,Oracle将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。   (2)事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,Oracle将在下次打开数据库时利用回滚来恢复未提交的数据。   (3)读一致性:当一个会话正在修改数据时,其它的会话将看不到该会话未提交的修改。而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。   3、Oracle中Delete和Commit操作的流程分析   (1)删除(Delete)流程   ·Oracle读Block(数据块)到Buffer Cache(缓冲区)(如果该Block在Buffer中不存在);   ·在Redo Log Buffer(重做日志缓冲区)中记录Delete操作的细节;   ·在相应回滚段段头的事物表中创建一个Undo(回滚)条目;   ·把将要删除的记录创建前镜像,存放到Undo Block(回滚块)中;   ·在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty(脏)。
个人成就
内容被浏览77,507
加入社区12年268天
返回顶部