日期:2014-05-16  浏览次数:20661 次

Oracle体系结构之-物理结构(transshipment)

?

一、物理文件的分类

Oracle数据库的物理文件可以分成三类:

?

·数据文件

·日志文件

·控制文件

?

二、数据文件

数据文件顾名思义是用来存储数据的。例如:表,索引等等。从数据文件中读取出来的数据会首先存放在内存中的SGA,作为缓冲数据。应用对数据的修改也是先保持在SGA中。由DBWR在某一时刻将其写入到数据文件中。

?

那么如何查看数据库中的数据文件呢?我们可以使用以下的SQL语句:

?

SQL>select * from dba_data_files;

SQL>select * from v$datafile;

第一个SQL语句查询到的是文件的静态信息,第二个SQL语句查询到的动态信息,其中特别重要的就是系统的检查号(SCN)。

?

我们可以通过查询dba_free_space表来了解各个表空间的使用信息,从这个表中我们看到每一个表空间下每一个块的BLOCK_ID,BYTES,BLOCKS值。

?

SQL>select * from dba_free_space;

我们可以通过给某个表空间添加数据文件来增加其存储空间的大小,例如:

?

SQL>alter tablespace 'table space name' add datafile 'data file name' size ***m autoextend off;

?

如果我们觉得数据文件的可用空间已经所剩不多了,那么要重新调整数据文件的大小,这时就可用通过执行以下的SQL语句来完成了:

?

SQL>alter database dbname datafile 'data file name' resize ***M

?

但是如果每次都要管理员手动来调整增加表空间的大小是一件很麻烦的事情,所以Oracle为我们提供了一些关键字,通过这些关键字我们可以轻松地让表空间在空间不够时自动扩展表空间。例如:

?

SQL>alter database dbname datafile 'data file name' autoextended on next 50m maxsize unlimited;

上面的SQL语句使到数据库dbname下面的数据文件'data file name'在空间不够时自动扩展,每次扩展50M。不设上限。

?

如果我们不加以控制的话,那么表空间有可能无限制地扩展下去,所以我们又可以通过maxsize来限制上限。

?

SQL>alter database dbname datafile 'data file name' autoextend on next 50m maxsize 400m;

?

二、重做日志文件

?

重做日志文件记录了对数据库的所有修改的信息。

?

每一个Oracle数据库中都有至少两个的重做日志文件组,每个重做日志文件组都包含了一个到多个的重做日志文件-即日志成员。同一个日志文件组中的各个日志成员之间是镜像关系,它们的内容都是一模一样的。

?

Oracle在写日志的时候是以日志组为单位的,只有写完了同一个日志组中的所有日志成员之后,写日志才会结束。当一个日志文件组中所有的成员同时被写满数据时,系统自动转换到下一个日志文件组,这个转换过程称为日志切换。

?

当日志切换后,会给前一个日志组编一个号,用于归档日志的编号,这个编号称为日志序列号。此编号由1开始,每切换一次,序列号自动加1,最大值受参数MAXLOGHISTORY限制,该参数的最大值为65534。

?

当oracle把最后一个日志组写满了以后,自动转向第一个日志组,这时,再向第一个日志组写日志的时候, 如果数据库运行在非归档模式下,这个日志组中的原有日志信息就会被覆盖。

?

如果我们想查看日志文件的具体信息,可以通过以下的SQL语句来查看:

?

SQL>select * from v$log

这个动态视图的查询结果中包含了几个比较重要的信息,例如:

?

·GROUP#:日志文件组号

·SEQUENCE#:日志序列号

·STATUS:该组状态(CURRENT表示当前正在使用的,NACTIVE表示非活动组,ACTIVE表示归档未完成)

·FIRST_CHANGE#:系统改变号SCN(也称为检查点号)

上面我们提到日志文件有两种方式,第一种是非归档日志(NOARCHIVELOG),第二种是归档日志(ARCHIVELOG)。其中非归档日志在切换时,原日志文件的内容会被新的日志内容所覆盖,而对于对档模式日志,Oracle会首先对原日志文件进行归档存储,且在归档未完成之前不允许覆盖原日志。

?

如果我们想了解自己的数据库到底采用什么类型的日志模式,可以使用以下语句查询

?

SQL>select log_mode from v$database

?

上面我们提到一个叫做SCN(系统检查点号)的东西,SCN是系统恢复时一个非常重要的标志,在数据文件,日志文件,控制文件,数据库头都包含了这个标记。SCN由Oracle的后台进程CKPT在DBWR将数据写入磁盘后更新。查询SCN的方式有3种:

?

SQL>select first_change# from v$log;

SQL>select checkpoint_change# from v$datafile;

SQL>select checkpoint_change# from v$database;

三、控制文件控制文件是一个二进制文件,用来描述数据库的物理结构,一个数据库只需要一个控制文件,控制文件的内容包括:

?

·数据库名及数据库惟一标识

·数据文件及日志文件的标识

·系统恢复的必要信息,即SCN

?

我们可以在Oracle的init.ora文件中看到这样一个参数:controller_files = ('file1','file2'...'filen'),这说明数据库有多个控制文件,这些控制文件彼此之间都是镜像的关系。只要其中一个文件是完好的数据库就可以启动。

?

同样的,我们也可以通过如下的SQL语句来查看控制文件的信息:

?

SQL>select * from v$controller_file

?

?