- Oracle 11g从入门到精通(第2版) (软件开发视频大讲堂)
- 明日科技
- 5333字
- 2020-11-28 15:54:49
2.3 物理存储结构
视频讲解:光盘\TM\lx\2\物理存储结构.mp4
逻辑存储结构是为了便于管理Oracle数据而定义的具有逻辑层次关系的抽象概念,不容易理解;但物理存储结构比较具体和直观,它用来描述Oracle数据在磁盘上的物理组成情况。从大的角度来讲,Oracle的数据在逻辑上存储在表空间中,而在物理上存储在表空间所包含的物理文件(即数据文件)中。
Oracle数据库的物理存储结构由多种物理文件组成,主要有数据文件、控制文件、重做日志文件、归档日志文件、参数文件、口令文件和警告日志文件等,如图2.5所示。下面将对这些物理文件进行讲解。
图2.5 Oracle的物理存储结构
2.3.1 数据文件
数据文件是用于保存用户应用程序数据和Oracle系统内部数据的文件,这些文件在操作系统中就是普通的操作系统文件,Oracle在创建表空间的同时会创建数据文件。Oracle数据库在逻辑上由表空间组成,每个表空间可以包含一个或多个数据文件,一个数据文件只能隶属于一个表空间,如图2.5所示的数据文件部分。
在创建表空间的同时,Oracle会创建该表空间的数据文件。在表空间中创建数据对象(如表、索引、簇等)时,用户是无法指定使用哪一个数据文件来进行存储的,只能由Oracle系统负责为数据对象选择具体的数据文件,并在其中分配物理存储空间。一个数据对象的数据可以全部存储在一个数据文件中,也可以分布存储在同一个表空间的多个数据文件中。
在读取数据时,Oracle系统首先从数据文件中读取数据,并将数据存储在内存的高速数据缓冲区中。如果用户要读取数据库中的某些数据,而请求的数据又不在内存的高速数据缓冲区中,则需要从相应的数据文件中读取数据并存储在缓冲区中。当修改和插入数据时,Oracle不会立即将数据写入数据文件,而是把这些数据保存在数据缓冲区中,然后由Oracle的后台进程DBWR决定如何将其写入相应的数据文件。这样的存取方式减少了磁盘的I/O操作,提高了系统的相应性能。
【例2.4】 通过查询dba_data_files或v$datafile数据字典来了解Oracle系统的数据文件信息,具体代码如下(实例位置:光盘\TM\sl\2\2)。
SQL> col file_name for a50; SQL> set linesize 100; SQL> select file_name, tablespace_name from dba_data_files;
本例运行结果如图2.6所示。
图2.6 Oracle系统的数据文件信息
在上面的代码中,可以看到3种类型的数据文件:系统数据文件(SYSTEM01.DBF和SYSAUX01.DBF)、撤销数据文件(UNDOTBS01.DBF)和用户数据文件(USERS01.DBF、EXAMPLE01.DBF、TBSP_1.DBF和TBSP_2.DBF),下面对这3种类型的数据文件进行介绍。
(1)系统数据文件。用于存放“特殊”的用户数据和Oracle系统本身的数据,如用户建立的表名、列名及字段类型等,这些属于用户数据范畴,这些数据被存放在系统表空间所包含的数据文件中;而Oracle系统内部的数据字典、系统表(如dba_data_files、dba_temp_files等)中所存储的数据属于Oracle系统的内部数据,这些数据也存放在系统表空间所包含的数据文件中。
(2)撤销数据文件。撤销数据文件隶属于撤销表空间。如果修改Oracle数据库中的数据,那么就必须使用撤销段,撤销段用来临时存放修改前的旧数据,而撤销段通常存放在一个单独的撤销表空间中,这个撤销表空间所包含的数据文件就是撤销数据文件。
(3)用户数据文件。用户数据文件用于存放用户应用系统的数据,这些数据包括与应用系统有关的所有相关信息,比如,上述TBSP_1.DBF和TBSP_2.DBF文件就是一个具体应用系统的两个数据文件。
在上面的代码中并没有看到临时表空间所包含的数据文件,这是由于临时数据文件本身的特殊性,从Oracle 9i以后,Oracle将临时表空间所对应的临时数据文件与一般数据文件分开,要了解Oracle系统的临时数据文件信息,可以从dba_temp_files或v$tempfile数据字典中查询。
【例2.5】 通过查询dba_temp_files或v$tempfile数据字典来查看临时文件的信息,具体代码如下(实例位置:光盘\TM\sl\2\3)。
SQL> col file_name format a50; SQL> col tablespace_name format a20; SQL> select file_name, tablespace_name from dba_temp_files;
本例运行结果如图2.7所示。
图2.7 查看临时文件的信息
2.3.2 控制文件
控制文件是一个二进制文件,它记录了数据库的物理结构,其中主要包含数据库名、数据文件与日志文件的名字和位置、数据库建立日期等信息。控制文件一般在Oracle系统安装时或创建数据库时自动创建,控制文件所存放的路径由服务器参数文件spfileorcl.ora的control_files参数值来指定。
由于控制文件存放有数据文件、日志文件等的相关信息,因此,Oracle实例在启动时必须访问控制文件。如果控制文件正常,实例才能加载并打开数据库;但若控制文件中记录了错误的信息,或者实例无法找到一个可用的控制文件,则实例无法正常启动。
当Oracle实例在正常启动时,系统首先要访问的是初始化参数文件SPFILE,然后Oracle为系统全局区(SGA)分配内存。这时,Oracle实例处于安装状态,并且控制文件处于打开状态;接下来Oracle会自动读出控制文件中的所有数据文件和日志文件的信息,并打开当前数据库中所有的数据文件和所有的日志文件以供用户访问。
每个数据库至少拥有一个控制文件,一个数据库可以同时拥有多个控制文件,但是一个控制文件只能属于一个数据库。控制文件内部除了存放数据库名及其创建日期、数据文件、日志文件等的相关信息之外,在系统运行过程中,还存放有系统更改号、检查点信息及归档的当前状态等信息。
Oracle数据库系统出于安全考虑,在安装Oracle数据库或创建数据库时,系统会自动创建两个或三个控制文件,每个控制文件记录相同的信息。这样可确保在数据库运行时,如果某个控制文件损坏,Oracle会自动使用另外一个控制文件,当所有控制文件都损坏时,系统将无法工作。
【例2.6】 通过查询v$controlfile数据字典来查看Oracle系统的控制文件信息,具体代码如下(实例位置:光盘\TM\sl\2\4)。
SQL> col name format a60; SQL> select name from v$controlfile;
本例运行结果如图2.8所示。
图2.8 Oracle系统的控制文件信息
说明
当数据库的物理组成更改时,Oracle自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。
2.3.3 日志文件
日志文件的主要功能是记录对数据所作的修改,对数据库所作的修改几乎都记录在日志文件中。在出现问题时,可以通过日志文件得到原始数据,从而保证不丢失已有操作成果。Oracle的日志文件包括重做日志文件(Redo Log File)和归档日志文件(Archive Log File),它们是Oracle系统的主要文件,尤其是重做日志文件,它是Oracle数据库系统正常运行所不可或缺的。下面将介绍这两种日志文件。
1.重做日志文件
重做日志文件用来记录数据库所有发生过的更改信息(修改、添加、删除等信息)及由Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息,在数据库恢复时,可以从该日志文件中读取原始记录。在数据库运行期间,当用户执行COMMIT命令(数据库提交命令)时,数据库首先将每笔操作的原始记录写入日志文件中,写入日志文件成功后,才把新的记录传递给应用程序,所以,在日志文件上可以随时读取原始记录以恢复某些数据。
技巧
通过对表或者整个表空间设定NOLOGGING属性时,使基于表或表空间中所有的DML操作(如创建表、删除视图、修改索引等)都不会生成日志信息,这样就会减少了日志信息的产生。
为了保障数据库系统的安全,每个Oracle实例都启用一个日志线程来记录数据库的变化。日志线程由若干“日志组”构成,而每个日志组又由一个或者多个日志文件构成。
【例2.7】 若要了解Oracle系统的日志文件信息,可以通过查询v$controlfile视图来实现,代码如下(实例位置:光盘\TM\sl\2\5)。
SQL> col member for a50; SQL> select name from v$controlfile;
本例运行结果如图2.9所示。
图2.9 Oracle系统的日志文件信息
Oracle系统在运行过程中产生的日志信息,首先被临时存放在SGA(系统全局区)的重做日志缓冲区中,当发出COMMIT命令(或日志缓冲区信息满1/3)时,LGWR进程(日志写入进程)将日志信息从重做日志缓冲区中读取出来,并将读取的日志信息写入日志文件组中序列号较小的文件里,一个日志组写满后接着写另外一个日志组。当LGWR进程将所有能用的日志文件都使用过一遍之后,它将再次转向第一个日志组重新覆写。
2.归档日志文件
在所有的日志文件被写入一遍之后,LGWR进程将再次转向第一个日志组进行重新覆写,这样势必会导致一部分较早的日志信息被覆盖掉,但Oracle通过归档日志文件解决了这个问题。
Oracle数据库可以运行在两种模式下,即归档模式和非归档模式。非归档模式是指在系统运行期间,所产生的日志信息不断地记录到日志文件组中,当所有重做日志组被写满后,又重新从第一个日志组开始覆写。归档模式就是在各个日志文件都被写满而即将被覆盖之前,先由归档进程(ARCH)将即将被覆盖的日志文件中的日志信息读出,并将读出的日志信息写入归档日志文件中,而这个过程又被称为归档操作。
在归档操作进行的过程中,日志写入进程(ARCH)需要等待归档进程(ARCH)的结束才能开始覆写日志文件,这样就延迟了系统的响应时间,而且归档日志文件本身又会占用大量的磁盘空间,这些都会影响系统的整体性能。所以在默认情况下,Oracle系统不采用归档模式运行。
【例2.8】 可以通过v$database视图来查看当前Oracle系统是否采用归档模式,代码如下(实例位置:光盘\TM\sl\2\6)。
SQL> col name format a30; SQL> select dbid, name, log_mode from v$database;
本例运行结果如图2.10所示。
图2.10 查看当前Oracle系统的归档模式
如果将Oracle数据库系统设置成在归档模式下运行,则可以通过服务器参数文件SPFILE的log_archive_dest参数来确定归档日志文件的所在路径。
【例2.9】 可以使用下面的语句来查询归档日志文件的所在路径,代码如下(实例位置:光盘\TM\sl\2\7)。
SQL> set pagesize 30; SQL> show parameter log_archive_dest;
本例运行结果如图2.11所示。
图2.11 归档日志文件的所在路径
技巧
若显示SPFILE文件的指定参数的信息,则只需要使用“show parameter”+参数名即可。
2.3.4 服务器参数文件
服务器参数文件SPFILE(Server Parameter File)是二进制文件,用来记录Oracle数据库的基本参数信息(如数据库名、控制文件所在路径、日志缓冲大小等)。数据库实例在启动之前,Oracle系统首先会读取SPFILE参数文件中设置的这些参数,并根据这些初始化参数来配置和启动实例。比如,设置标准数据块的大小(即参数db_block_size的值)、设置日志缓冲区的大小(即参数log_buffer的值)等,所以SPFILE参数文件非常重要。服务器参数文件在安装Oracle数据库系统时由系统自动创建,文件的名称为SPFILEsid.ora, sid为所创建的数据库实例名。
与早期版本的初始化参数文件INITsid.ora不同的是,SPFILE中的参数由Oracle系统自动维护,如果要对某些参数进行修改,则尽可能不要直接对SPFILE进行编辑,最好通过企业管理器(OEM)或ALTER SYSTEM命令来修改,所修改过的参数会自动写到SPFILE中。
1.查看服务器参数
用户可以通过如下两种方式查看数据库的服务器参数。
(1)查询视图V$PARAMETER,可利用该动态性能视图来确定参数的默认值是否被修改过,以及是否可以用ALTER SYSTEM和ALTER SESSION命令修改。
【例2.10】 查询视图V$PARAMETER中的name、value、ismodified列的值,代码如下(实例位置:光盘\TM\sl\2\8)。
SQL> col name for a30; SQL> col value for a30; SQL> select name, value, ismodified from v$parameter;
本例运行结果如图2.12所示。
图2.12 查询视图V$PARAMETER
(2)可以使用SQL*Plus的SHOW PARAMETER命令显示服务器的参数。
【例2.11】 通过SHOW PARAMETER命令显示服务器参数,代码如下。
SQL> show parameter
本例运行结果如图2.13所示。
图2.13 显示服务器参数
2.修改服务器参数
修改数据库的服务器参数,主要通过企业管理器(OEM)或ALTER SYSTEM命令来实现。
(1)通过企业管理器(OEM)修改,首先使用SYSTEM用户登录OEM,然后选择“服务器”页面中的“初始化参数”项,将打开如图2.14所示的“初始化参数”页面,在该页面的“值”列中就可以修改参数值,然后保存就可以。
图2.14 OEM中的初始化参数
(2)使用ALTER SYSTEM命令修改服务器参数。
【例2.12】 通过ALTER SYSTEM命令修改标准数据块的大小为4096字节,代码及运行结果如下。
alter system set db_block_size=4096; 系统已更改。
2.3.5 密码文件、警告文件和跟踪文件
Oracle系统运行时,除了必须的数据文件、控制文件、日志文件及服务器参数文件外,还需要一些辅助文件,如密码文件、警告文件和跟踪文件,下面对这些辅助文件进行简单的介绍。
1.密码文件
密码文件是Oracle系统用于验证sysdba权限的二进制文件,当远程用户以sysdba或sysoper连接到数据库时,一般要用密码文件验证。
Oracle 11g(这里以发行版2为例)密码文件的默认存放位置在%dbhome_1%\database目录下,密码文件的命名格式为PWD<sid>,其中sid表示数据库实例名。创建密码文件既可以在创建数据库实例时自动创建,也可以使用ORAPWD.mp4工具手动创建,创建密码文件的命令格式如下:
C:\>ORAPWD FILE=<filename> PASSWORD=<password> ENTRIES=<max_users>
filename:表示密码文件名称。
password:表示设置internal/sys账户口令。
max_users:表示密码文件中可以存放的最大用户数,对应允许以sysdba/sysoper权限登录数据库的最大用户数。
创建了密码文件后,需要设置初始化参数remote_login_passwordfile来控制密码文件的使用状态,通常有3种状态值:NONE表示只要通过操作系统验证,就不用通过Oracle密码文件验证;SHARED表示多个数据库实例都可以采用此密码文件验证;EXCLUSIVE表示只有一个数据库实例可以使用此密码文件验证。
【例2.13】 创建一个密码文件,其SYS口令为012345,代码如下。
C:\>ORAPWD FILE=E:\app\Admin\product\11.2.0\dbhome_1\database\PWDorcl.ora password=012345 entries=40
2.警告文件
警告文件(即警告日志文件)是一个存储在Oracle系统目录下的文本文件(名称通常为alert_orcl.log),它用来记录Oracle系统的运行信息和错误信息。运行信息一般包括Oracle实例的启动与关闭、建立表空间、增加数据文件等;错误信息包括空间扩展失败、启动实例失败等。
当Oracle系统安装完毕后,其实例日常运行的基本信息都会记录在警告文件中。警告文件的路径可通过Oracle系统的background_dump_dest参数值来查看,并且该参数值由服务器进程和后台进程写入。
【例2.14】 在V$PARAMETER视图中查看当前实例的警告文件的路径,代码及运行结果如下。
SQL> col name for a20; SQL> col value for a50; SQL> select name, value from v$parameter where name = 'background_dump_dest'; NAME VALUE -------------------- ----------------------------------------------- background_dump_dest e:\app\administrator\diag\rdbms\orcl\orcl\trace
注意
随着时间的推移,警告文件会越来越大,数据库管理员应该定期删除警告文件。
3.跟踪文件
跟踪文件包括后台进程跟踪文件和用户进程跟踪文件。后台进程跟踪文件用于记录后台进程的警告或错误消息。后台进程跟踪文件的磁盘位置由初始化参数BACKGROUND_DUMP_DEST确定,后台进程跟踪文件的命名格式为<sid>_<processname>_<spid>.trc,如orcl_cjq0_5172.trc。用户进程跟踪文件用于记载与用户进程相关的信息,它主要用于跟踪SQL语句。通过用户进程跟踪文件,可以判断SQL语句的执行性能。用户进程跟踪文件的位置由初始化参数user_dump_dest确定,用户进程跟踪文件的命名格式为<sid>_ora_<spid>.trc,如orcl_ora_4888.trc。
【例2.15】 在V$PARAMETER视图中查看当前实例的用户跟踪文件的路径,代码及运行结果如下。
SQL> select value from v$parameter where name = 'user_dump_dest'; VALUE ------------------------------------------------- e:\app\administrator\diag\rdbms\orcl\orcl\trace
说明
每个后台进程都有对应的后台进程跟踪文件。