1 oracle的服务架构
服务器启动监听进程,用户进程发出请求,到达该监听进程,监听进程收到请求后,派生出一个
服务进程出来(可以重新建一个,也可以从服务器进程池中拿出来),监听进程把用户请求转发给
服务进程后,继续去监听其他请求
ORACLE 有NET 8协议,实现了OSI中的上三层,负责客户和服务器之间建立完整的SQL会话,解析SQL语句,执行
SQL等
2 服务端的listner.ora,有专有模式和共享模式两种,区别为:
专有模式:为每个用户连接启动一个单独的进程,而共享模式为多个用户连接共享一个进程,也就是多个用户共
享一个会话通道
3 监听器进程的静态注册和动态注册
静态注册,配置监听器时,明确告诉监听器某个数据库的信息,告诉需要连接哪个SID的信息
动态注册:由数据库动态向监听器注册,由PMON进程完成的,也可以用
alter system register,命令马上强制pmon立即注册
动态注册的话,在lsnrctl status中,可以看到静态的是unknown状态,动态的能准确监视其数据库状态
4 lsnrctl命令
lsnrctl status,lsnrctl start,lsnrctl stop
5 在10g中,可以使用easy connect naming method,客户端不再需要配置
tnsname.ora,格式为
sqlplus xxx/xxxx@//host/sid
6 数据库物理结构:分为数据文件,控制文件,日志文件,最重要三种
7 联机日志组: LGWR进程会不断的向redo log中写入日志内容,当一组日志文件被写满时,会触发log switch,然
后lgwr继续向另外一组日志写入
会覆盖掉以前的;如果要保留全部日志,必须用归档日志。
8 归档日志,当一组联机日志写满后,在触发日志切换的同时,还触发arcn进程,将写满的日志copy到另外一个位置
。
即使在rac环境中,每个日志线程的要求也是一样的
9 trace文件 分别是内核跟踪文件,后台进程跟踪文件,用户追踪文件。
10 OMF:
实际上就是设置了一些预先的参数位置,让比如创建相关操作时,不用进行指定文件路径等;
11 数据块:一般OLTP设置为8KB比较好,OLAP可以适当设置大点。
数据块分为数据块头(block header):包括数据块地址,数据块类型(索引块,undo),事务表(ITL)
row directory:为数据块内部的一个指针表,找某条记录时,不需要再遍历整个
数据块
free space:空闲的空间 used space:数据记录占用的空间
分区:为了更好地管理数据块,分区数量可多可少,是连续的空间,但会产生空间碎片
段:每个表或索引都对应一个段,段不要求连续
表空间:分为永久表空间,临时表空间和undo表空间。永久表空间为system,sysaux,user表空间;sysaux为10G以
后辅助功能而设置的表空间
临时表空间组:一个临时表空间组至少包含一个临时表空间(10g开始提供)
select * from dba_tablespace_groups;
移动临时表空间到新的临时表空间组:
alter tablespace temp tablespace group tmpgroup1;
undo表空间:一个数据库中可存在多个undo表空间,但任一时间只有一个UNDO
表空间被激活
12 段空间管理
在手动创建segments时,手动空间管理方式中,oracle通过一个freelist链表来记录
数据块的使用,但容易引起DML时的竞争
因此9I开始,使用自动空间管理方式,ASSM,不再使用freelist,而是通过位图方式记录每个数据块的使用情况,
用来记录数据块的位图的数据块叫bitmapped block(BMB),
分散在段中,减少了竞争。
oracle对于extent的管理分字典管理和本地管理,本地管理使用位图,比较快和好
13 desc dba_objects
两者可以这样区别:object_id可以看做是对象的一个逻辑id,在对象创建时分配,一经分配即不再改变;而
data_object_id为一个物理id,在对象物理存储变化时可能发生改变。
14 后台进程
1) DBWN:负责把sga被修改的数据同步到磁盘中去;写的时机包括:检查点,每3秒唤醒一次,数据库最多有20
个dbwn进程
2)LGWR:将log buffer中的日志内容写到联机日志文件中去。当DBWR试图把一个脏数据块写到磁盘前,先确定其
REDO记录是否写到联机日志文件中,如果没有,则通知LGWR进程去写入。
3)PMON:监视用户进程,负责发现用户进程异常后清理资源等工作
4)SMON:负责实例的恢复工作
5)ARCN:归档日志进程
6)MMON,MMNL,MMAN:10G中的AWR进程收集
7)CJQO:负责定时任务
8)RVWR:10G中负责flashback功能
15 SGA:共享进程,适用OLTP,PGA对与OLAP比较重要
1)data buffer cache,分为keep buffer pool,recycle buffer ppol,
default buffer ppol,其中keep buffer pool的初始化参数为db_keep_cache size,
该区域内的数据会尽可能保留在内存中
recycle buffer pool:一用完就会被移走,比如体积大的日志表等,可以考虑用这个
default_buffer_pool:db_cache_size 缺省的cache
2)shardpool:存放的为代码,分为library cache和dictionary cache两个
区域,library中存放代码部分,dicitionary存放数据字典部分,加快解析用。
3)redo log buffer:存放redo记录
4)大对象池,JAVA池
16 PGA:完成排序,HASH,连接等
17 归档模式和非归档模式
1) 切换为归档模式:alter database archivelog;
定义归档位置: alter system set log_archive_dest="location=d:\....."
scope=both;
2) RMAN介绍:
targetdatabase:要进行备份的数据库叫做targetdatabase.
catalog database:rman的备份信息可以保存在控制文件中,也可以保存在一个
单独的数据库中,方便管理
通道channel:是一个命令行接口,它指引一个target database的一个服务进程
进行数据库备份,还原和恢复。
备份集和COPY:有备份集和COPY方式,备份集象ZIP的方式,备份集的方式包括要还原和恢复 ,恢复为恢复相
关的归档日志和联机日志,占用时间多点;而COPY方式则可以忽略还原的操作,不需要额外的空间
RMAN连接到目标数据库,其中有2个通道用来对数据库进行调用,用自己的PL/SQL执行RMAN命令,调用数据库
进行备份。
操作:
1) rman target '用户名/xxxxx@sid'
注意,有时会报:找不到recover.bsq文件,要把服务端rdmbs\admin下的复制到客户端
看所有配置 show all;
2) 配置控制文件的自动备份
configure controlfile autobackup on;
3) 缺省的备份格式为backupset,为压缩的,配置磁盘备份
configure default device type to disk;
配置为压缩方式backup
configure device type disk backup type to compressesd backupset;
4) 基于时间窗口的备份策略
比如设置了configure retention policy to recovery window of 7 days;
设置了7天,则假如1,14号分别作了一次全备,恢复时间是7天,现在是23号,
就要保证恢复到16号,则需要14号的全备+14号以后的归档日志,而14号之前的,都可以删除
5) 基于冗余的策略
configure retention policy to redundancy 2;
定义每个文件至少保留2个备份。
6)查看策略
show retention policy;
7) 查看过期的备份文件
report obsolete;
删除过期文件
delete obsolete;
9)完全备份:
backup database;
采用压缩备份:backup as compressed backupset database;
采用image copy方式备份:backup as copy database;
10)增量备份:在做完全备份后,比如周二备份的只是周二的,每天都是当天的备份;
backup incremental level 1 database;
累加增量备份:比如周二的是周一到周二之间共2天的变化
backup incremental level1 cumulative database;
关于RMAN的练习,参考更多的;http://www.cnblogs.com/shishanyuan/archive/2010/03/01/1675349.html
11)提升增量备份的性能,有一个特殊文件叫数据块变化跟踪文件,减少数据的遍历;
当数据块发生变化时,将相关信息记录到这个文件中,当RMAN增量备份时,利用这个
文件就可以获得需要备份的数据块列表,而不必所有数据块遍历
启用:
alter datbase enable block change tracking using file 'xxx/bcl';
select * from v$block_change_tracking;
关闭
alter database disable block change tracking;
18 一个REDO记录号包括:事务号,被修改数据的位置,数据块号,修改后的值
日志文件SCN:每个日志文件都有一个低SCN,高SCN。当一个日志文件存
满后,新的日志文件低SCN就用上一个日志文件的高SCN+1来表示。每个正被
使用的日志文件的高SCN无穷大。
每个数据文件的文件头记录启动SCN,而控制文件会记录每个数据文件的终止
SCN,正常运行的开始SCN都设置一样,终止被设置无穷大
重要:正常数据库关闭后,每个数据文件的终止SCN被设置为成功启动的SCN
19 oracle 的database control是BS结构去管理一个数据库,grid control是管理多个数据库;
在oracle_home\bin目录下,有emctl的启动文件
oracle10g\oc4j\j2ee\OC4J_DBConsole为模版目录,每一个被管理的数据库都会在下面生成一个
oc4j_dbconsole_hostname_sid的目录,一个database control只能管理一个数据库实例。
重新配置databasecontrol:
emca -config dbcontrol db -repos create
20 pga:为每个用户的连接请求分配一个服务进程,而这个服务进程分配的内存区域就叫PGA。PGA是独占的方式,
进程访问时不需要latch,lock等保护机制,不会发生竞争。
PGA包括session area(包含会话特有的信息,如会话跟踪信息等),private sql area(即通常所说的
cursor),又分为persistent area(保存绑定变量等)和run-time area(SQL运行过程中使用的空间,执行完SQL后,
这部分空间会被释放)
21 parent cursor和child cursor的概念
parent cursor:保存的是SQL的原始执行文本
child cursor:保存的是执行计划和环境信息
v$SQLAREA:从parent cursor级别上统计SQL语句的执行信息;
v$sql:从child cursor级别上统计的语句执行信息
open_cursor参数控制每个session 最多能同时打开的cursor数量,如果超过遇到ora-1000错误
session_cached_cursors:定义后,如果一个SQL被频繁执行,这个cursor就会被cache掉,提高效果。
22 查看执行计划: explain plann for ...........
查看执行计划 select * from table(dbms_xplan.display);
系统级别设置10046事件 :
alter system set event='10046 trace name context forever,level 8';
alter system set event='10046 trace name context off';
23 sql>oradebug setospid 操作系统的id
sql>oradebug setorapid oracle进程的id
24 library cache中获得执行计划
使用dbmx_xplan包,其中display方法为9i用,display_cursor为10G用
在10G中推荐用display_cursor,其参数说明为:
sql_id:代表sql语句的id,其实为一个哈希值
child_number:一个SQL中的多个子游标,可以为null,则列出所有子游标计划
1) 确定语句的sql_id:比如
select sql_text,sql_id from v$sql where sql_text like '%..要分析的SQL语句....%'
获得其哈希值,
2)select * from table(dbms_xplan.display_cursor('哈希值',null,'basic'));
select * from table(dbms_xplan.display_cursor('哈希值',null,'typical'));
select /* +gather_plan_statistics */ count(*) from ......
查看执行计划
select * from table(dbms_xplan.display_cursor9('哈希值',null,'TYPICAL,+iostats,+memstats');
则在显示的列中,E-ROWS,A-ROW分别代表估计和真正执行的花费
3)display_awr
在awr报告中,有一列sql_id,
select * from table(dbmx_xplan.display_awr('来自AWR报告中的sql_id列'));
25 阅读SQL执行计划
1)概要部分,输出SQL ID及文本
2) 执行计划
3) QUERY BLOCK分为简单的SQL和复杂的SQL
对于简单的sql,在query block部分,用:
1---SEL$1 来表示,而象 $DEL$:删除,系统生成的名字不够人性化,可以自定义:
select /*+ qb_name(abc) */ b1.id,b2.id from b b1,b b2