aaron note oracle
Oracle: http://richie.blog.js0573.com/ http://database.51cto.com/art/200511/12457.htm http://bbs.51cto.com/forum-42-1.html http://www.itpub.net/forum4.html http://aaron:5561/isqlplus/ http://aaron:5561/isqlplus/dba/ http://aaron.abc.com:1158/em/console/logon/logon http://publish.itpub.net/oracle.shtm -------------------------------------------------------- Manual: Oracle Database Reference http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/toc.htm Oracle SQL Reference http://download-uk.oracle.com/docs/cd/B14117_01/server.101/b10759/toc.htm ------------------------------------------------------- RMAN遇到数据不一致恢复: pfile添加_allow_resetlogs_corruption=true -------------------------------------------------------- 由dedicated设置为mts http://blog.oracle.com.cn/2446/viewspace_2774.html --------------------------------------------------------- oracle optimize in win2000: 1. 磁盘: 在磁盘上建立数据文件前首先运行磁盘碎片整理程序;不要使用磁盘压缩;不要使用磁盘加密;不要使用超过70%的磁盘空间;硬件RAID;日志文件不要放在RAID 5;分离页面交换文件到多个磁盘物理卷 2. CPU: 把系统配置为应用服务器;监视系统中消耗中断的硬件;保持最小的安全审计记录; 3. 网络: 只保留TCP/IP协议;优化网络协议绑定顺序;为Oracle禁止或优化文件共享 4. 关于超过4GB内存: Oracle9i 发行号1(Release 1)不支持AWE,所有的Oracle 8i发行号(releases 8.1.5–8.1.7)都支持AWE。Oracle在9i发行号2(Release 2)中实现了对AWE的支持。 /PAE开关 boot.ini 超过4GB内存(win 2000):必须有Pentium Pro或更新的处理器,必须运行Windows 2000高级服务器或Windows 2000数据中心服务器 在Oracle9i发行号2中,参数DB_BLOCK_BUFFERS被参数DB_CACHE_SIZE所代替 USE_INDIRECT_BUFFERS=TRUE,你将只能定义和使用单个数据库块大小和块缓冲区 使用RAC,克服内存限制,还提供某些其它的利益 ----------------------------------------------------------- SGA allocate: 基本掌握的原则是, data buffer 通常可以尽可能的大,shared_pool_size 要适度(通常200M--300M),log_buffer 通常大到几百K到1M就差不多了 设置之前,首先要明确2个问题 first,除去OS和一些其他开销,能给ORACLE使用的内存有多大 second,oracle是64bit or 32 bit,32bit 通常 SGA有 1.7G 的限制(某些OS的处理或者WINDOWS上有特定设定可以支持到2G以上甚至达到3.7G,本人无这方面经验) shared_pool_size 通常应该控制在200M--300M,如果是 ORACLE ERP 一类的使用了很多存储过程函数、包,或者很大的系统,可以考虑增大shared_pool_size ,但是如果超过500M可能是危险的,达到1G可能会造成CPU的严重负担,系统甚至瘫痪。所以shared_pool_size 如果超过300M还命中率不高,那么应该从应用上找原因而不是一味的增加内存,shared_pool_size 过大主要增加了管理负担和latch 的开销。 log_buffer : 128K ---- 1M 之间通常问题不大,不应该太大 large_pool_size :如果不设置MTS,通常在 RMAN 、OPQ 会使用到,但是在10M --- 50M 应该差不多了。假如设置 MTS,则由于 UGA 放到large_pool_size 的缘故,这个时候依据 session最大数量和 sort_ares_size 等参数设置,必须增大large_pool_size 的设置,可以考虑为 session * (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTS,我们都不主张使用MTS,尤其同时在线用户数小于500的情况下。 java_pool_size : 若不使用java,给30M通常就够了 data buffer ,在做了前面的设置后,凡可以提供给oracle的内存,都应该给data buffer = (db_block_size * db_block_buffers) 在9i 中可以是 db_cache_size 还有2个重要参数我们需要注意 sort_area_size and hash_area_size 这两个参数在非MTS下都是属于PGA ,不属于SGA,是为每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑这两部分 (****) : OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + 2M) < 总物理RAM 为好 这样归结过来,假定oracle是 32 bit ,服务器RAM大于2G ,注意你的PGA的情况,,则建议 shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G 再具体化,注意满足上面(****) 的原则的基础上可以参考如下设置 如果512M RAM 建议 shared_pool_size = 50M, data buffer = 200M 如果1G RAM shared_pool_size = 100M , data buffer = 500M 如果2G shared_pool_size = 150M ,data buffer = 1.2G 物理内存再大已经跟参数没有关系了 假定64 bit ORACLE 内存4G shared_pool_size = 200M , data buffer = 2.5G 内存8G shared_pool_size = 300M , data buffer = 5G 内存 12G shared_pool_size = 300M-----800M , data buffer = 8G 在设置参数的同时,init中使用 lock_sga,在设置参数的同时,init中使用 lock_sga v$version,v$system_event,v$sysstat,v$sesstat,v$latch v$sga,v$sgastat -------------------------------------------------------- login and startup: ***about login*** when sqlplus can not connect to database, use the following cmd: sqlplus /nolog 'connect / as sysdba' or 'connect sys@service_name as sysdba' startup before 9i, use 'svrmgrl', that is Server Manager ***startup*** 1、startup nomount 2、startup mount dbname 3、startup open dbname 4、startup=startup nomount+alter database mount+alter database open 5、startup restrict 6、startup force 7、startup pfile= 8、startup EXCLUSIVE -------------------------------------------------------- --------------------------------------------------------- FGAC lsnrctl stop lsnrctl start lsnrctl status create table t vaviable x begin open :x for select * from t; end delete from t; commit; print x variable scn number exec :scn := dbms_flashback.get_system_change_number print scn select count(*) from emp; select count(*) from emp as of SCN :scn; flashback table emp to scn :scn; alter table emp enable row movement CURSOR_SHARING = FORCE; select sql_text from v$sql where sql_text like 'select /* TAG */ %'; SQL_TRACE=TRUE 只打开CURSOR_SHARING = FORCE并不一定能解决你的问题。而且游标共享还可能带来新的问题 绑定变量 不过,如果对Oracle9i Release 2 或Oracle 10g Release 1使用Oracle9i Release 1 导出工具,总会得到一个有效的DMP文件,并可以成功地导入到Oracle9i Release 1中。 在Windows中通过FTP传输DMP文件时,要确保所执行的是二进制传输。 DMP文件是二进制文件,这说明你不能编辑这些文件来进行修改。 随着这些工具越来越失宠,取而代之的是更为灵活的数据泵工具 create or replace directory tmp as '/tmp' organization external (type oracle_datadump default directory TMP location('allobject.dat') ) as select * from all_objects / SQLLDR或外部表,Oracle可以很容易地读取平面文件 创建平面文件 开发了一个 SQL*Plus实用程序,从网络上的任何数据库把任何数据卸载到一个平面文件中 http://asktom.oracle.com/tkyte/flat/index.html ------------------------------------------------------- Change Tracking File: 1. startup mount; (os command) mv '' '' alter database rename file '' to '' alter database datafile '' offline drop; 2. alter database enable block change tracking (set DB_CREATE_FILE_DEST first) alter database disable block change tracking 3. select filename from v$block_change_tracking shutdown immediate (os command) mv '' '' alter database rename file '' to '' alter database open if database can not be closed, then: ALTER DATABASE DISABLE BLOCK CHANGE TRACKING; alter database enable block change tracking using file 'new_location' ------------------------------------------------------ v$parameter中的ISSES_MODIFIABLE记录哪些参数可以在session级别动态修改,ISSYS_MODIFIABLE记录哪些参数可以在instance级别动态修改。 ------------------------------------------------------- V$SGASTAT show parameter _pool_size, _cache_size, log_buffer, sga_ V$SGA_DYNAMIC_ COMPONENTS 自动SGA内存管理,SGA超过阈值,granule(常见4M)会增加 -------------------------------------------------------- PGA分配(推荐使用AUTO): 手动内存管理则适用于大型批处理作业(它们在特殊的时段运行,此时它们是数据库中惟一的活动)。 没有任何索引的表,查询多记录肯定会发生排序 如果采用专用服务器模式,UGA完全包含在PGA中 如果使用共享服务器,UGA将从SGA中分配,PGA则在共享服务器中 对于PGA,WORKAREA_SIZE_POLICY为AUTO时,设PGA_AGGREGATE_TARGET;为MANUAL时对应以下设置 (在Oracle9i中,共享服务器连接不会使用自动PGA内存管理) SORT_AREA_SIZE设置只是一个上界,而不是默认的分配大小 PGA_AGGREGATE_TARGET也是这样 串行(非并行查询)会话会使用PGA_AGGREGATE_TARGET中的很少一部分,大约5%或者更少 每个并行进程能使用的内存量大约是0.3*PGA_ AGGREGATE_TARGET / (并行进程数) 实例会尽力保持在PGA_AGGREGATE_TARGET限制以内,但是如果实在无法保证,它也不会停止处理;只是要求超过这个阈值。 set termout off; /* execute ... spool /* set termout on; @tmp_table1; (使用更多的内存,就会减少与磁盘的交换) 说明SORT_AREA_SIZE设置只是一个上界,而不是默认的分配大小 在8i中,SESSION PGA MEMORY都等于SESSION PGA MEMORY MAX set autotrace traceonly statistics; /* */ set autotrace off; 在使用*_AREA_SIZE参数时,需要记住以下重要的几点: q 这些参数控制着SORT、HASH和/或BITMAP MERGE操作所用的最大内存量。 q 一个查询可能有多个操作,这些操作可能都要使用这个内存,这样会创建多个排序/散列区。要记住,可以同时打开多个游标,每个游标都有自己的 SORT_AREA_RETAINED需求。所以,如果把排序区大小设置为10 MB,在会话中实际上可以使用10 MB、100 MB、1 000 MB或更多RAM。这些设置并非对会话的限制;它们只是对一个操作的限制。你的会话中,一个查询可以有多个排序,或者多个查询需要一个排序。 q 这些内存区都是根据需要来分配的。如果像我们一样,将排序区大小设置为1 GB,这并不是说你要分配1 GB的RAM,而只是说,你允许Oracle进程为一个排序/散列操作最多分配1 GB的内存。 -------------------------------------------------------- BLOCK BUFFER CACHE: block buffer cache(default pool, keep pool, recycle pool) belongto SGA 9i新增第四种缓冲池db_Nk_caches (默认大小为system temporary的) DB_CACHE_SIZE是指default pool的,与db_Nk_caches是互斥的 有两个不同的列表指向这些块(dirty列表, nondirty列表) 前三种池一般被视为一种非常精细的低级调优设备,只有所有其他调优手段大多用过之后才应考虑使用(如果可以重写查询,将I/O减少为原来的1/10,而不是建立多个缓冲区池,我肯定会选择前者!);第四种可以用作一种精细调优工具,对一组特定的段进行调优 x$bh DBA_OBJECTS select * from dba_extents where file_id = FILE# and block_id <= <DBABLK and block_id+blocks-1 >= DBABLK select dummy from dual 命中真正dual DBMS_ROWID 命中真正dual SELECT SYSDATE FROM DUAL -------------------------------------------------------- SGA: SUM(BYTES) FROM V$SGASTAT总是大于SHARED_ POOL_SIZE 共享池中的内存根据LRU(最近最少使用)的原则来管理;一个包,名叫DBMS_SHARED_POOL,这个包可用于改变这种行为,强制性地“钉住”共享池中的对象 如果你真的想破坏Oracle的共享池,最容易的办法是不使用绑定变量;如果提交到Oracle的每个查询都是具有硬编码值的惟一查询,则共享池的概念就一点用都没有;硬解析SQL太耗费CPU *** 大块内存分配则是得到一块内存后加以使用,然后就到此为止,没有必要缓存这个内存 大池就是一个回收型的内存空间(recycle),共享池则更像是保持缓冲区池(keep) 大池专门用于以下情况: q 共享服务器连接,用于在SGA中分配UGA区 q 语句的并行执行,允许分配进程间的消息缓冲区,这些缓冲区用于协调并行查询服务器。 q 备份,在某些情况下用于RMAN磁盘I/O 缓冲区。 *** 使用共享服务器连接时,并不是一定得使用大池,但是强烈建议你使用大池 *** 如果采用专用服务器模式,每个会话的状态不会存储在SGA中,因为这个信息要存储在UGA中;使用专用服务器模式时,UGA包括在PGA中 采用专用服务器模式,Java池包括每个Java类的共享部分; 使用共享服务器连接来连接Oracle时,Java池包括以下部分: q 每个Java类的共享部分。 q UGA中用于各会话状态的部分,这是从SGA中的JAVA_POOL分配的。UGA中余下的部分会正常地在共享池中分配,或者如果配置了大池,就会在大池中分配。 *** 10g新增 stream pool: 数据库共享/复制工具 如果没有配置流池,则是共享池中至多10%的空间)会用于缓存流进程在数据库间移动/复制数据时使用的队列消息。 *** q 自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE。 q 手动SGA参数:这些参数包括LOG_BUFFER、STREAMS_POOL、DB_nK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。 SGA_TARGET SGA_MAX_SIZE V$SGAINFO 要使用自动SGA内存管理,参数STATISTICS_LEVEL必须设置为TYPICAL或ALL。 数据库会使用SGA_TARGET值,再减去其他手动设置组件的大小(如DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE等),并使用计算得到的内存量来设置默认缓冲区池、共享池、大池和Java池的大小。 即 便数据库关闭后又启动,数据库还能记得组件的大小,因此不必每次都从头再来确定实例的正确大小。这是通过4个带双下划线的参数做到的: __DB_CACHE_SIZE、__JAVA_POOL_SIZE、__LARGE_POOL_SIZE和__SHARED_POOL_SIZE。 *** -------------------------------------------------------- connection/session 服务器: Oracle Net高级特性连接池提高效率,可建立空闲会活 客户端: 使用CMAN,在客户和CMAN之间以及CMAN和数据库之间建立连接 第二个SQL*Plus会话来监视内存和临时空间的使用情况 DISCONNECT来destroy所有session exit断开连接 CONNECT命令来创建一个新会话 解析查询(尚未返回任何行)可能由共享服务器S000处理,第一行的获取可能由S001处理,第二行的获取可能由S002处理,而游标的关闭可能由S003负责。也就是说,一条语句可能由多个共享服务器一点一点地处理。 one connection, multiple sessions; one session, multiple server processes( shared server ); one session can be inactive, can temporary without the connection -------------------------------------------------------- shared server may incur 'artificial deadlock' problem 共享服务器只适用于OLTP系统 许多高级连接特性都要求使用共享服务器。如果你想使用Oracle Net连接池,就必须使用共享服务器。如果你想在数据库之间使用数据库链接集合(database link concentration),也必须对这些连接使用共享服务器。 如果你的应用中已经使用了一个连接池特性(例如,你在使用J2EE连接池),而且适当地确定了连接池的大小,再使用共享服务器只会成为性能“杀手”,导致性能下降 share server merit: 减少操作系统进程/线程数,刻意地限制并发度,以及减少系统所需的内存 1. 减少操作系统进程/线程数 有5 000个并发用户的系统。在任何时间点上,最多只有50个用户是活动的 2. 刻意地限制并发度 !!!!!利用共享服务器,我们就能把系统上的最大并发度限制为这个合适的数!!!!! 3. 减少系统所需的内存 不太显著 转变为共享服务器时,必须能准确地确定需要多少UGA内存,并适当地在SGA中分配(通过LARGE_POOL_SIZE参数)。所以,共享服务器配置中对SGA的需求通常很大。这个内存一般要预分配,从而只能由数据库实例使用。 如果从使用5 000个专用服务器发展到使用100个共享服务器,那么通过使用共享服务器,累计起来就能节省4 900个PGA的内存。 对于共享服务器连接,会话的跟踪信息(SQL_TRACE=TRUE时的输出)可能分布在多个独立的跟踪文件中,重建会话可能更困难。 如果只是在一个专用服务器下开发,而且从来没有对共享服务器进行测试,出现失败的可能性会更大。 使用诸如高级排队(Advanced Queuing,AQ)之类的特性使长时间运行的进程变得很短,但是必须在应用中做相应的设计。这种工作最好在开发时完成。 --------------------------------------------------------- 中心后台进程: DBWn: scattered write LGWR: sequential write When LGWR commit: q 每3秒会刷新输出一次 q 任何事务发出一个提交时 q 重做日志缓冲区1/3满,或者已经包含1 MB的缓冲数据 ARCn 通常将在线重做日志文件复制到至少两个位置(冗余正是不丢失数据的关键所在!)。这些位置可能是本地机器上的磁盘,或者更确切地讲,至少有一个位置在另一 台机器上;在许多情况下,归档重做日志文件会由另外某个进程复制到一个第三辅存设备上,如磁带。也可以将这些归档重做日志文件发送到另一台机器上,应用于 “备用数据库”(standby database),这是Oracle提供的一个故障转移选项。 ASM: ASMB,RBAL RAC(高度可用性,可扩缩性,廉价): Lock monitor,LMON Lock manager daemon,LMD Lock manager server,LMSn Lock,LCK0 Diagnosability daemon,DIAG OPS, pinging, --------------------------------------------------------- 工具后台进程: *** CJQ0和Jnnn进程:作业队列: 刷新快照时使用的内部机制 (快照(snapshot)是一种Oracle数据库对象,用来提供复制特性) JOB_QUEUE_INTERVAL和JOB_QUEUE_PROCESSES 最多可以有1 000个作业队列进程。名字分别是J000,J001,…,J999。这些进程在复制中大量使用,并作为物化视图刷新进程的一部分。基于流的复制(Oracle9i Release 2中新增的特性)使用AQ来完成复制,因此不使用作业队列进程。 开发人员还经常使用作业队列来调度一次性(后台)作业或反复出现的作业,例如,在后台发送一封电子邮件,或者在后台完成一个长时间运行的批处理。 开始时只会启动一个进程,即作业队列协调器(CJQ0),它在作业队列表中看到需要运行的作业时,会启动Jnnn进程;没有要处理的新作业,此时Jnnn进程就会退出 *** QMNC和Qnnn:高级队列: QMNC进程对于AQ表来说就相当于CJQ0进程之于作业表。 alert dequeuer queque propagation (will dequeueing) AQ_TM_PROCESSES 最多10 不同于作业队列所用的Jnnn进程,Qnnn进程是持久的。如果将 AQ_TM_PROCESSES设置为10,数据库启动时可以看到10个Qnnn进程和一个QMNC进程,而且在实例的整个生存期中这些进程都存在。 *** ora_cjq0_SID ora_j000_SID ora_j999_SID ora_qmnc_SID ora_q000_SID ora_q009_SID ora_mman_SID ora_mmon_SID ora_mmnl_SID ora_mnnn_SID (Automatic Workload Repository,AWR) ora_emn0_SID Oracle Call Interface,OCI()注册消息通知的回调 用于通知订购者,第一次向实例发出通知时会自动启动EMNn进程。然后应用可以发出一个显式的message_receive(dequeue)来获取消息 ora_ctwr_SID ora_RVWR_SID (要与FLASHBACK DATABASE命令一起使用) Data Guard Concepts and Administration Guide 数据泵工具process 流申请和捕获process *** --------------------------------------------------------- I/O slave process: if OS does not support asynchronism I/O, use this; (1) for DBWn和LGWR set DBWR_IO_SLAVES to non-zero, then LGWR和ARCH也会使用其自己的I/O从属进程,LGWR和ARCH最多允许4个I/O从属进程 name of DBWn's I/O slave process: I1nn name of LGWR's I/O slave process: I2nn (2) for RMAN BACKUP_TAPE_IO_SLAVES = TRUE --------------------------------------------------------- parallel query process: Pnnn parallel query coordinator --------------------------------------------------------- Lock: Oracle Forms和HTML DB to avoid 'update lost' select for update nowait(nowait则当你所要操作的记录被其他人锁定,则立刻返回结果,告诉你失败。如果不加NOWAIT,则程序等待,直到等到别人把锁释放,或者超时) 1. 使用版本列的乐观锁定 simple update use procedure, do not use trigger:更新逻辑封装到一个存储过程中,而不要让应用直接更新表;还有一种实现是使用一个触发器,但是对于这么简单的工作,我建议还是避免使用触 发器,而让DML来负责。触发器会引入大量开销,而且在这种情况下没有必要使用它们。 2. 使用校验和的乐观锁定 (单向散列函数,冲突可能性很小,如md5) use oracle package: OWA_OPT_LOCK.CHECKSUM 返回16位校验和 冲突的可能性65 536分之一 DBMS_OBFUSCATION_TOOLKIT.MD5 返回128位 DBMS_CRYPTO.HASH (Oracle 10g Release 1及以上才有0) SHA-1算法 建议使用这种 --------------------------------------------------------- select * from v$event_name where name like '%PX%' and wait_class<>'Idle' 在10g上这个属于 other --------------------------------------------------------- DBA职责: 在整个开发阶段,你都要把性能作为一个目标精心地设计 其他的任何索引 查询执行调优 压力测试 DBA最重大的职责是数据库恢复 DBA要知道回滚(rollback)和重做(redo)怎么工作 开发人员可以对分配的空间做出估计(他们觉得需要多少空间),但是余下的都要由DBA/SA决定 假设你是一位开发人员,如果你的查询用的资源太多,DBA就会来找你;如果你不知道怎么让系统跑得更快,可以去找DBA 如果应用已经得到充分调优,此时就可以完成实例级调优 实例级调优: 最优的 尽量使用Oracle提供的内置功能 了解应用出现需要锁定和并发控制的情况,针对数据库设计和开发人员做出更正和优化 -------------------------------------------------------- When you initialize a new database: SQL_TRACE ON SERVERERROR 数据库必须采用ARCHIVELOG模式,而且必须配置为支持FLASHBACK DATABASE 参数名用下划线(_)开头,不轻易用 Index NoLogginng decide to use dedicated server or share server disk_asynch_io = TRUE 使用异步i/o --------------------------------------------------------本文出自 51CTO.COM技术博客 |


xu20cn
博客统计信息
热门文章
最新评论
友情链接