数据库被分成一个或多个逻辑部件称作表空间。而表空间又被分成称作段(segment)的逻辑部件。这些段再细分就叫扩展(extents)。Oracle 一般有如下表空间:
SYSTEM 表空间
用户多个 表空间
工具表空间
只读表空间
临时表空间
回滚段表空间
§1.3 数据块、区间和段
Oracle系统的数据块(block)和区间(extent)及段(segment)存在一种关系。了解它们的关系对于管理和优化都有好处。
§1.3.1 数据块(data block)
Oracle的数据块也叫Oracle块;
Oracle系统在创建表空间时将数据文件格式化成若干个Oracle块;
每个Oracle块是Oracle系统处理的最小单位;
块的大小在安装系统时确定,可以选择“自定义安装”来设置大小;
块的大小一旦确定下来就不能改动;
块的大小可以从2k至64k不等;
块的大小可以用下面命令查到:
select name,value from v$parameter where name like 'db_block_size';
§1.3.2 区间(extent)
分配给对象(如表)的任何连续块叫区间;
区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);
区间的大小由next 决定;
一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象;
一个对象所用去多少区间可用下命令查到:
select segment_name,tablespace_name,count(*) from dba_extents
having count(*)>1 group by segment_name,tablespace_name;
§1.3.3 段(segment)
段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;
段可以有表段、索引段、回滚段、临时段和高速缓存段等;
段使用同表空间中的若干Oracle块(可以位于不同数据文件中)。
例:
CREATE TABLE abc ( empno number(4),ename varchar2(20),sal number(9,2))
TABLESPACE user_data storage(initial 500k next 256k pctincrease 0);
段被分配=初始区间=500k;
当开始的500k用完后就再分配256k; 此时段=500k+256k;
如果所分配的区间又用完后,就再分配256k, …
Alter table ... MOVE语句将表移动到一个新的段或新表空间上,这样可以实现对不合理存储参数进行修改,包括用一般的ALTER TABLE 不能修改的参数。如:
例1:通过移动来实现存储参数的修改:
Alter table emp MOVE
STORAGE(INITIAL 1m next 512k minextents 1 maxextents 999 pctincrease 0 );
2)用Alter table . . . MOVE 语句对表进行移动:
alter table emp move tablespace user_data storage(initial 128k next 128k minextents 1 pctincrease 0);
§1.2 Oracle文件
§1.2.1 数据文件
Oracle的数据文件是用来存放实际数据的物理文件;
Oracle数据文件必须对应于一个表空间;
Oracle系统安装完成并创建数据库成功后,Oracle会自动创建几个数据库文件。它们被分配给SYSTEM、USERS、TEMP等表空间;
用户可以根据需要创建表空间时创建一个或多个数据文件;
对已经创建完成的数据文件可以用ALTER ADTABASE … AUTOEXTEND 、RESIZE来改变数据文件的大小。
数据文件可用下面命令查到:
select tablespace_name,file_name ,bytes from dba_data_files;
§1.2.2 控制文件
Oracle数据库至少有一个控制文件;
一般数据库系统安装完成后,自动创建两个以上控制文件;
为了安全一般建议创建多个控制文件;
控制文件可用下面命令查到:
select name,value from v$parameter where name like 'control_files';
§1.2.3 重做日志文件
重做日志是Oracle的日记帐,负责记录所有用户对象或系统变更的信息;
安装完成后有多个重做日志文件,它们是几个分为一组,组内的重做日志文件大小要一样;
为了使系统性能更好可以在创建多重做日志文件组;
重做日志文件可以名下面命令查到:
select * from v$logfile;
§1.2.4 其它支持文件
除了上面的三类文件外,还有:
INITsid.ORA 参数文件;
Sqlnet.ora文件;
Tnsnames.ora文件;
Listener.ora文件等。
§2.1 警告与日志文件
警告日志是ORACLE 的一种基本警告机制,其作用是提醒数据库管理员注意数据库的错误、异常环境及一些永久性操作。比如建立表空间,增加数据文件等。每个事件都在影响着数据库的性能和可用性。警告日志主要记录下面信息:
重作日志转换
检查点(可选)
关键性错误
数据库的启动与关闭
对数据库结构的改变
§2.3 跟踪文件
跟踪文件是Oracle在系统异常时有Oracle自动创建的文件,它与警告文件一起构成完整的故障信息。警告日志包含错误事件的概述;而随之产生的跟踪文件记录了该错误的详细信息。所以我们要想得到错误的解决办法的话,要认真分析跟踪文件的内容。
§2.3.1 跟踪文件的产生
跟踪文件有后台进程的“跟踪书写器(TRWR)”进行写入。Oracle在运行时有许多后台进程,可以用下面命令查询所有后台进程名字:
SQL>select name, description from v$bgprocess;
NAME DESCRIPTION
----------------------- ------------------------------------------------------
PMON process cleanup
. . . . . .
TRWR trace writer process
DBWR db writer process
ARCH Archival
LGWR Redo …
. . . . . .
后台进程在运行过程中,如果遇到例外就产生跟踪文件信息;
可以用ALTER SESSION SET SQL_TRACE=TRUE来由前台进程产生会话跟踪文件;
在初始化参数文件中加SQL_TRACE=TRUE来产生数据库级的跟踪文件;
可以在初始化参数文件中加TIMED_STATISTICS=TRUE来实现有意义的跟踪文件;
后台进程产生的跟踪文件所在目录由BACKGROUND_DUMP_DEST参数确定;
前台进程产生的跟踪文件所在目录由USER_DUMP_DEST参数确定。
§11.2 后台进程与跟踪文件
Oracle服务器将出现各种错误都将其信息卸载到跟踪文件中;
Oracle支持工程师使用这些跟踪文件来诊断和解决问题;
这些文件一般不包含调整信息.
§11.3 用户跟踪文件
可在会话级或实例级来设置服务器进程跟踪;
实例级的跟踪:
初始化文件设置SQL_TRACE=TRUE;
会话级的跟踪:
SQL>execute dbms_system.set_sql_trace_in_session(8,12,true);
这里的8为sid (会话标识), 12为Serial#(会话序列编号) 。
DBMS——SYSTEM包由catproc.sql建立:
$ORACLE_HOME/rdbms/admin
%ORACLE_HOME/rdbms/admin
用户跟踪包含在会话中SQL语句的统计;
SQL>ALTER SESSION SET sql_trace=TRUE;
用户跟踪文件在服务器进程来建立;
用户跟踪也可由“后台控制跟踪”或SET EVENT来建立。
下面对介绍过的有关重做日志的内容做一个小结:
1) Oracle数据库由两种类型的文件组成:
•结合在一起构成表空间的数据文件。
•结合在一起构成重做日志系列的数据文件。
2) 一个数据库必须至少具有两个重做日志。
3) 重做日志中含有数据库中发生的所有事务条目。
4) 重做日志常常也称为事务日志。
5) 为了防止数据丢失,必须使用事务日志,事务日志的功能为:出现意外故障时恢复数据。
6) Oracle数据库可以在下列两种模式下运行:
•ARCHIVELOG模式下将保存所有的事务日志。
•NOARCHIVELOG模式下不保存旧事务日志。
控制文件是一个非常小的文件,其中存放一些与O r a c l e数据库所有文件相关的关键信息。
O r a c l e系统通过控制文件保持数据库的完整性( I n t e g r i t y )以及决定恢复数据时使用哪些重做日志。
一年一度的车检工作可以用来形象地说明控制文件的作用。M a s s a c h u s e t t s州的居民每年
都必须进行车检,以保证汽车的车况良好和污染不超标。
数据库系统在运行前要首先转至控制文件,以检查数据库是否良好。例如,如果出现某
个数据文件丢失或者特定文件在数据库未使用它时被更换的情况,控制文件将通知数据库系
统中出现了故障。就像不通过车检就不能在上路一样,如果检查出数据库文件中存在错误,
则在问题排除之前,系统不能继续工作。
提示如果O r a c l e系统通过控制文件中的信息发现数据库不正常,数据库将不能正常
运行。
每当出现数据库校验点( C h e c k p o i n t )或者修改数据库结构后,都要修改控制文件。如果没
有合法的控制文件,数据库不能启动。
提示应至少提供两个控制文件,并存放在不同的磁盘上。在丢失所有数据库控制文
件的情况下,Oracle 7/8提供了一个建立控制文件的命令,大多数情形下可以用来重
建控制文件。
下面对介绍过的控制文件内容做一小结:
•每个数据库至少有两个控制文件。我们极力建议用户最少生成两个控制文件,并分别放
在不同的磁盘上。
•数据库结构的所有修改都被记录在控制文件中。
在这个比喻中,侍者代表客户机进程,厨师代表服务器进程。
O r a c l e提供了许多支持进程帮助用户进
•在出现校验点时将数据写回数据文件
•在出现校验点时确保将脏数据块写回
•读写重做日志( L G W R )。
•在启动系统时运行以完成数据库恢复
•用户在会话期间异常终止后,可用来
•在A R C H I V E L O G模式下,出现重做
•在并行服务器配置中管理锁( L C K )。
•当使用O r a c l e分布式选件时恢复可疑
•支持Oracle 的快照技术( S N P )。
•支持O r a c l e的高级队列( Q M N )。
关于内存结构总结如下:
1) 内存区有两种:
•系统全局区( S G A )。
•程序全局区( P G A )。
2) SGA由所有的服务器和客户机进程共享。
3) SGA主要由四部分组成:
•数据高速缓冲区(Data Buffer Cache)。
•字典高速缓冲区(Rows Cache)中存放O r a c l e管理自身所需信息。
•重做日志缓冲区为事务高速缓冲区。
•共享S Q L池为程序高速缓冲区。
4) 用户进程需要查看的信息必须首先放到S G A中。
5) SGA是一个大通信器,所有进程都可以通过它共享信息。
6) PGA不能在进程间共享。
7) PGA中存放数据和进程控制信息。
4 . 11 综合举例
既然已经了解了O r a c l e的结构,我们追踪一个事务。我们以从柜员机看看自己是否有足够
的钱购买一瓶葡萄酒的过程为例,追踪该事务。
1) 首先了解帐户余额情况。银行的这台机器运行一个称作SQL * Plus的客户进程。接受
我们的请求,用下列S Q L语句表示:
select account_balance
from bank_table
where account_number='1112222333'
and account_type='SAVINGS';
2) SQL语句通过S G A传送到服务器进程。服务器进程检查共享池中可执行程序的版本。
如果该程序不在共享池中,它将放一个已完成语法分析的“准备运行”版本在那里,然后执
行此程序。存有帐户余额的数据块将从数据文件中读出并放到S G A的数据高速缓冲区中。一
旦帐户余额数据放进数据高速缓冲区中,客户进程即可读出此余额并将其返回至顾客。我们
被告知余额为3 2 5美元。
3) 我们看到余额并请求提取2 5美元,客户机进程接收要求,并形成下列S Q L语句:
update bank_table
set account_balance=300
where account_number='1112222333'
and account_type='SAVINGS';
O r a c l e按下列步骤执行更新语句:
1) 客户机进程通过S G A把该语句传给服务器进程。
2) 服务器进程在共享池中查找程序的可执行版本。如果找到,则转向第4 )步,否则执行第3 )步。
3) 处理这条S Q L语句,并将其可执行版本送入共享池。
4) 执行此S Q L语句。
5) 该语句处理的数据在数据高速缓冲区中吗?是,则转向第7 )步;否,执行第6 )步。
6) 从数据库文件中把数据读人数据高速缓冲区。
7) 在回滚段中记录原来的数据值(回滚段中保存原来的余额3 2 5美元)。
8) 在重做日志中生成该事务的一个拷贝。
9) 将数据高速缓冲区中的余额数据改为3 0 0美元。
10) 银行柜员机通过S G A发出所有工作完成的信号。
11) 在重做日志中记录已完成事务。
12) 清除回滚段中的撤消( U n d o )信息。
13) 顾客取钱。
14) 用比在波士顿少一半的钱买了一大瓶葡萄酒!
提示在第7 )步,如果用户终止该事务,或者系统在事务处理过程中出现故障,那么
系统将使用回滚段中保留的信息,将余额恢复为原来的值。
提示对所有的事务,数据高速缓存的数据块拷贝最终将由数据库写入器写回原来的
数据文件中。
正如读者所见,在客户进程能访问数据库前有很多工作要做。使用O r a c l e一段时间后,对
此情况会有更好的了解。
S t a r t u p命令使用该选项定义初始化参数文件( P f i l e )和名称的位置,并不影响数据库文件的
运行模式。正如前面所介绍,初始化参数文件在O r a c l e打开数据库时被读取。O r a c l e期待已定
位的默认的初始化参数文件,并且调用该文件名,此文件名取决于数据库操作的硬件名。另
外, 例如在Oracle8i for NT 中,O r a c l e是按如下步骤建立缺省的初始化参数文件名:
1) 开始于活动的ORACLE-HOME 位置,这里是C : / O r a c l e / O r a 8 1。
2) 后面是D a t a b a s e文件夹。
3) 然后是文件名,它由字符串i n i t和O R A C L E _ S I D (这里是“ i n i t o 8 i b e g i n”)及文件扩展名
“.ora”组成。最后形成的缺省初始化参数文件名是C:/Oracle/Ora81/Databdase/Intito8i begin.ora。
如果想使用非缺省的初始化参数文件启动数据库,则在启动服务器管理器后,按下述步
骤操作:
1) 输入“connect internal/oracle”。
2) 输入“startup pfile=parameter_file_name”, 从O r a c l e返回的信息如下面清单所示:
表12-2 电子表格生成程序中的程序代码行讨论
组成意义
set heading off 由于正在创建数据文件,不需要表头
set pagesize 0 不需分页,则设置数据文件输出为零
set linesize 80 在输出数据文件中设置行的最大尺寸
set trimspool on 告诉S Q L * P l u s去掉输出的尾部空格
set feedback off 告诉S Q L * P l u s不显示满足了查询条件而被检索到的行
set echo off 告诉S Q L * P l u s在执行语句时不要回显语句行
spool out.dat 告诉S Q L * P l u s把查询结果送到文件o u t . d a t中
spool off 告诉S Q L * P l u s关闭输出数据文件
1. db_block_buff e r s
这个参数的值决定了O r a c l e使用的数据高速缓冲区的大小。当需要对数据库中的数据进行
操作的时候,这些数据都必须存放于数据高速缓冲区中。这个参数的值越大,则O r a c l e就能将
越多的数据存放在内存中,这样就避免了使系统性能大大下降的大量I / O操作。
在实际应用中,应该将这个参数的值设得越大越好。甚至大到足以放下整个数据库,在
这样的情况下,不再需要活动的磁盘。
提示在实际应用中,应该将该参数的值设得尽可能大,以便O r a c l e可以将尽可能多
的数据存放在内存中。
这个参数的设定对S G A区所占用的内存影响很大,随着该参数的参数值的增大, S G A区
所占用的内存也相应地快速增加。在一般情况下,应使S G A区所占用的内存不超过系统物理
内存大小的5 0 %。
2. shared_pool_size
这个参数的值决定了O r a c l e使用的程序高速缓冲区和数据字典高速缓冲区的大小。数据字
典中存放了O r a c l e用于管理自己的大量信息。比如,当用户登录到数据库时, O r a c l e将大量使
用存放在数据字典中的信息,用于确认用户的身份;而当用户想要查看表中的数据时, O r a c l e
又将使用数据字典中存放的信息来确定用户的权限。程序高速缓冲区是O r a c l e用来存放应用程
序的地方,任何一个应用程序在运行之前,都必须放入程序高速缓冲区中。例如,每个
S Q L * P l u s中运行的语句,在执行前必须放入程序高速缓冲区中。因此,该参数的值也应设得
尽可能大,这样O r a c l e可以将尽量多的程序存放于内存中,从而提高系统性能。
高速缓冲区越大,语句在内存中被发现的可能性越大。高速缓冲区越小, O r a c l e调用语句
到到内存的频率越高。程序在被放入该高速缓冲区前,不能执行。
提示尽可能设置大的“ s h a r e d _ p o o l _ s i z e”值,由于性能的原因,希望有很大的程序
高速缓冲区。
同样地,这个参数的设定对S G A区所占用的内存影响很大,随着该参数的参数值的增大,
S G A区所占用的内存也相应地快速增加。在一般情况下,应使S G A区所占用的内存不超过系
统物理内存大小的5 0 %。
3. sort_area_size
这个参数的值决定了O r a c l e用于排序操作的内存大小。含有order by和group by子句的
S Q L语句以及create index语句都将引发排序操作。
当O r a c l e无法获得足够的内存空间进行排序操作的时候,它将使用磁盘作为缓存进行排序
操作,而磁盘I / O的速度是非常慢的,所以这个参数的值也应该设得尽可能的大。根据经验,
其缺省的设置值太低,应该加倍。
提示这个参数( s o r t _ a r e a _ s i z e )的初始值太小,建议将其改为初始值的两倍。这个参
数值的设定结果,只有在重新启动数据库后才能起作用。
4. processes
这个参数的值决定了能同时访问O r a c l e数据库的进程数。这个参数的初始值为5 0,但是这
个值太小了,因为O r a c l e系统本身所使用的系统进程以及由某个进程所产生的新进程都将占用
可使用的进程数。
除非想限制使用O r a c l e数据库的用户数,或者由于机器的性能不足,否则应将该参数的值
设得尽可能的大。
注意在安装O r a c l e 8 i时,建议将此参数的值设为2 0 0。经验表明,该值大于大多数应
用程序所需的值。
5. open_cursor
这个参数的值决定了一个用户同时可以打开的游标数目。可以将游标想象成O r a c l e分配给
用户的用于处理S Q L语句的内存空间。这个参数的初始值太小,当用户无法打开游标时,应
用程序将停止运行。建议将该参数的值设为2 5 0 0。
提示该参数的值应设得尽可能的大,否则应用程序将由于无法打开游标而停止运行。
6. database_writers
这个参数的值决定了可同时向数据库写入信息的进程数目。如果工作在一个可以支持多
进程的操作系统上,应该马上改变这个参数的值,以获得更好的性能。许多D B A有个错误的
概念,认为此参数受C P U数量的限制,实际并非如此。建议为每个数据文件设置两个数据库
写入进程。
17.3.1 表和索引
在O r a c l e数据库中的所有数据都存储在称为表的一个对象中。用户对数据库的所有操作,
最后都转变成对表的读写操作。另外,在4 . 4 . 1之5“数据和索引表空间”中讨论过,索引可以
用来加速对某一特定列值的检索速度。可以把索引想象成一张很小的表。下面通过一个例子
来说明为什么索引能加速检索速度,在例子中,假设已在表c u s t o m e r的列l a s t _ n a m e上建立了
索引。
•当要读取一张表中的某一记录的值的时候,系统必须读取该记录的所有列值。假设一张
表有3 0 0个列,而只需要读取l a s t _ n a m e这一列的值,系统也必须读取该记录中每一列的值。如
果建立了一个由l a s t _ n a m e和f i r s t _ n a m e组成的组合索引,那么在上面的情况下,只需要读取两
列的值。
•Oracle表中的原始数据是没有经过排序处理的,而索引中的记录是经过排序的,这是另
一个需要使用索引的原因。
为了提高数据库存取数据的效率,应该注意以下两件事:一是为所有的表建立适当的索
引,这一点对于系统的性能影响最为久远。二是将表和索引分别存放在不同的磁盘驱动器上。
强烈建议创建不同的表空间来存放表和索引。
提示将表格和索引存放在不同的磁盘驱动器上。
17.3.2 系统表
在任何一个应用程序要访问数据库中的数据之前, O r a c l e都必须先行访问系统数据字典。
数据字典中存放了关于O r a c l e数据库的所有信息,如每个表中存放着什么数据、每个表存放在
哪个磁盘驱动器上、哪些人有权利访问哪张表等等。组成数据字典的所有表和数据库对象都
是属于用户S Y S的,并且存放在系统表空间中。因为对于数据字典的访问构成了主要的I / O流,
所以用户必须将系统表空间放在独立的磁盘驱动器上。
提示 不要让其他用户在系统表空间中存放任何内容。
17.3.3 临时段
临时段中存放着系统为了辅助数据库完成事务而建立的临时性对象。很重要的一点是用
户必须将临时段存放在不同的表空间中,这样就能消除由于临时段和其他对象存放在同一表
空间中而造成的系统性能出现的问题。
提示建立一个单独的表空间存放临时段。
17.3.4 回滚段
当用户对数据库进行插入、删除和更新操作的时候, O r a c l e就在回退段中存放一些信息。
利用这些信息,数据库就可以在操作失败的时候重做或回滚事务处理。因为各个事务处理所
占空间不等,所以回滚段的大小有伸缩。
提示建立一个单独的表空间存放回滚段。
17.3.5 联机重做日志
联机重做日志是用户的事务处理日志,在O r a c l e数据库中发生的每一个操作,均被记录到
这些称为联机重做的的日志文件中。
提示由于I / O的操作是最慢的操作之一,因此需要将联机重做日志存放在单独的磁盘
驱动器中。
I / O是计算机最慢的操作之一,但它也是最重要的操作之一。理想的情况下,应将数据库
中的每个表空间放在单独的磁盘驱动器上。然而,若不能工作在理想的情况下,仍应创建这
些单独的表空间,即使它们在同一磁盘中。然后,使用O r a c l e和操作系统的实用工具,平衡
I / O负载。如果用户增加了磁盘驱动器,则应重新安排各个表空间所处的磁盘驱动器