一、Oracle体系结构
数据库服务器是由实例(动态)和数据库(静态)组成。
数据库,也就是静态部分,表现为磁盘上的文件,而实例是其中动态的部分,表现为内存中的结构。
体系结构:实例中的内存缓冲区和后台进程。
数据库的物理结构:数据文件、控制文件和参数文件等。
数据库的逻辑结构:表空间、区、段、块等存储结构。
二、前、后台进程
SQL> shutdown immediate
SQL> startup nomount
SQL> select paddr,name from v$bgprocess where paddr<>'00';
PADDR NAME
---------------- ----------
00007FFFD950BA58 PMON
00007FFFD950DC28 VKTM
00007FFFD950ED10 GEN0
00007FFFD950FDF8 DIAG
00007FFFD9510EE0 DBRM
00007FFFD950CB40 PSP0
00007FFFD9511FC8 DIA0
00007FFFD95130B0 MMAN
00007FFFD9514198 DBW0
00007FFFD9515280 LGWR
00007FFFD9516368 CKPT
PADDR NAME
---------------- ----------
00007FFFD9517450 SMON
00007FFFD9518538 RECO
00007FFFD9519620 MMON
00007FFFD951A708 MMNL
已选择15行。
SQL> alter database mount;
SQL> select paddr,name from v$bgprocess where paddr<>'00';
PADDR NAME
---------------- ----------
00007FFFD950BA58 PMON
00007FFFD950DC28 VKTM
00007FFFD950ED10 GEN0
00007FFFD950FDF8 DIAG
00007FFFD9510EE0 DBRM
00007FFFD950CB40 PSP0
00007FFFD9511FC8 DIA0
00007FFFD95130B0 MMAN
00007FFFD9514198 DBW0
00007FFFD9515280 LGWR
00007FFFD9516368 CKPT
PADDR NAME
---------------- ----------
00007FFFD9517450 SMON
00007FFFD9518538 RECO
00007FFFD9519620 MMON
00007FFFD951A708 MMNL
SQL> alter database open;
SQL> select paddr,name from v$bgprocess where paddr<>'00';
PADDR NAME
---------------- ----------
00007FFFD950BA58 PMON
00007FFFD950DC28 VKTM
00007FFFD950ED10 GEN0
00007FFFD950FDF8 DIAG
00007FFFD9510EE0 DBRM
00007FFFD950CB40 PSP0
00007FFFD9511FC8 DIA0
00007FFFD95130B0 MMAN
00007FFFD9514198 DBW0
00007FFFD9515280 LGWR
00007FFFD9516368 CKPT
PADDR NAME
---------------- ----------
00007FFFD9517450 SMON
00007FFFD9518538 RECO
00007FFFD9523F30 CJQ0
00007FFFD951EAA8 QMNC
00007FFFD9519620 MMON
00007FFFD951A708 MMNL
已选择17行。
1. 后台进程DBWR
默认情况下只启动一个,如果用户事务很频繁,对于一个DBWR进程来说,要把这些脏缓冲区写入数据文件,负载是很重的。
可以启动额外的DBWR进程,提供写数据效率。DBWR进程的数据由初始化参数DB_WRITER_PROCESSES指定,最多可以启动36个,
他们名称是DBW0-DBW9以及DBWa-DBWz。
NAME TYPE VALUE
---------------- ---------- ------------
db_writer_processes integer 1
DBWR进程执行写的几种情况:
1.1 固定的时间间隔,如每隔3秒
1.2 当数据库服务器发出检查点时
1.3 当脏队列中的缓冲区数目达到一定值时
1.4 当用户进程需要访问数据,服务区进程需要在数据库缓冲区缓存中搜索一定数量的空闲缓冲区,而此时空闲缓冲区的数量不能满足要求时,
服务器进程通知DBWR进程,把脏队列中的脏缓冲区写入数据文件,这些将重新成为空闲缓冲区
2. 后台进程LGWR
LGWR进程的功能是将重做日志缓冲区中的重做日志写入重做日志文件,以保证数据库一致性。
LGWR与DBWR均是在一定条件下,将相关的缓冲区写入重做日志文件或者数据文件,两个进程不是同步工作的。
LGWR进程执行的几个条件:
2.1 固定的时间间隔,如每隔3秒
2.2 用户执行了commit操作
2.3 重做日志缓冲区的空间已经写满三分之一
2.4 DBWR将脏缓冲区写入数据文件之前
服务器进程将重做日志写入重做日志缓冲区,而LGWR进程将重做日志缓冲区中的内容写入重做日志文件。
3. 后台进程SMON
数据库启动时,检查控制文件、重做日志文件和数据文件的scn是否一致,如果不一致,然后将其中未提交的事务回滚,
并将重做日志文件中最后一个SCN写入数据文件和控制文件,以使数据库达到一致的状态。如果三种文件的SCN不一致,
实例是无法打开的,数据库启动时的这个处理过程,叫做实例恢复,由SMON进程完成。
SMON进程将重做日志文件中记录的重做日志重新执行一次,从而保证了数据不会因为系统断电丢失。
在数据库服务器正常的运行过程中,三种文件中的SCN是可以达到一致的,这要依赖于后台进程CKPT。
当CKPT进程开始工作时,SCN将被写入数据文件和控制文件,达到三种文件SCN完全一致。同时CKPT进程通知DBWR进程开始工作,
把脏缓冲区的数据写入数据文件,这时数据库将达到完全一致的状态,即使系统断电,数据库也不会受到任何影响,也不需要进行实例恢复。
只要用户提交了事务,事务对数据的修改就不会因为断电等异常丢失。反之,如果用户没有提交事务,事务对数据的修改会随着系统断电丢失,而且无法恢复。
SMON进程有如下功能:
3.1 实例恢复
3.2 回收临时表空间中的不再使用的临时段。
3.3 在字典管理表空间中合并相邻的空闲存储空间。
4. 后台进程CKPT
当数据库服务器发出检查点时,将带来大量的磁盘I/O,因此尽量减少检查点发生。
CKPT进程的几种情况发生:
4.1 正常关闭数据库服务器时
4.2 数据库服务器进行日志切换(alter system switch logfile)时
4.3 手动发出检查点(执行alter system checkpoint)时
4.4 由初始化参数指定LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL的时间到来时
#########################
alter system archive log current 与 alter system switch logfile区别:
两组命令最后的效果一样。alter system switch logfile是不等归档完成就进行switch logfile操作,速度快,尤其在非归档模式下适用,对当前实例生效。
而alter system archive log current要等待归档完成才操作,对所有实例生效。
#########################
LOG_CHECKPOINT_TIMEOUT:用于指定两个检查点之间的时间间隔,以秒为单位。oracle11g开始,默认为1800秒,即30min。如果设置为0,将取消固定时间间隔方式的检查点。
LOG_CHECKPOINT_INTERVAL:这个参数指定了一个操作系统块的数目,当服务器进程向重做日志缓冲区中写入指定块数的重做日志时,CKPT进程将发出检查点。
5. 后台进行PMON
PMON进程就是定期检查用户进程,并进行资源回收的操作。
用户进程正常退出,尚未提交的事务将被自动提交,事务对数据所加的锁将被自动释放,它所占用的资源也被自动释放。
用户进程非正常退出,PMON将对这些用户进程进行清除,释放它们所占用的资源,如锁、存储空间等,终止相应的进程,并且对那些尚未提交的事务进行回滚操作。
6. 后台进程ARCH
ARCH进程的功能是对重做日志文件进行归档。
只有数据库处于归档日志模式下,并且启动了ARCH进程,数据库服务器才会自动对重做日志进行归档。在一个实例中可以启动多个ARCH进程,默认情况下只启动4个,他们名称是ARC0~ARC3.
与ARCH进程有关的初始化参数:
LOG_ARCHIVE_MAX_PROCESSES:指定可以启动的ARCH进程的最大数目。
LOG_ARCHIVE_FORMAT:指定归档日志文件的名称。
LOG_ARCHIVE_DEST_n:指定归档日志文件的存储路径,其中n为1~31中的一个数字。
LOG_ARCHIVE_DEST_STATE_n:指定对应的归档路径是否可用。
如果数据库服务器写重做日志文件的速度比日志归档的速度快,那么将发生数据库服务器阻塞的现象,这是因为事务的重做日志无法顺利地被写入重做日志文件,从而导致事务的执行被挂起。
出现这种情况,可以考虑启动更多的ARCH进程,以加快重做日志归档的速度,或者创建更大、更多的重做日志文件,以延长文件被写满所需要的时间。
对一个数据库来说,重做日志的调整,是性能调优的一个方面。