Oracle:
[url]http://richie.blog.js0573.com/[/url]
[url]http://database.51cto.com/art/200511/12457.htm[/url]
[url]http://bbs.51cto.com/forum-42-1.html[/url]
[url]http://www.itpub.net/forum4.html[/url]
[url]http://aaron:5561/isqlplus/[/url]
[url]http://aaron:5561/isqlplus/dba/[/url]
[url]http://aaron.abc.com:1158/em/console/logon/logon[/url]
[url]http://publish.itpub.net/oracle.shtm[/url]
--------------------------------------------------------
Manual:
Oracle Database Reference
[url]http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/toc.htm[/url]
Oracle SQL Reference
[url]http://download-uk.oracle.com/docs/cd/B14117_01/server.101/b10759/toc.htm[/url]
-------------------------------------------------------
RMAN遇到数据不一致恢复: pfile添加_allow_resetlogs_corruption=true
--------------------------------------------------------
由dedicated设置为mts
[url]http://blog.oracle.com.cn/2446/viewspace_2774.html[/url]
---------------------------------------------------------
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�C8.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实用程序,从网络上的任何数据库把任何数据卸载到一个平面文件中
[url]http://asktom.oracle.com/tkyte/flat/index.html[/url]
-------------------------------------------------------
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
--------------------------------------------------------