hao1nan 发表于 2018-9-23 08:22:10

aaron note oracle-Aaron的笔记

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>  在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 000MB或更多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   开发人员还经常使用作业队列来调度一次性(后台)作业或反复出现的作业,例如,在后台发送一封电子邮件,或者在后台完成一个长时间运行的批处理。
  开始时只会启动一个进程,即作业队列协调器(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. 使用版本列的乐观锁定
  simpleupdate use procedure, do not usetrigger:更新逻辑封装到一个存储过程中,而不要让应用直接更新表;还有一种实现是使用一个触发器,但是对于这么简单的工作,我建议还是避免使用触发器,而让DML来负责。触发器会引入大量开销,而且在这种情况下没有必要使用它们。
  2. 使用校验和的乐观锁定
  (单向散列函数,冲突可能性很小,如md5)
  use oracle package:
  OWA_OPT_LOCK.CHECKSUM 返回16位校验和 冲突的可能性65 536分之一
  DBMS_OBFUSCATION_TOOLKIT.MD5 返回128位

  DBMS_CRYPTO.HASH (Oracle 10g>  ---------------------------------------------------------
  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
  --------------------------------------------------------

页: [1]
查看完整版本: aaron note oracle-Aaron的笔记