数据库物理结构主要由控制文件,数据文件,日志文件和参数文件构成。
控制文件是用来保存数据库的物理结构—数据文件和重作日志文件,保存数据库的名称、数据文件和恢复日志文件的名称及位置、时间戳等与数据库相关的所有文件信息 。
是操作系统文件,包括所有数据库数据,逻辑数据库结构的数据存储在这些文件中
数据文件有如下特性:
保存每个事务处理的操作系统文件集,这些文件叫事务日志。(创建后大小一般不再变),LGWR日志写入进程周期性写入重做日志缓冲区,如有3个重做日志文件,LGWR首先写第一个,当第一个满时,开始写第二个,然后是第三个,最后返回第一个。一个数据库最少有两个重做日志文件,也被称作redoLog
是在ORACLE实例启动时候,需要读入的一个参数文件。该参数文件是一个文本文件,包含有实例配置参数。这些参数置成特殊值,用于初始ORACLE实例的许多内存和进程设置
SCN是当Oracle数据库更新后(结构发生变化),由 DBMS自动维护去累积递增的一个数字。oracle中有四种SCN号:系统检查点SCN、数据文件SCN、结束SCN、数据文件头SCN
oracle 10g提供了两个新的函数对于scn和时间戳进行相互转换。这两个函数是scn_to_timestamp,timestamp_to_scn,这两者的相互转换,给管理者带来极大的便利。在10g之前oracle是没有办法通过函数得到时间和scn的相应关系(一般通过logmnr分析日志获得。可是这样的转换是依赖于数据库内部的数据记录。对于久远的scn不能转换。
SQL> select CURRENT_SCN from v$database;
SQL> select dbms_flashback.get_system_change_number from dual;
SQL> select scn_to_timestamp( 9501954) from dual;
SQL> select timestamp_to_scn(scn_to_timestamp( 9501954)) from dual;
系统检查点SCN位于控制文件中,当检查点进程启动时(ckpt),Oracle就把系统检查点的SCN存储到控制文件中。该SCN是全局范围的,当发生文件级别的SCN时,例如将表空间置于只读状态,则不会更新系统检查点SCN。
SQL> select checkpoint_change# from v$database;
当ckpt进程启动时,包括全局范围的(比如日志切换)以及文件级别的检查点(将表空间置为只读、begin backup或将某个数据文件设置为offline等),这时会在控制文件中记录SCN。
select file#,checkpoint_change# from v$datafile;
每个数据文件都有一个结束scn,在数据库的正常运行中,只要数据文件在线且是可读写的,结束scn为null。否则则存在具体的scn值。结束scn也记录在控制文件中
select file#,LAST_CHANGE# from v$datafile;
不同于上述的SCN,数据文件开始scn记录在每个数据文件中。当发生系统及文件级别的检查点后,不仅将这时的SCN号记录在控制文件中,同样也记录在数据文件中
select file#,CHECKPOINT_CHANGE# from v$datafile_header;
在安全关闭数据库的过程中,系统会执行一个检查点动作,这时所有数据文件的终止scn都会设置成数据文件头中的那个启动scn的值。在数据库重新启动的时候,Oracle将文件头中的那个启动scn与数据库文件检查点scn进行比较,假如这两个值相互匹配,oracle接下来还要比较数据文件头中的启动 scn和控制文件中数据文件的终止scn。假如这两个值也一致,就意味着所有数据块多已经提交,所有对数据库的修改都没有在关闭数据库的过程中丢失,因此这次启动数据库的过程也不需要任何恢复操作,此时数据库就可以打开了。当所有的数据库都打开之后,存储在控制文件中的数据文件终止scn的值再次被更改为 null,这表示数据文件已经打开并能够正常使用了。
Oracle的Redo log会顺序纪录数据库的各个变化。一组redo log文件写满后,会自动切换到下一组redo log文件。则上一组redo log的high scn就是下一组redo log的low scn。在current log中high scn为无穷大。
可通过查询v$log_history查看 low scn和 high scn。
SQL> select recid,sequence#,first_change#,next_change# from v$log_history ;
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
1 1 446075 474154
2 2 474154 497385
3 3 497385 516087
4 4 516087 540659
5 5 540659 564897
6 6 564897 564903
7 7 564903 565320
8 8 565320 565704
9 9 565704 565715
10 10 565715 567343
11 11 567343 587705
查看currnet redolog中的high scn
SQL>select vf.member,v.status,v.first_change# from v$logfile vf,v$log v
where vf.group#=v.group#
and v.status='CURRENT'
MEMBER STATUS FIRST_CHANGE#
------------------------------------------------------------ -------------- -------------
/u01/app/oradata/orcl/redo02.log CURRENT 587705
SQL>alter system dump logfile ' /u01/app/oradata/orcl/redo02.log';
SQL> show parameter user_dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /home/oracle/admin/c001/udump
打开转储出来的文件,可以看到
DUMP OF REDO FROM FILE ‘/u01/app/oradata/orcl/redo02.log’
Opcodes .
RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff
SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff
Times: creation thru eternity
FILE HEADER:
Compatibility Vsn = 169869568=0xa200100
Db ID=1269936864=0x4bb1b2e0, Db Name=‘ORCL’
Activation ID=1269912032=0x4bb151e0
Control Seq=696=0x2b8, File size=102400=0x19000
File Number=2, Blksiz=512, File Type=2 LOG
descrip:“Thread 0001, Seq# 0000000012, SCN 0x00000008f7b9-0xffffffffffff”
thread: 1 nab: 0x34f6 seq: 0x0000000c hws: 0x9 eot: 1 dis: 0
resetlogs count: 0x2c3c676f scn: 0x0000.0006ce7b (446075)
resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000
prev resetlogs count: 0x2184ef74 scn: 0x0000.00000001 (1)
prev resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000
Low scn: 0x0000.0008f7b9 (587705) 04/20/2011 09:35:56
Next scn: 0xffff.ffffffff 01/01/1988 00:00:00
Enabled scn: 0x0000.0006ce7b (446075) 02/03/2011 18:29:03
Thread closed scn: 0x0000.00090ae0 (592608) 04/20/2011 15:29:05
Disk cksum: 0x30ee Calc cksum: 0x30ee
Terminal recovery stop scn: 0x0000.00000000
Terminal recovery 01/01/1988 00:00:00
Most recent redo scn: 0x0000.00000000
Largest LWN: 1920 blocks
End-of-redo stream : No
Unprotected mode
Miscellaneous flags: 0x0
Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000
redo log中当前系统的SCN记录当前最新的数据库scn值可通过如下命令查看
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
594373
如果需要进行实例恢复,则需要恢复的记录为587705至594373中redo log中的记录。
表空间tableSpace是oracle数据库内部的数据库的主要逻辑结构,是存储数据库对象的容器,它与磁盘上的一个或多个物理数据文件(dataFile)相对应,但是一个数据文件只能与一个表空间相关联,数据库的默认表空间如下
CREATE TABLESPACE tablespace
DATAFILE ‘filename’ [SIZE integer [K|M][REUSE]
[AUTOEXTEND OFF|ON [NEXT integer [K|M]] [MAXSIZE
{UNLIMITED|integer [K|M]}]]
[,… other datafile specifications …]
[ONLINE|OFFLINE]
[PERMANENT|TEMPORARY]
ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file
ALTER DATABASE dbname DATAFILE filename RESIZE size_of_file [AUTOEXTEND]
ALTER TABLESPACE tablespace_name RENAME DATAFILE filename TO newfilename
alter tablespace tablespace_name add datafile 'c:\oradata\userdata_002.ora' size 50m Autoextend on next 100m maxsize 1000M
select
substr(a.TABLESPACE_NAME,1,10) TablespaceName,
sum(a.bytes/1024/1024) totle_size,
sum(nvl(b.free_space1/1024/1024,0)) free_space,
sum(a.bytes/1024/1024)-sum(nvl(b.free_space1/1024/1024,0)) used_space,round((sum(a.bytes/1024/1024)- sum(nvl(b.free_space1/1024/1024,0)))*100/sum(a.bytes/1024/1024),2) used_percent
from dba_data_files a,
(select sum(nvl(bytes,0)) free_space1,file_id
from dba_free_space
group by file_id) b
where a.file_id = b.file_id(+)
group by a.TABLESPACE_NAME
DROP TABLESPACE tablespace_name [INCLUDING CONTENTS [CASCADE CONSTRAINTS]]
CREATE [PUBLIC|PRIVATE] ROLLBACK SEGMENTsegmentname
TABLESPACE tablespacename
STORAGE{…
OPTIMAL integer [K|M]
}
ALTER ROLLBACK SEGMENT segname ONLINE|OFFLINE
ALTER ROLLBACK SEGMENT segname SHRINK
每一个数据库用户对应一个模式,每个模式由模式对象的集合构成,模式对象是由用户创建的逻辑结构,用以包含或引用他们的数据,其中模式对象包含如下:
STORAGE(
[INITIAL integer [K|M]
[NEXT [K|m]}
[MINEXTENTS integer]
[MAXEXTENTS {integer|UNLIMITED}]
[PCTINCREASE integer]
服务端进程和内存区两者构建了oracle系统内存组成结构;oracle服务端=服务端进程+内存区+数据库;oracle实例是oracle用来管理数据库访问的服务器端进程及内存区域的集合。
为一组由ORACLE分配的共享的内存结构,可包含一个数据库实例的数据或控制信息,可划分为如下内存区:
影响SGA的参数有db_block_buffers、db_block_size、log_buffer、shared_pool_size
db_block_buffers的值越高,用户需要的数据在内存的可能性越大,从而减少了Oracle到硬盘访问数据的次数(物理I/O)
然而, db_block_buffers的值太高, Oracle不得不在内存中寻找更多的块来定位你需要的那一块,反而降低了系统性能。
更多的log_buffer减少了数据被填充到日志文件中的次数。
shared_pool_size的值越大,可使经常使用的包和过程长驻内存,可以提高数据库的性能。
SGA不得超过内存的50%
是一个内存区,包含单个进程的数据和控制信息,所以又叫进程全局区(Process Global Area)
数据库进程分为用户进程和oracle系统进程(服务器进程和后台进程)
oracle系统进程分为分为服务器进程和后台进程,服务器进程专门用来处理连接oracle实例的请求,后台进程包括:
用户触发checkpoint是一个数据库事件,它将已修改的数据从高速缓存刷新到磁盘,并更新控制文件和数据文件。
LOG_CHECKPOINT_TIMEOUT
,LOG_CHECKPOINT_INTERVAL
,FAST_START_IO_TARGET
,FAST_START_MTTR_TARGET
参数设置的时候。服务器进程分为专用服务进程和共享服务进程
Oracle并行或集群数据库由两台或更多台物理服务器(节点)组成,它们管理着自己的Oracle实例,并共享一个磁盘阵列。每个节点的Oracle实例有自己的"系统全局区"(SGA)和自己的重做日志文件,但数据文件和控制文件由所有实例共用。数据文件和控制文件由所有实例同时读写;但是,重做日志文件可以由任意实例读取,但只能由拥有它的实例写入。一些参数,如db_block_buffers和log_buffer,可以在每个实例中进行不同配置,但其他一些参数必须在所有实例中均保持一致。每个集群节点有其自己的后台进程集合,就像单个实例一样。另外,还会在每个实例上启动OPS特有的进程,以处理跨实例通信、锁定管理和数据块传送。