oracle体系结构之数据库结构
oracle数据库包含两部分:
一是数据库(存储数据和相关对象的一系列物理文件),二是实例(内存和进程)
oracle数据库存储数据是由一整套严谨并且高效的逻辑结构来管理物理数据的存储,因此存储结构可以分为物理存储结构和逻辑存储结构
数据库物理结构:
控制文件
数据文件
临时文件
重做日志文件
一、文件
二、表空间 SQL> desc v$tablespace;
三、段、区、块
一、文件
1、控制文件
2、数据文件
3、联机重做日志文件
4、参数文件
5、备份文件
6、归档日志文件
7、口令文件
8、预警和跟踪日志文件
控制文件、数据文件、日志文件是联机文件,其中一种文件异常都会出现报错的情况(数据库可能会崩溃),这三类文件一般都放在存储上
1、控制文件 (联机文件,损坏影响数据库开启)
数据库名字、数据库的物理结构信息、(整个数据有多少数据文件,这些文件分别放在什么位置,整个数据库有多少redo log文件,这些文件分别放在什么位置)数据当前运行的状态信息(哪些数据文件是在线的正常的?哪些是离线的不正常的,Oracle正在使用众多重做日志文件中的哪一个日志文件,哪些日志文件有问题)、数据库字符集信息、scn号、状态信息、归档日志历史信息。
一般有三个控制文件,三个文件是一种复印关系,建议将三个文件放在不同的目录或磁盘
SQL > desc v$controlfile ;
SQL> show parameter control_files;
2、数据文件(联机文件,损坏影响数据库开启)
存放实实在在的数据
普通数据文件
临时数据文件 (排序时使用)
无复印,但有旧的数据文件和redo log就可以恢复
SQL> desc dba_data_files
SQL> desc dba_temp_files;
SQL>desc v$datafile;
SQL>desc v$tempfile
数据文件的状态:联机online、脱机offline、system
SQL >alter database datafile 'path' online(offline)
临时文件的特殊之处:
(1)nologging
(2)不能被置为只读
(3)不能通过alter database 语句创建
(4)rman备份时不会备份,但oracle 10g下,rman恢复数据库后,自动创建临时表空间数据文件。
(5)分配空间时较为特殊。实际应用时进行分配。
3、联机重做日志文件(联机文件,损坏影响数据库开启)
存放日志,对数据文件所做的所有修改。(数据文件的变换过程)
一般有三组,每组至少2个成员(互为备份)
redo log 切换时间为10-20min ,10-20min
v$log
v$logfile
(1)管理联机重做日志
添加组:
alter database add (standby) logfile group 4 ('/u/app/std01.log','/u/app/std02.log')
size 50m
添加成员;
alter database add logfile member '/u/app/redo02.log' to group
1;
删除组
alter database
drop logfile group 4
(不会删除操作系统文件)
删除成员:
alter database drop logfile member '/u/app/redo02.log';
(2)日志文件状态:
unused:从未使用,刚创建
current:正在使用
active:当前未使用,但该文件中内容尚未归档,或者文件中的数据没有全部写入数据文件,一旦需要实例恢复,必须借助该文件中保存的内容
clearing:表示改组重做日志文件正被重建(重建后该状态会变成unused)
inactive:改组中内容已妥善处理,该组联机重做日志当前处于空闲状态。
(6-1 redo的作用
1、三个组件:redo log buffer(位于SGA中,循环使用)、LGWR后台进程、redo
log file(循环使用)
2、可以变更的数据:insert、update、delete、create、alter、drop
3、允许使用最少两个日志组,缺省为3个 (v$log)
当一个日志文件写满之后,会切换到另外一个日志文件(log switch),log
switch会触发一个检查点(模糊检查点),促使DBWR进程将写满的日志文件保护的变更数据写回到数据库。在检查点完成之前,日志文件不能被重用。
6-2
redo的内容
SQL>
alter system switch logfile;
改变向量,重做记录(P244)
6-3 产生多少redo
6-4
redo写的触发的条件:(LGWR触发的条件):
6.4.1 每3秒钟超时
6.4.2 阈值达到:
(1)Redo log buffer 1/3满(使用的块的数量>=隐含参数_log_io_size,该值缺省为1/3log buffer大小
)
(2)Redo log buffer 具有1MB脏数据(使用的块的数量>=隐含参数_log_io_size,该值缺省为1/3log buffer大小,log
buffer设为3M的原因 )
6.4.3 用户提交
6.4.4
DBWn写之前(DBWR将要写出的数据的高RBA超过LGWR的on-disk
RBA)
6-5 redo log buffer
大小
9i以前为3M,10g 自动调整(SQL> show sga;)
6-6
commit 做了什么
将redo
logbuffer 中日志写入重做日志文件中。
6-7 日志的状态current active inactive
Current:当前正在被使用(crash恢复)
,活动的当前日志
Active:活动非当前日志,检查点尚未完成(日志文件中对应的脏块还未写入磁盘),如果日志文件循环使用再次到达该文件,数据库将处于停顿状态。
(crash恢复)。该日志可能已经完成归档,也可能没有完成归档。
将active变为inactive:
SQL>alter system switch
logfile #切换日志
SQL>alter system flush buffer_cache #将脏块写入磁盘
Inactive : 实例恢复不需要,介质恢复肯能用到。可能归档也可能未归档(v$log.archived)。若数据库启动在归档模式,在未完成归档之前,日志文件也允许被覆盖。此时活动进程将处于log file switch(archiving needed)等待之中。
Unused:日志从未被写入,日志刚被添加到数据库或在resetlogs之后被重置。
6-8 日志块(redo
block size)的大小
Redo
block size :512bytes (LGWR以block为单位把redo写入磁盘) 日志文件的block size 为512bytes,数据文件的block size 为8192bytes
6-9 日志文件的大小
当日志文件切换时(log swtich)会触发一个检查点,日志文件的大小和检查点的触发频率有关。(oracle数据库性能调优)
select
* from v$version where rownum <
2; /*只显示两行
SQL>
select group#,thread#,sequence#,bytes/1024/1024 "M bytes" from
v$log;
6-10 split block的产生
6-11 未完待续
)
4、参数文件(半脱机半联机文件)
oracle
启动时会访问参数文件,启动后就不会再访问参数文件,启动后,数据库参数文件就算坏了数据库也不会受影响。
参数文件分类:?几个分类标准
A:按照得出方式不同:
(1)推导参数:
例如sessions=(1.1*processes)+5
(2)操作系统依赖参数:有效值或取值范围依赖:db_cache_size
依赖oracle内存大小
(3)可变参数
B:修改方式:
(1)静态参数:在参数文件中修改,重启后生效,oracle启动时将静态参数文件读入内存,启动完毕,参数文件关闭
(2)动态参数:动态调整,修改后立即生效,oracle启动后将参数文件读入内存,启动后不关闭一直处于打开状态。
C :获取方式:
(1)显示参数:v$parameter,在sql*plus中可通过show
parameter获取
SQL>show parameter spfile
(2)隐含参数:以“_”开头,通过查询系统表获得
select a.ksppinm name, b.ksppstvl value, a.ksppdesc
description from x$ksppi a, x$ksppcv
b where a.indx = b.indx and a.ksppinm like '_log_deletion_policy';
(查看_log_deletion_policy参数值)mandatory
oracle数据启动过程中访问参数文件的顺序:
spfile.ora、spfile.ora、init.ora
如何查查oracle是以哪种参数文件启动的?
SQL>show parameter spfile;
参数文件损坏时如何启动?如何创建动静态参数文件?
SQL>startup spfile='path';
SQL>startup pfile='path';
SQL>create spfile from pfile;
SQL>create pfile from spfile;
如何更改初始化参数?何时生效?
alter system set parameter_name=value [comment="注释"]
scope=[memory|spfile|both] [sid=' ']
memory:只修改内存中参数下次重启后失效,改变当前实例运行。
spfile:只修改参数文件,重启后才能生效。
both:memory与spfile中参数都修改。
alter system reset parameter ........ :reset
一个参数,oracle将从spfile文件中去除该参数
spfile文件如何修复
参数文件中最少要设置的参数为db_name
[oracle@test ~]$ export ORACLE_SID=fu
[oracle@test ~]$ sqlplus / as sysdba
SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file
'/u/app/oracle/product/10.2.0/db_1/dbs/initfu.ora'
SQL> !echo "db_name=fu" >
/u/app/oracle/product/10.2.0/db_1/dbs/initfu.ora
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 171966464
bytes
Fixed Size 2082496
bytes
Variable Size 113248576 bytes
Database Buffers 50331648 bytes
Redo Buffers 6303744
bytes
SQL>
5、备份文件(离线文件)
控制文件、参数文件都可以备份(不一定每次都要备份),主要是备份数据文件和归档日志文件。
备份文件一定不要放在存储上,一般放在带库中
6、归档日志文件(离线文件)
v$archived_log
7、口令文件
远程登录使用,丢了可以重新生成。
$ORACLE_HOME/dbs/orapw
如何生存口令文件?
#orapwd
file=orapw password=test entries=30 force=y
8、预警和跟踪日志文件
oracle重大操作,oracle错误操作
$ORACLE_BASE/admin//
bdump下有alter..log
bdump下的trc文件是lgwr出问题时的信息
udump下的trc文件是server process出问题时的信息。
二、表空间 SQL> desc
v$tablespace
一个表空间由一个或多个数据文件组成(表空间的空间是一个或多个数据文件的空间)(表在表空间中,一个表的空间大小可能大于一个数据文件的大小)
1、表空间分类:系统表空间、普通表空间
(1)系统表空间
System:存放oracle的自身信息(oracle的数据字典信息)
Sysaux: system表空间的附属表空间,存放系统信息,System/sysaux必须同时在线,否则数据库起不来
Undotbs1:undo表空间数据块改变前的数据
Temp:临时表空间(排序时用):可以损毁,可以重建
(2)普通表空间
Users:存放用户数据的表空间,实际生产中建立很多表空间而不使用user表空间
Example:样式表空间(一般不用)
2、表空间类型:permanent、undo、temporary
System/sysaux/users表空间状态为permanent(数据不会丢失),临时表空间状态为temporary,undo表空间状态为undo.
3、表空间状态:只读、读写、脱机
4、表空间相关操作
(1)创建表空间
create
[smallfile|bigfile] tablespace tablespacename datafile 'path1' size
10m, 'path2' size 10m,...
[autoextend
on next 10m maxsize
100m]
[logging]
[extent
management local]
[autoallocate|uniform
size 1m]
segment
space management auto]
[default
nocompress]
说明:
autoextend
on next 10m maxsize表示数据文件满后是否自动扩展(autoextend),最大文件大小是否有限制;
extent managenmt local
表明区管理方式(oracle如何给段分配区)为本地管理,本地管理又可以分为autoallocate(自动分配)和统一大小(uniform
size
1m)
segment space management
auto表示段管理方式(oracle)为自动(段有了区后如何使用(空闲空间后如何使用)
(2)更名
重命名表空间:
SQL>alter tablespace old_name to new_name;
重命名数据文件:
在mount模式修改:
SQL>shutdown immediate;
SQL>startup mount;
SQL>host mv 'path1' to
'path2'; /*操作系统层面更改
SQL>alter database rename file 'path1' to
'path2';/*数据库
SQL>alter database open;
在open模式修改:(只适用于归档模式的数据库)
SQL>alter database datatfile 5 offling drop /*先让数据文件offline
SQL>host mv path1 to path2;
SQL>alter database rename path1 to path2;
SQL>recover datafile 5; /*由于数据库是open状态,offline状态的数据文件的SCN号与当前的scn号不一致,所以要恢复
SQL>alter database datafile 5 online;
使表空间联机或脱机
alter tablespace tablespacename
offline/normal/immediate/temporary;
normal脱机:强制实施针对所有表空间数据文件的检查点。包含表空间的块的数据缓冲区的每个脏块都写入到数据文件中,此后,表空间和数据文件处于脱机状态。
immediate脱机:立即脱机,不会转储任何脏缓冲区。数据文件将受到损坏(可能丢失未提交的更改),在使表空间联机之前必须通过应用来自重做日志的变更向量进行恢复,只有文件已受到损坏,以至于无法完成检查点,通常才会这么做。
temporary脱机:针对所有可以执行检查点操作的所有文件实施检查点,然后按顺序使表空间及文件脱机。任何受损的文件将立即脱机。限制需要恢复的文件数量。
将表空间标记为只读
alter tablespace tablespace_name read only | read
write /标记只读后,无法用DML语句更改其中任何对象,但是可以删除它们。
重新调整表空间大小
更改现有数据文件大小:
alter database datafile 5 resize n [M|G|T]
不能通过语法判断是将文件变大还是变小,只有数据文件系统上的空间足够大,向上的重调大小才能成功;只有文件中的空间尚未由分配给段的区间使用时,才能向下重调大小。
添加数据文件:
alter tablespace tablespace_name add datafile 5 size
50m;
可以添加自动扩展字句或在后面使用下列命令使其自动扩展:
alter database datafile 5 autoextend on next 30m maxsize
2G;
删除表空间
drop tablespace tablespacename [including
contents [ add datafiles]];
including contents,若未指定including contents
关键字,但表空间中包含任何对象,那么删除操作失败,若指定including
contents关键字,表空间中包含其他对象,先删除对象,然后删除表空间。若表空间包含的表与另一个表空间的表存在外键关系,而且此表是父表,则删除失败。
and datafiles:若未指定data datafiles
关键字,则将删除表空间极其内容,但数据文件仍然保存在磁盘上,oracle将不了解他们位于何处,必须使用操作系统命令删除他们。
oracle删除数据文件
数据文件是表空间的一部分,无法删除,不能移走,可以有以下方法:
使用OFFLINE数据文件的方法(只是offline无法访问,但数据字典依旧存在)
alter database datafile 5 offline drop; /*非归档模式使用
alter database datafile 5
offine /*归档模式使用
可以删除一个空数据文件并且相应地数据字典也会删除
alter tablespace tablespace_name drop datafile 5
;
三、Oracle存储结构之段、区、块
dba_segment
dba_extent
1、段、
(1)概念:一个表就是一个段,表分区后有表分区段、一个索引是一个段,索引分区后有索引分区
表段、表分区段、索引段、索引分区段、临时段(在临时表空间中)、撤销段(在撤销表空间中)、二进制大对象段。
(2)段的管理方式:段有了区后如何使用(空闲空间后如何使用)(自动、手动)
segment space management auto|manual
2、区extent
(1)概念:物理上连续的一个或多个块。区是oracle给段分配空间的最小单位,段建立以后,Oracle自动给段分配一个区,区由物理上连续的若干个块组成,Oracle给段分配空间的最小单位 (一般为8个块一个区)
Oracle段建立以后插入数据,段的前几个块被Oracle自己使用,从后面几个块插入数据
(2)区的管理方式:如何给段分配区
区管理:本地管理(又分为自动分配和统一大小)、字典管理
extent
management
local (本地管理)
autoallocate|uniform
size 1m (自动|统一)
3、块:
oracle i/o的最小单位:读数据时(读其中一行数据,会将行所在块缓存在内存中,而不单单是某一个行)(硬盘寻道时间,Oracle读同一块中其他行的可能性很大)
创建表空间选项
类型:permanent、temporary、undo
状态:读写、只读、脱机
3、
Oracle高水位线:段使用区的最后一个块的位置:oracle对表进行全盘扫描的最后一个位置(访问某个表对该表进行全盘扫描),高水位线影响全盘扫描的速度
4、
Oracle块的物理结构(大小默认为8k)
5、
行连接
行太长,一个块放不下
6
行迁移
Pct_free设置过小,update时空间不够,长行写到新块中,原来行写上新行地址,指向新行(方便读)
正常情况oracle不允许行跨块
。本来只需读一个块要读两个块
块:
最小的逻辑存储单元,其大小在数据库创建时决定,不能更改。Oracle在进行存储空间分配、回收和管理时是以块为基本单位的。Oracle并不是一个块一个块地进行存储空间分配而是将多个连续的块(多个连续的块称为区)一次性分配给表对象。
详细说明:
管理存储空间的最小单元,数据库执行输入与输出操作时的最小单元。
(1)大小:
是操作系统块大小的整数倍,在数据库创建时决定,不能更改。块的标准大小由初始化参数DB_BLOCK_SIZE决定,具有标准大小的块被称为标准块,与标准块大小不同的块称为非标准块。
(2)结构:
块头部、表目录、行目录共同组成块的块头部信息区(overhead),overhead并不存放实际的数据。Overhead损坏,则整个块失效。空闲空间和行空间是块的存储区。块的总容量是空闲空间和行空间的总和。
l
块头部:包含块的一般属性信息,如块的物理地址,块所属的段的类型(数据段、索引段、回退段)
l
表目录:若块中存储的数据是表数据(表中的一行或多行记录)则在表目录中保存这个表的相关信息。
l
行目录:若块中存储的数据是表数据(表中的一行或多行记录)则在行目录中保存这个表的相关信息,比如rowid等
在创建表时,可以为其设置initrans与maxtrans两个存储参数(指定所允许的并发操作这个表的事务数目。
)每当一个事务访问一个数据块时,事务将会在相应的数据块的头部信息区保留一个条目,用于标记该事务正在使用这个数据块。当头部信息区中用于存储事务条目的空间用尽后,在当前这个数据块的事务之前,oracle不允许其他任何事务在访问这个数据块。
l
空闲空间:块中尚未使用的存储空间(减少块中空闲空间:向块中写人新的数据或修改块中已有数据即update操作,此操作可能会产生记录链接)
l
行空间:块中已使用的空间。在行空间中保存有数据库对象的数据(比如行中的一条或多条记录,索引中的多个索引条目等)
(3)存储空间管理:(手动方式要看)
对块中可用存储空间进行管理。确定在块中必须保留多少空闲空间,以避免在执
行update等操作时由于块中的空闲空间不足,而产生记录链接等不利于数据库性能的现象(PCTFREE和PCTUSED参数)
Pctfree与pctused适用于表空间与段(具有独立的段结构。在创建表空间或表时创建在create
语句中设置,也可以在表、索引等数据库对象创建后修改)
l
PCTFREE参数:块中必须保留的最小空闲空间的比例。块中存储空间不足可能产生记录链接现象(记录链接:本来可以存储在一个块中的一行记录被存储在两个块中;因此,oracle必须读取多个块才能获得一条完整的记录,会影响I/O性能)
空闲空间只能 用于update,PCTFREE值与update操作频繁度有关。
当块中已经使用了80%的存储空间,该快将标记为不可用(不能再insert),空间存储空间只能被update使用。Pctfree设置较小的好处:有效利用存储空间,坏处:可能产生大量记录链接。Pctfree设置较大的好处:提高update速度,避免产生记录链接,坏处:浪费存储空间。较大的pctfree使用与频繁修改的表。
l
PCTUSED参数:当块中已经使用的存储空间降低到这个百分比之下时,这个块才被重新标记为可用的状态。
例如:pctused为40%,直到已使用空间少于40%后才能够向块中插入新数据。(空闲空间在60%以上)
Pctused设置较小,可以提高执行效率,但是会增加数据库存储空间的浪费。
设置较大:节省空间,到影响执行效率。
PCTFREE与PCTUSED配合工作。(p116)
插入数据不能占用保留空闲空间,只有在对块中的已有数据进行更新时,才能够使用保留空闲空间。