Oracle数据库的体系结构是从某一角度来分析数据库的组成,工作过程以及数据库如何管理和组织数据的,主要包括物理存储结构,逻辑存储结构,内存结构以及进程结构。
Oracle的物理存储结构:
Oracle物理存储结构主要包括三种类型的物理文件,分别是数据文件(*.dbf),控制文件(*.ctl)和重做日志文件(*.log)。
1. 数据文件
数据文件主要是存储数据的文件。例如,数据文存储的表的记录和索引。在这些数据文件中,如果用户频繁的访问某些数据,那么这些数据就会被存储在内存的缓冲区中。当对这些数据进行读取时,Oracle首先会从内存de缓冲区中找到相关的数据信息。如果内存的缓冲区中不存在相关的数据,则从数据库文件中读取数据,然后存放到内存的数据缓冲区中,以供查询时使用。这种数据的存取方式不仅可以减少磁盘的I/O操作,还可以提高系统的相应性能。
如果需要了解数据文件的信息可以通过查询数据字典视图DBA_DATA_FILES和V$DATAFILE。首先通过DESC命令来了解一下数据字典视图DBA_DATA_FILES和V$DATAFILE的结构,数据字典视图DBA_DATA_FILES的结构如下:
SQL> DESCDBA_DATA_FILES;
名称 是否为空? 类型
----------------------------------- --------------------------------
FILE_NAME VARCHAR2(513)
FILE_ID NUMBER
TABLESPACE_NAME VARCHAR2(30)
BYTES NUMBER
BLOCKS NUMBER
STATUS VARCHAR2(9)
RELATIVE_FNO NUMBER
AUTOEXTENSIBLE VARCHAR2(3)
MAXBYTES NUMBER
MAXBLOCKS NUMBER
INCREMENT_BY NUMBER
USER_BYTES NUMBER
USER_BLOCK NUMBER
ONLINE_STATUS VARCHAR2(7)
在上述的结果中,FILE_NAME表示数据文件的名称以及存放的路径;FILE_ID表示数据文件在数据库中的ID号;TABLESPACE_NAME表示数据文件对应的表空间名;BYTES表示的是数据文件的大小;BLOCKS表示数据文
件所占用的数据块;STATUS表示数据文件的状态;AUTOEXTENSIBLE表示数据文件是否可扩展。数据字典
视图V$DATAFILE记录了数据文件的动态信息,其结构如下:
SQL> DESCV$DATAFILE;
名称 是否为空? 类型
----------------------------------- --------------------------------
FILE# NUMBER
CREATION_CHANGE# NUMBER
CREATION_ TI DATE
TS# NUMBER
RFILE# NUMBER
STATUS VARCHAR2(7)
ENABLED VARCHAR2(10)
CHECKPOINT_CHAN NUMBER
CHECKPOINT_TIME DATE
UNRECOVERABLE_CHANGE# NUMBER
UNRECOVERABLE_TIME DATE
LAST_CHANGE# NUMBER
LAST_TIME DATE
OFFLINE_CHANGE# NUMBER
ONLINE_CHANGE# NUMBER
ONLINE_TIME DATE
BYTES NUMBER
BLOCKS NUMBER
CREATE_BYTES NUMBER
BLOCK_SIZE NUMBER
NAME VARCHAR2(513)
PLUGGED_IN NUMBER
BLOCK1_OFFSET NUMBER
AUX_NAME VARCHAR2(513)
FIRST_NONLOGGED_SCN NUMBER
FIRST_NONLOGGED_TIME DATE
FOREIGN_DBID NUMBER
FOREIGN_CREATION_CHANGE# NUMBER
FOREIGN_CREATION_TIME DATE
PLUGGED_READONLY VARCHAR2(3)
PLUGIN_CHANGE# N MBER
PLUGIN_RESETLOGS_CHANGE# NUMBER
PLUGIN_RESETLOGS_TIME DATE
CON_ID NUMBER
在上述的结果中FILE#表示存放数据文件的编号;STATUS表示数据文件的状态;CHECKPOINT_CHANGE#表示数据文件的同步号,随着系统的运行自动修改,以维持数据文件的同步;BYTES表示数据文件的大小;BLOCKS表示数据文件所占用的数据块数;NAME表示数据文件的名称以及存放的路径。
2. 控制文件
控制文件是一个很小的二进制文件,主要包含与关于数据库物理结构的重要信息,存放数据库中的数据文件和日志文件的信息。
控制文件对于数据库的成功启动和正常运行至关重要。在加载数据库时必须先找到数据库的控制文件。如果控制文件正常,实例才能加载并打开数据库。但是如果控制文件中记录了错误的信息,或者实例无法找到一个可用的控制文件,数据库将无法加载,当然也无法打开。
一个Oracle数据库通常包含有多个控制文件,在数据库运行的过程中,Oracle数据库需要不断的更新控制文件,因此控制文件必须在整个数据库打开期间始终保持可用状态。如果某种原因导致控制文件不可用,那么数据库将会崩溃。
控制文件的信息可以通过数据字典视图V$CONTROLFILE来了解,其结构如下:
SQL> DESC V$CONTROLFILE;
名称 是否为空? 类型
----------------------------------- -------------
STATUS VARCHAR2(7)
NAME VARCHAR2(513)
IS_RECOVERY_DEST_FILE VARCHAR2(3)
BLOCK_SIZE NUMBER
FILE_SIZE_BLKS NUMBER
CON_ID NUMBER
在上述的结果中,STATUS表示控制文件的状态;NAME表示控制文件的名称以及路径的信息。例如查询控制文件的名称以及路径信息,如下:
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
-------------------------------------------------
D:\ORACLE\ORADATA\ORACLE12C\CONTROL01.CTL
D:\ORACLE\ORADATA\ORACLE12C\CONTROL02.CTL
从上述的结果可以看出,Oracle一般会默认创建两个包含相同信息的控制文件。其目的是为了当其中一个控制文件受损时可以调用另一个控制文件继续工作。
3. 重做日志文件
重做日志文件即日至文件,主要记录用户对数据库的操作信息。日志文件是数据库系统中最重要的文件之一,通过日志文件可以保证数据库的安全,也可以实现数据库的备份与恢复。一旦日志文件受损,那么数据库可能无法正常运行。
为了确保日志的安全,在实际的应用中,允许对日志文件进行镜像,日志文件与其镜像文件记录同样的日志信息,他们构成一个日志文件组,同一个组中的日志文件最好存放在不同的磁盘中,以便可以保证一个日志文件受损时,还有其他的日志文件提供日志信息。
通过数据字典V$LOG,可以了解系统当前正在使用哪个日志文件组,如下:
SQL>SELECT GROUP#,MEMBERS,STATUS FROM V$LOG;
GROUP# MEMBERS STATUS
-------------------- ----------------
1 1 INACTIVE
2 1 CURRENT
3 1 INACTIVE
4 2 INACTIVE
在上述的结构中,如果STATUS字段的值为CURRENT,则表示当前系统正在使用该字段对应的日志文件组。
当一个日志文件组的空间被占用完之后,Oracle系统会自动转换到另一个日志文件组,不过,管理员可以使用ALTER STSTEM命令惊醒手动切换日志文件。如下:
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
再次查询数据字典V$LOG,如下:
SQL> SELECT GROUP#,MEMBERS,STATUS FROMV$LOG;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 1 INACTIVE
2 1 ACTIVE
3 1 CURRENT
4 2 INACTIVE
从上述的结果看,系统当前运行的日志文件组已经改变。