课外天地 李树青学习天地数据库系统原理课件 → Oracle数据库的存储管理


  共有18259人关注过本帖树形打印复制链接

主题:Oracle数据库的存储管理

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1939 积分:26594 威望:0 精华:34 注册:2003/12/30 16:34:32
Oracle数据库的存储管理  发帖心情 Post By:2009/11/30 20:34:32 [只看该作者]

数据库体系
Oracle体系分为两个部分,一是数据库,一是实例。
数据库是指Oracle中存储数据的部分,可以从物理结构或者逻辑结构来查看,物理结构包括数据文件、控制文件、参数文件、口令文件、归档日志文件和重做日志文件等,而逻辑结构是指表空间、段、区和数据块。逻辑对象信息通常存储在数据库的数据字典中。
实例是指Oracle在运行进程中使用的各种对象的联合体,包括SGA、PGA和后台进程。

注意几个概念:
在ORACLE7、8数据库中只有数据库名(db_name)和数据库实例名(instance_name)。在ORACLE8i、9i中出现了新的参数,即数据库域名(db_domain)、服务名(service_name)、以及操作系统环境变量(ORACLE_SID)。
这些都存在于同一个数据库中的标识,用于区分不同数据库的参数。
1)数据库名(db_name):数据库名是用于区分数据的内部标识,是以二进制方式存储于数据库控制文件中的参数,在数据安装或创建之后将不应该修改。数据库安装完成后,该参数被写入数据库参数文件pfile中。在每一个运行的ORACLE8i数据库中都有一个数据库名(db_name),如果一个服务器程序中创建了两个数据库,则有两个数据库名。其控制参数据分属在不同的pfile中控制着相关的数据库。
2)数据库实例名(instance_name):数据库实例名则用于和操作系统之间的联系,用于对外部连接时使用。在操作系统中要取得与数据库之间的交互,必须使用数据库实例名。例如,要和某一个数据库server连接,就必须知道其数据库实例名,只知道数据库名是没有用的,与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数据库安装完成后,该实例名被写入数据库参数文件pfile中。
数据库名与实例名之间的关系:数据库名与实例名之间的关系一般是一一对应关系,有一个数据库名就有一个实例名,如果在一个服务器中创建两个数据库,则有两个数据库名,两个数据库实例名,用两个标识确定一个数据库,用户和实例相连接。但在8i、9i的并行服务器结构中,数据库与实例之间不存在一一对应关系,而是一对多关系,一个数据库对应多个实例,同一时间内用户只一个实例相联系,当某一实例出现故障,其它实例自动服务,以保证数据库安全运行。
3)服务名(service_name):SID标识数据库一个实例,但是一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,而不是一个实例。一般的单台服务器,用servie_name和sid连接均可。
4)操作系统环境变量(ORACLE_SID):在实际中,对于数据库实例名的描述有时使用实例名(instance_name)参数,有时使用ORACLE_SID参数,操作系统环境变量ORACLE_SID用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID。此参数与ORACLE_BASE、ORACLE_HOME等用法相同。在数据库安装之后,ORACLE_SID被用于定义数据库参数文件的名称。通过操作系统切换不同的ORACLE_SID来启动不同的实例。

1 数据库的物理结构
1、1 数据文件
Oracle数据库通常包括很多数据文件(扩展名为dbf),一个数据文件通常都与一个表空间相关联,但是一个表空间可以关联多个数据文件。
Oracle数据库至少要有一个数据文件,第一组数据文件通常称为系统数据文件,与system表空间相关,它由create database自动创建。
如果需要保存非系统数据,应该使用自建表空间存储数据,命令为:
create tablespace stu datafile 'C:\oracle\oradata\MyOracle\stu.dbf' size 2M;

可以查询视图得到数据文件信息,如:
select name from V$datafile;
select * from v$controlfile;

另外,临时表空间也关联临时数据文件,它不能设置为只读和重命名。

数据文件一般存放在$OARCLE_HOME/oradata/<db_name>目录下。

1、2 重做日志文件
记录数据库的更新信息,用于完整性恢复。Oracle数据库至少需要两个重做日志文件,第一个是由create database自动创建,可以使用命令查看相关文件信息,如:
select * from v$logfile;

缺省情况下为NOARCHIVELOG,Oracle轮流交替地在重做日志文件中写入所作的一切修改信息,不保留旧的重做日志信息(可以在原来基础覆盖写入)。因此一般情况下只能进行有限的恢复

开始数据库包含3个日志文件,它们建立在:$ORACLE_HOME/oradata/<db_name>目录下。它们的缺省名字为:redo01.log、redo02.log和redo03.log。

1、3 归档重做日志文件
它是重做日志文件的拷贝,可以归档于二级存储设备。默认数据库不启动此文件,必须设置数据库为归档模式(Archivelog)才能启动。
当系统设置为归档模式(Archivelog),Oracle自动将每次即将被覆盖(冲掉)的日志信息先作备份,然后再其上记录所修改的信息。这样的方式,就可以利用备份与恢复工作进行某时期的数据恢复。

1、4 控制文件
控制文件是由Oracle数据库实例在启动时被访问的内部二进制文件,它们所存放的路径由参数文件的control_files参数来确定。
用于跟踪数据库的物理组件,使用此文件来识别与数据库相关的所有数据文件和重做日志文件。它也往往存储为多份。

Oracle一般有两个或更多的控制文件,每个控制文件记录有相同的信息,在数据库运行中如果某个控制文件出错时,Oracle会自动使用另外一个控制文件。当所有的控制文件都损坏时系统将不能工作。在数据库安装完成后,安装程序建立了3个控制文件。它们建立在:$ORACLE_HOME/oradata/<db_name>目录下。它们的缺省名字为:control01.ctl、control02.ctl和control03.ctl。
虽然Oracle在同一时间同时更新所有的控制文件,但同一时间用户只能用一个控制文件。

控制文件的内容包括:数据库名字(控制文件只能属于一个数据库),数据库建立时的邮戳,数据文件-名字,位置及联机/脱机,重做日志文件-名字及位置,表空间名字,当前日志序列号,最近检查点信息,恢复管理器信息(RMAN)。

修改参数文件INITsid.ORA中的CONTROL_FILES以便控制所有控制文件的位置。

在数据库系统建立完成后,可以从数据字典V$PARAMETER中查询到控制文件的信息,如:
select * from V$PARAMETER where name='control_files';
或者
select name,value from v$parameter where name like 'control_files';

也可以使用下面的命令得到CREATE CONTROLFILE的命令,命令产生后被写到跟踪文件中,如:
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
从INITsid.OAR中得到跟踪文件位置,如:
user_dump_dest=C:\oracle\admin\MyOracle\udump
从中即可发现命令

1、5 口令文件
用户信息一般由数据库口令文件来维护。

1、6 参数文件
如spfile等文件。
也被称为初始化参数文件(initialization parameter file)。
Oracle初始化参数文件是一个可以编辑的文本文件。它是在数据库实例启动时被访问,从而得到数据文件、日志文件、控制文件等的路径,此外,初始化参数文件还提供实例所用的参数等。
一般的名称都是INITsid.ORA,是配置参数和数值的集合。每一个参数值都控制或修改数据库和实例的某个方面。早期的版本把参数都写在initsid.ora文件中,但在ORACLE 8之后,多数参数已不在该文件中出现,需修改这些参数时只能使用SET SESSION或SET SYSTEM等命令来进行。
查看系统参数可用:select * from v$parameter;

1、7 其它支持文件
除了上面的三类文件外,还有:Sqlnet.ora文件、Tnsnames.ora文件、Listener.ora文件等。

2 数据库的逻辑结构
2、1 表空间(tablespace)
表空间实际上由多个分离的数据文件组成。
典型的Oracle数据库包含system表空间、一个临时表空间、一个撤销表空间、一个索引用的表空间和其他用户的表空间。
建议为每个用户开设一个表空间。

具体说明如下:
1)系统表空间(System tablespace)
是各种不同版本的Oracle必备的部分,存放Oracle系统的一些信息,一般只有一个SYSTEM表空间。

2)临时表空间(Temporary  tablespace )
由于Oracle工作时经常需要一些临时的磁盘空间,这些空间主要用作查询时带有排序(Group by,Order by等)等算法所用,当用完后就立即释放,对记录在磁盘区的信息不再使用,因此叫临时表空间。一般安装之后只有一个TEMP临时表空间。

3)工具表空间(Tools tablespace)
用于保存Oracle数据库工具所需的数据库对象,这些工具表空间存放在工作时所用的专用表。旧的Oracle版本无此表空间。安装之后的工具表空间是Tools。

4)用户表空间(Users tablespace)
用于存放一些实验例子用的空间,当然也可以用于存放应用系统的数据。旧版本无Users表空间。现在的用户表空间为 USERS 。

5)数据及索引表空间
存放数据及索引的表空间,Oracle7以后都提倡在应用系统中,特别是具有大量数据的系统,要把数据和索引分开存放在不同的分区中,以便提高查询速度。在安装后索引表空间可能是INDX。数据表空间就是USERS。

6)回滚段表空间(Rollback Segment)
Oracle数据库系统在运行Insert、Update、Delete时都需要一个磁盘空间来存放恢复信息(Undo Information),以便在进行恢复时能将原来信息读出来。数据库管理员也可根据应用的需要建立另外的回滚段表空间。

2、2 段(segment)
一个表空间可以有多个段。
段是指占用数据文件空间的通称,或数据库对象使用的空间的集合。
段可以有表段、索引段、回滚段、临时段和高速缓存段等。

如:
CREATE TABLE  abc ( empno number(4),ename varchar2(20),sal number(9,2)) TABLESPACE system storage(initial 500k next 256k pctincrease 0);
说明:
段被分配=初始区间=500k,当开始的500k用完后就再分配256k,此时段=500k+256k,如果所分配的区间又用完后,就再分配256k。

2、3 区(extent)
分配给对象(如表)的任何连续块叫区间,区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块)。
一个段由多个区组成,区为一组连续的数据块。段要增长也以区为单位。
区间的大小由next决定。
一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象;
一个段所用去多少区间可用下命令查到:
select segment_name,tablespace_name,count(*) from dba_extents having count(*)>1 group by segment_name,tablespace_name;

2、4 数据块(block)
Oracle的数据块也叫Oracle块。
Oracle数据库中最小的IO单位,是操作系统中块的整数倍,是组成区的基本单位。
Oracle系统在创建表空间时将数据文件格式化成若干个Oracle块,每个Oracle块是Oracle系统处理的最小单位。
块的大小在安装系统时确定,可以选择“自定义安装”来设置大小,也可以在CREATE DATABASE创建数据库实例时指定。其最小为2K,最大可达为64K。块的大小一旦确定下来就不能改动。
块的大小可以用下面命令查到:select name,value from v$parameter where name like 'db_block_size';

3 数据字典
是一组在system表空间中的只读表(数据字典是只读对象,不允许任何人对其进行修改),用于维护数据库的系统目录信息。执行任何数据操作都要首先查询此数据字典,数据字典也会随着操作同步更新。存放在SYSTEM表空间中,用户可以用SQL语句访问数据库数据字典。

4 数据库实例
Oracle实例(Instance)是由一组后台进程和内存结构组成。每个运行的数据库系统都与实例有关。所以,有时称Oracle实例为数据库操作系统。

4、1 内存结构
主要包含系统全局区域(SGA)和进程全局区域(PGA)。

1)SGA为共享内存区域,包括数据库块缓冲区高速缓存、库高速缓存、共享池、大缓冲池和Java池,其中共享池还可以分为日志缓冲区高速缓存和数据字典高速缓存,可以通过命令查看SGA的大小:
show sga;

2)SGA中由后台进程访问的部分为固定SGA,由Oracle服务器自动维护,可以通过命令查看SGA的组成情况:
select * from v_$sgastat;

3)数据库块缓冲区高速缓存简称为块缓存,是SGA的重要组成部分,可以通过命令查看情况:
show parameter db_cache_size;
使用命令可以动态改变块缓存的大小:
alter system set db_cache_size=20000000;

4)日志缓冲区高速缓存不可改变大小,可以通过命令查看大小情况:
show parameters log_buffer;

5)共享池(shared pool)中可以存储以前执行过的SQL或者PL/SQL语句,加快相同语句的执行速度。其中的数据字典高速缓存可以存储数据字典中返回的信息。

6)PGA是Oracle使用的内存区域,该区同一时间只能被一单个进程存放数据和控制,用于存放会话变量及内部数组等。PGA由专用SQL区域和会话内存区域组成,大小不能由DBA控制。

4、2 Oracle进程
可以分为服务器进程、后台进程和从属进程。在windows系统上这些进程是以oracle进程实现的。可以通过命令查看情况:
select * from v$bgprocess;

1)服务器进程用来响应每个用户的请求。

2)后台进程执行关键任务,具体进程包括进程监视器(PMON)、系统监视器(SMON)、数据库记录器(DBWR)、日志记录器(LGWR)和检查点进程(CKPT)。
进程监视器(PMON)负责监视其他进程。
系统监视器(SMON)执行自动实例恢复和管理空间。
数据库记录器(DBWR)负责从块缓存向数据文件刷新数据。
日志记录器(LGWR)负责从日志缓存向重做日志文件刷新数据。

5 管理数据库文件

5、1 管理控制文件
控制文件维护着数据文件和重做日志文件的信息。可以通过以下语句查看当前数据库的控制文件信息:
select * from v$controlfile;
如果丢失,可以使用create controlfile来重建控制文件。

5、2 管理数据文件
一个表空间可以由多个数据文件组成,一个数据文件只能属于一个表空间,在Oracle中,每个数据文件都有一个绝对和相对的文件号,绝对文件号是分配给数据文件的唯一数字,相对文件号用于识别属于一个表空间的数据文件。

创建数据库时会自动产生SYSTEM表空间,它至少会占据一个数据文件,可以继续添加数据文件给新的表空间使用,与一个数据库相关的数据文件最大数目为DB_FILES参数决定,默认为200(由于SYSTEM表空间至少占据一个数据文件,实际为199),

如果当前磁盘无法放下更大的数据文件时,应当考虑重定位数据文件,方法为:
1)使当前数据文件所关联的表空间脱机(此步骤需要将数据库重启为归档模式)
alter tablespace stu offline;

2)拷贝或者移动数据文件到他处

3)重命名属于表空间的数据文件,如:alter tablespace stu rename datafile '源路径和源文件' to '新路径和新文件'
alter tablespace stu rename datafile 'C:\oracle\oradata\MyOracle\stu.dbf' to 'C:\oracle\oradata\MyOracle\stu\stu.dbf'

4)使这个表空间在线
alter tablespace stu online;

参数DB_BLOCK_CHECKSUM用于设定检查数据文件块是否损坏,为真会降低性能,查看方法为:
select * from v$parameter2  where name='db_block_checksum';

查看所有数据文件和详细信息:
select * from dba_data_files;

查看一个特定对象驻留在哪个数据文件中:
select * from dba_extents;

5、3 管理重做日志文件
在数据库更新提交后,系统会把数据库的更改信息写入联机重做日志文件中。为了保证可恢复性,重做日志文件是冗余存在的。查看日志文件的语句为:
select * from v$logfile;

5、4 管理表空间
它有两种类型,一种为永久性(Permanent),关闭实例后仍然留存,一种为临时性(Temporary),关闭后数据无存。

表空间既可以利用数据字典来管理,也可以自我本地管理,这样做性能更好,所以默认的永久性表空间都是本地管理。

System表空间是创建数据库时自动创建,存储数据字典信息和系统回退段。初次以往,表空间还有用户表空间、撤销表空间和临时表空间。

5、5 数据库的归档
数据库的归档模式(archivelog)可以使得重做日志文件以循环的方式拷贝到二级目的地(归档文件),ARCH进程负责此事。可以手工来做,也可以自动做,此时需要设置初始参数log_archive_start为真即可自动归档。

激活归档的方式为:
1)关闭数据库
shutdown;

2)设置自动归档:log_archive_start=true;

3)加载数据库:
startup mount;

4)切换数据库到归档日志模式
alter database archivelog;(或者到不归档日志模式:alter database noarchivelog;)

5)打开数据库
alter database open;

6)校验归档方式
archive log list;

[此贴子已经被作者于2010-12-11 20:19:35编辑过]

 回到顶部