oracle实例结构

Oracle实例的进程结构

什么是oracle实例?

 数据库启动时,首先启动实例,系统将分配系统全局区,并启动多个oracle后台进程,内存区域和后台及incheng合称为一个oracle实例。

数据库的参数文件决定了一个实例的特征和大小。在oracle数据库中,数据库实例INSTANCE决定了动态运行的数据库德ORACLE_SID。一般情况下,数据库与实例名之间是一一对应关系,即有一个数据库就有一个实例。

oracle并行服务器结构中,数据库与实例的关系是一对多关系,即一个数据库对应多个数据库实例,在这种配置方式中,同一时间用户只与一个实例相关,当某个实例出现故障,其他实例自动服务。

 

Oracle实例进程结构

实例决定进程。Oracle的实例进程有两种类型,即单进程数据库实例和多进程数据库实例。

在单进程环境下的oracle实例,只允许单个用户存取。服务器进程与用户进程、服务器软件合二为一,在一台机器上运行,这种方式 不支持网络,不可以进行数据复制。

 

多进程oracle实例

对于每一个连接的用户都有一个进程,系统的进程被分为用户进程、服务器进程和后台进程。

后台进程主要包括:USERDnnnLISTENERDBWRLGWRARCHPMONSMONCKPTRECO等。它们会常驻操作系统。进程总数不得超过参数 PROCESSES 的值。

查询方法如下:

SQL> show parameter processes

 

当连接用户数、后台进程数、死进程数相加等于 processes 的值时,则不能再连接任何用户了,会出现错误:

ERROR

Ora-00020 maximum number of processes (150) exceeded

 

需要修改processes 的值,然后重新启动数据库。在UNIX系统中,操作系统的总进程数受到系统核心参数SEMMNS的限制,此参数表示unix 操作系统总共可以分配的进程,当oracle进程总数超过操作系统地限制时,会出现错误:

ERROR

Ora-03113 end-of-file on communication channel

 

后台进程:

常用的后台进程包括:

数据写入进程:DBWR

日志写入进程:LGWR

检查点进程 CKPT

系统检控进程:SMON

进程检控: PMON

归档进程: ARCH

恢复进程: RECO

封锁进程: LCKn

调度进程:Dnnn

服务器进程Snnn

作业进程:SNP

可以查询 v$bgprocess 来启动后台进程个数及名称

SQL>select name,description from v$bgprocess;

 

 

DBWR 进程:

工作过程如下:

1)  产生user进程时,server进程查找内存。

2)  Server进程在内存中没有找到数据时,则必须从数据文件中读取数据,所以server进程在LRU list 中找空闲块。

3)  LRU list 中的DIRTY 块移入到DIRTY list

4)  DIRTY list 超长时,DBWR 进程将数据写入磁盘,刷新缓冲区。

5)  Server进程从磁盘读数据进入内存。

该进程的作用是:

1)  管理数据缓冲区,以便用户进程总能找到空闲的缓冲区。

2)  将所有修改后的缓冲区数据写入数据库

3)  使用LRU 算法将最近使用过的块保留在内存中。

4)  通过延迟写来优化磁盘I/O 读写

在下列情况下DBWR 要将修改过的缓冲区数据写入磁盘文件:

1)  当一服务器进程将一缓冲区移入“脏”表,该表达到一定长度时,该服务器进程将通知DBWR写盘。该临界长度由DB_BLOCK_WRITE_BATCH 决定。

2)  当一个服务器进程在LRU表中查找到DB_BLOCK_MAX_SCAN_CNT 缓冲区时,没有查找到空闲的缓冲区,则停止查找,并通知DBWR进行写操作。

3)  出现超时(TIME_OUT

4)  当出现检查点时,LGWR进程通知DBWR进行写操作。

 

在一个数据库实例中,允许设置多个DBWR进程,参数DB_WRITE_PROCESSES设置进程数。要了解数据库中数据写入进程的个数,可以使用以下方法 :

SQL> show parameter processes

 

数据写入进程最多可以启动20个,分别为DBW0DBW1 .... DBWaDBWb ……

设置方法:修改参数文件,在参数文件中增加DB_WRITE_PROCESSES 然后重新启动数据库。(范围是 1 20

 

LGWR进程:

该进程将日志数据从日志缓冲区写入磁盘日志文件组。数据库在运行时,如果对数据库进行修改,则产生日志信息,日志信息首先产生于日志缓冲区。当日志达到一定数量时,由日志写入进程LGWR将日志数据写入日志文件组,再经过日志切换,由归档进程ARCH 将日志数据写入归档介质。

日志缓冲区是一个循环缓冲区,当LGWR将日志缓冲区的日志数据写入磁盘日志文件后,服务器进程可以将新的日志信息写入到日志缓冲区。LGWR必须及时完成日志写入。确保日志缓冲区有足够的空间存储新的日志信息。当系统需要清除日志缓冲区时,LGWR 在一个事务提交前就将日志信息写出。而对于这些日志数据,当用户发出commit 命令时提交的数据即被写入日志缓冲区,但,相应的数据缓冲区的改变是延迟的,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋予一个系统改变号(SCN)同事务日志数据一起存储在归档日志中。由于SCN存储在日志中,使用日志数据可以对数据库进行有效的恢复。

LGWR写入进程写盘条件:

1)  发生提交

2)  日志缓冲区池达到总数的1/3

3)  超时发生

4)  DBWR 进程需要为检查点 清楚缓冲区块时

5)  每个实例只有一个日志写进程

6)  直到事务已被写入日志文件,提交确认才被执行。

 

LGWR 进行将日志信息同步的写到在线日志文件组中的多个日志成员文件。如果组中一个成员文件被删除或不可用,LGWR可将日志信息继续写到该组的其他文件中,不影响数据库正常运行。

 

SMON进程:

PMON进程

 

ARCH进程:

归档进程在日志存满时将日志信息写到磁盘或磁带,用于介质失败时的数据恢复。

数据库在运行在归档模式时,才有ARCH进程存在。

在一个实例中最大可以启动归档进程10个,ARC0ARC1….. ARC9 。设置方法:修改参数文件,在参数文件中增加参数LOG_ARCHIVE_PROCESSES, 参数 DB_ARCHIVE_MAX_PROCESSES 的取值范围是1 10

要了解数据库中与日志有关的参数,可以使用 :

SQL> show parameter log

 

对几个参数的说明:

1)      LOG_ARCHIVE_DEST

设置存储目录,例如:log_archive_dest = /data/ora10g/arch

2)      LOG_ARCHIVE_DUPLEX_DEST

该参数用于设置归档日志文件的镜像存储目录,与参数 LOG_ARCHIVE_DEST指定的存储目录中的信息完全相同。

设置方法:LOG_ARCHIVE_DUPLEX_DEST=/data2/ora10g/arch

3 LOG_ARCHIVE_DEST_n

     这里设置更多的归档日志镜像目录。 N<=10 这里10个参数要起作用,必须在ARCHIVELOG模式下,而且参数 LOG_ARCHIVE_START 必须被设置为true

在这个参数中,可以使用的选项有:

     MANDATORY :表示必须归档完成后才可以切换。如果数据库由于介质损坏不能切换,系统处于等待状态。

     REOPEN:归档目录或介质失败后,需等待多长时间才能重新写日志。默认时间是300s。这种情况发生在存储介质已满,等待一段时间,等介质更换完后,继续写日志。

     OPTIONAL :不管归档是否完成都进行切换,这是默认方式。这种选项可以使数据库不管日志归档问题,在归档出现问题时,不影响数据库系统得正常运行。

使用方法是:

 LOG_ARCHIVE_DEST_1 = ‘ /data/ora10g/arch

                           Mandatory

                           Reopen=500 ‘

 

3)      LOG_ARCHIVE_DEST_STATE_n

该参数 n<=10)用于对归档日志目录进行失效(或生效)设置,该参数与 LOG_ARCHIVE_DEST_n 对应。将LOG_ARCHIVE_DEST_n 指定的日志存储目录设为失效的方法如下:

 LOG_ARCHIVE_DEST_STATE _1 = DEFER

 …….

 LOG_ARCHIVE_DEST_STATE _2 = ENABLE

或在线设置:

SQL> alter system set LOG_ARCHIVE_DEST_STATE _1 = DEFER ;

SQL> alter system set LOG_ARCHIVE_DEST_STATE _2 = ENABLE ;

 

该参数只能用于10g 以上的版本,而且必须与LOG_ARCHIVE_DEST_n 对应。

 

在归档模式下,ARCH 进程自动归档,也可以手动归档。在手动方式下可以不连续归档,而选择某个日志进行归档。命令如下:

SQL> alter system archive log seq 0122

这时,只将日志序列号为0122的日志进行归档,其他日志不归档。

 

 

 

CKPT进程:

该进程出现时,系统对全部数据文件及控制文件的文件头的同步号进行修改,以保证数据库同步。通常情况下,CKPT进程在日志切换时产生。

检查点保证所有修改过的数据库缓冲区都被写入磁盘数据文件。在给定的时间,为数据文件作上“当前”标记,并将检查点记录在数据库控制文件之上。在数据恢复时,只需提供从上一个检查点以来修改的数据日志。在保证该数据已被写入相应得数据文件之后,允许重用一个新的日志文件,也就完成了一次日志切换。在检查点完成后,系统将更新数据库头和控制文件,以保证数据库所有文件同步。在oracle中提供了两个控制检查点次数的参数,一个参数是LOG_CHECKPOINT_TIMEOUT ,用于决定产生一个检查点运行的时间间隔,即到一定时间,数据库无论有无操作都将产生检查点。但如果机器是空运行,增加检查点是浪费资源,另一个参数是LOG_CHECKPOINT_INTERVAL 该参数决定执行一个检查点需要填充的日志文件块的数目,也就是说,每产生多少日志数据,系统自动产生一个检查点。这两个参数联合决定何时产生一个检查点。

查询这几个参数的方法:如下:

SQL> show parameter checkpoint

 

LOG_CHECKPOINT_TIMEOUT 默认1800秒,LOG_CHECKPOINT_INTERVAL 的默认值是0 表示不起作用。

CKPT发生时,数据库同步的顺序:

在数据库运行过程中,系统对数据库的改变信息用系统改变号表示(SCN),也叫检查点号,在日志中用 CHECHPOINT_CHANGE# 表示,它也是数据库三类文件(数据文件、日志文件、控制文件)的同步依据。CHECKPOINT_CHANGE#同时存储在日志文件、数据库文件、控制文件 中,在日志文件切换或其他原因引起系统改变时,检查点号会同时改变。

引起CKPT进程的主要条件有:

1)  在每个日志切换时产生。

2)  上一个检查点后,又经过了指定的时间。

3)  上一个检查点后,当预定数量的日志被写入磁盘后。

上面两项是产生检查点的两个参数决定的。

4)  数据库关闭  数据库关闭后,再次启动时,数据库德同步号会发生改变。

5)  Dba 强制产生。

6)  当表空间置成offline 时。

 

 

 

后台进程跟踪信息

Oracle对于运行的后台进程进行自动跟踪,所有修改数据库结构的命令会自动被后台进程跟踪记录,如 alter database alter  tablespace  create tablespace 等等。跟踪信息由oracle后台自动存储,跟踪文件命名为alert_SID.log

如果不使用默认路径,跟踪文件的路径可以在initSID.ora 中设定,用参数 BACKGROUND_DUMP_DEST 确定。后台进程和用户进程都可以建立各自的跟踪文件目录。用户跟踪文件位置由 USER_DUMP_DEST 确定。

系统提供给我们整理用户跟踪信息的命令:TKPROF,可以对trace 文件进行整理。

在操作系统命令提示符下运行:

$ tkprof   ora10g_ora_1018.trc ora10g_ora_1018.txt

 

在其结果中:

Count 表示 prase  execute   fetch 调用的执行次数

CPU 表示 实际使用cpu 的时间,单位为秒

Elapsed:表示 操作实际运行的时间,单位为秒,应该大于cpu时间

Disk 表示从数据文件读入内存的数据块。

Query 表示一次性访问

Current 表示当前方式下,缓冲区读数据块数。

Rows 表示 该语句所访问的行数

 

除了后台进程外,还可以使用参数 SQL_TRACE 对用户的sql语句进行跟踪。

可以修改参数文件initSID.ora

.....

SQL_TRACE =  true

 

修改会话一级的

SQL> alter session set sql_trace = true

设置结束后,系统自动产生跟踪文件,查询udump目录,使用tkprof 进行整理,就可以查看

 

 

锁等待问题

Oracle中的锁包括:行排它锁(RX Row Exclusive 由语句 insert update delete 引起)行共享锁(RS  Row Share 由语句select ……. For update 引起)行共享排它锁(SRX share row execlusive 和排他所(X Execlusive )等多种类型,而且每种类型又有行级锁和表级锁。

排他DDL 由语句 drop table  alter table 引起,共享DDL 锁主要由 create procedure audit 引起。

以下方法可以了解目前正在等待锁资源的用户:

SQL> select a.username, a.sid, a.serial# b.id1 from v$session a, v$lock b where

a.       lockwait=b.kaddr ;

 

 

要了解锁住其他用户的用户进程,方法如下:

SQL> select a.username,a.sid,a.serial#,b.id1

      From v$session a, v$lock b

      Where b.id1 in

                    ( select distinct e.id1 from v$session d,v$lock e

                       Where d.lockwait = e.kaddr )

            And a.sid=b.sid

            And b.request =0;

 

查到锁资源后,数据库管理元可以用以下命令解锁

SQL> alter system kill session ‘SID,SERIAL#’ ;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21080572/viewspace-606604/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21080572/viewspace-606604/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值