什么是Oracle实例?Oracle实例是独立的SGA内存结构与一组后台进程的组合。什么又是Oracle数据库呢?数据库其实就是控制文件、数据文件、REDO日志文件。我们透过一个架构图来说明:
我们可以简单理解为,架构图的上半部分主要是进程和各种内存结构为Oracle实例,下半部分由各种文件组成的为数据库。
所以,你现在应该知道,如果有人谈到实例,他指的就是Oracle 的进程和内存。提到数据库时,则是说保存数据的物理文件。可以从多个实例访问一个数据库,但是一个实例一次只能访问一个数据库。
在Oracle 中的基本内存结构包括:
Ø 系统全局区(System Global Area,SGA),此区域由所有的服务进程(server process)和后台进程(backgroundprocess)共享。SGA的主要组件包括:
n Java 池,用于Oracle内部的JAVA类的执行。
n 数据缓存区,缓存数据块。
n 共享池,缓存SQL语句和数据字典。
n 大型池,执行RMAN备份等需要“大块”使用内存时,需要使用这部分内存。
Ø 程序全局区(Program Global Areas,PGA),此区域是每个服务进程和后台进程所私有的,即每个进程都有一个属于自己的PGA。
在Oracle 系统中的各种进程可以被分为两大类:
Ø 执行应用程序用户进程(user process),比如ZLHIS
Ø 执行 Oracle 数据库服务器代码的 Oracle进程(Oracle process)。其中包括服务进程(server process)和后台进程(backgroundprocess)。如下图所示:
后台进程主要包括:
Ø SMON(System monitor)
系统监控进程,负责系统监视已经一些系统清理及恢复工作。
Ø PMON(Process Monitor)
进程监控进程,用于监视服务器进程的执行,并且在服务器失败时清除改服务进程。
负责对失败的用户进程或服务进程进行恢复,并释放进程所占用的资源。
Ø DWR(Database Writer)
数据库写进程用于将数据高速缓存的脏数据写入到数据文件中,当执行DML操作时,服务进程会修改缓存区,并且将这些缓存区标识为”脏缓冲区”,将来将谢谢脏缓冲区数据会由后台进程DBWR写入到数据文件。
Ø LGWR(Log Writer)
LGWR用于将重做日志缓冲区所记载的全部内容写入到重做日志。
Ø CKPT(Checkpoint Process)
CKPT用于发出检查点(Checkpoint),并且检查点会同步数据库的数据文件、控制文件和重做日志。
Ø (ARCH(Archive Process)
ARCH用于将重做日志的事务变化赋值到归档日志中,只有ARCHIVELOG模式下才会被启动。默认情况下只会启动两个归档过程(ARC0,ARC1),通过设置初始化参数log_archive_max_process可以最多定义10个归档进程.在ARCHIVELOG模式下,当进行日志切换时会自动生成归档日志。
Oracle数据库的物理结构,主要是指Oracle数据库使用的操作系统文件结构。对于物理结构文件,不同的Oracle版本以及不同的操作系统平台上的存储目录结构略有不同。但按其主要作用基本都可以分为以下三类:
Ø 数据文件(data file)
Ø 日志文件(redo log files)
Ø 控制文件(control files)
其中数据文件是实际存储数据库数据的文件,如表中的记录、索引、数据字典信息等都存储于数据文件中。可以通过v$datafile视图查询到数据库有那些数据文件:
SQL> select file#,name from v$datafile;
FILE# NAME
---------------------------------------------------------------------------- 1/u01/app/oracle/oradata/qjrmyy/system01.dbf
2 /u01/app/oracle/oradata/qjrmyy/undotbs01.dbf
3/u01/app/oracle/oradata/qjrmyy/sysaux01.dbf
4 /u01/app/oracle/oradata/qjrmyy/users01.dbf
5 /u01/app/oracle/oradata/qjrmyy/ZL9ACTBASE01.DBF
6 /u01/app/oracle/oradata/qjrmyy/ZL9ACTDATA01.DBF
7 /u01/app/oracle/oradata/qjrmyy/ZL9BASEITEM01.DBF
8 /u01/app/oracle/oradata/qjrmyy/ZL9BLOODDATA.DBF
9 /u01/app/oracle/oradata/qjrmyy/ZL9CISAUDIT01.DBF
10 /u01/app/oracle/oradata/qjrmyy/ZL9CISREC01.DBF
11 /u01/app/oracle/oradata/qjrmyy/ZL9DEVBASE01.DBF
12 /u01/app/oracle/oradata/qjrmyy/ZL9DEVREC01.DBF
13 /u01/app/oracle/oradata/qjrmyy/ZL9DEVUSE01.DBF
14 /u01/app/oracle/oradata/qjrmyy/ZL9DUEREC01.DBF
15 /u01/app/oracle/oradata/qjrmyy/ZL9EPRDAT01.DBF
16 /u01/app/oracle/oradata/qjrmyy/ZL9EPRLOB01.DBF
17 /u01/app/oracle/oradata/qjrmyy/ZL9EXPENSE01.DBF
18 /u01/app/oracle/oradata/qjrmyy/ZL9HISTORY01.DBF
19 /u01/app/oracle/oradata/qjrmyy/ZL9HUMANBASE01.DBF
20 /u01/app/oracle/oradata/qjrmyy/ZL9HUMANINFO01.DBF
………………………………
日志文件叫做重做日志(REDO)文件,它用于记录对数据库的修改操作,对数据库所作的修改信息都会被记录在日志文件中,REDO日志是以组的方式循环使用的:
每一组REDO日志可以有一个或多个成员。因为是循环使用的,Oracle 服务器最少需要两个联机重做日志文件组。LGWR 按顺序向联机重做日志文件写入重做信息。一旦当前联机重做日志文件组被写满,LGWR 就开始写入下一个组。这称为日志切换。当最后一个可用联机重做日志文件已满时,LGWR 将返回第一个联机重做日志文件组并开始重新写入。
控制文件是一个二进制文件,用于描述数据库的物理结构,它是数据库的心脏。控制文件是是成功启动和操作数据库所必需的。每个控制文件只与一个Oracle 数据库相关联。在打开一个数据库之前,系统将读取控制文件以确定该数据库是否处于有效状态以供使用。控制文件包括如下内容:
Ø 数据库名称和标识符
Ø 创建数据库的时间戳
Ø 表空间的名称
Ø 数据文件和重做日志文件的名称和位置
Ø 当前重做日志的序列号
Ø 检查点信息
透过v$controlfile视图可以查看控制文件信息:
SQL> select name,file_size_blks fromv$controlfile;
NAME FILE_SIZE_BLKS
----------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/qjrmyy/control01.ctl 448
/u01/app/oracle/oradata/qjrmyy/control02.ctl 448
/u01/app/oracle/oradata/qjrmyy/control03.ctl 448
在上一节中我们讲了Oracle数据库物理结构按其作用主要分为三类文件,其中就有REDO日志文件。日志文件也是Oracle物理结构文件中最复杂的一类文件,同时也是保证数据库系统安全,以及备份与恢复的重要手段。通常我们将日志文件分为联机重做日志文件(online redo log file)与归档重做日志文件(archiveredo log file),就其划分依据还得从日志文件的记录机制和Oracle数据的运行模式来说。
首先在Oracle数据库中,日志文件是成组使用的。每一个Oracle数据库系统都有至少两个日志文件组,每一个日志文件组有至少一个日志文件。在数据库工作过程中,多个日志文件组之间是循环使用的。当一个日志文件组中的日志文件被填满后,系统将会发生日志切换,系统自动转换写另一个日志文件组中的日志文件。如果所有的日志文件组都被填满后,则系统又会将日志信息写入到第一个日志文件组中,这时第一个日志文件组中的日志信息可能被覆盖掉。第一个日志文件组中的日志信息是否被覆盖取决于数据库的工作模式。在Oracle数据库中,数据库的运行模式有两种,一种是归档模式(ARCHIVELOG),另一种是非归档模式(NOARCHIVELOG)。
当数据库运行在非归档模式时,如果发生日志切换,则日志信息直接被覆盖。而当数据库以归档模式运行时,如果发生日志切换,且需要覆盖已经存的日志信息,则系统将启用ARCH进程将被要覆盖的日志信息保存到磁盘或磁带上形成归档重做日志。因此,在非归档模式下运行的数据库,只包含联机重做日志,而没有归档重做日志。日志记录机制如下图所示:
说明:上图为Oracle数据库运行在非归档模式下日志记录示过程。当Group3这一组日志文件填满时系统产生日志切换后会重新写Group1这组日志。如果Oracle数据库此时是运行在归档模式下,则系统会在重新写Group1这组日志之前先把Group1中日志文件归档到指定的归档路径下,然后再重新Group1。因为当前为非归档模式系统会直接覆盖Group1。
前面我们讲了Oracle数据库物理结构包括有日志文件,同时也讲了日志文件分为联机重做日志文件和归档重做日志文件。要产生归档日志文件要求Oracle数据库必须运行在归档模式下。在归档模式下,归档日志将会象电影胶片一样将数据库的行为记录下来,一旦发生数据库损坏,只要存在有效的物理备份和物理备份时点以来的归档日志,将可以把数据库完全恢复;这样就可以提高Oracle数据库的可恢复性。
但在默认情况下,Oracle数据库是不采用归档模式的。我们可以通过使用archive log list命令来查询当前数据库是否工作在归档模式下:
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/product/10.2.0/db_1/dbs/arch
Oldest online log sequence 1306
Current log sequence 1309
No Archive Mode表示数据库工作在非归档模式下的,将会非常危险。
我们认为所有的ZLHIS数据库都必须工作在归档模式下,将数据库置于归档模式就最重要的数据库安全技术!!
关于启动和关闭数据库的归档(ARCHIVELOG)模式步骤详述如下:
1. 干净关闭数据库,使用SHUTDOWN IMMEDIATE:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
2. 启动数据库到mount状态
SQL> startup mount;
ORACLE instance started.
Total System Global Area 101782828 bytes
Fixed Size 451884 bytes
Variable Size 37748736 bytes
Database Buffers 62914560 bytes
Redo Buffers 667648 bytes
Database mounted.
3. 启用或停止归档模式,如果要启用归档模式,使用alter database archivelog命令。
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
我们可以透过archive log list命令再次查看归档信息:
SQL> archive log list;
Database log mode ArchiveMode
Automatic archival Enabled
Archive destination /opt/oracle/oradata/conner/archive
Oldest online log sequence 148
Next log sequence to archive 151
Current log sequence 151
Archive Mode表示数据库已经工作在归档模式下的。Archive destination说明了归档日志的保存路径,在Oracle10g及以上的数据库将会自动使用恢复目录(Flash Recovery Directory)作为归档日志路径。