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]