1. 表空间与数据文件
Oracle数据库的表空间tablespace是一个逻辑上的存储概念,如我们创建一个表,必须要指明将表存在哪个表空间中。实际上的数据物理存储在硬盘上的文件中,我们称它叫数据文件data file。一个tablespace可以由一个或多个data file组成,当然一个data file只能隶属于一个tablespace(不能劈腿哦)。
更详细点。
tablespace由多个段sengment组成,oracle把占空间的对象(如表,索引,簇cluster等)统一称为segment。Segment是由多个区间extent构成,extent又有多个块block组成,block的编号地址相邻。所以block是oracle基本的存储单元。
datafile也是由称为块单元组成,但是他们是系统块os block,windows总的os block大小一般是2048KB。
oracle block一般是os block的倍数,如8192KB。
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
- SYSTEM表空间用于存放系统内部表和数据字典的数据。
 - SYSAUX表空间是11g以后新增的,主要用于存储系统内部常用样例用户的对象,如CRM用户的表和索引等。
 - UNDOTBS1撤销表空间,用于存储修改前的数据。
 - USERS表空间,用户可以在这个空间上创建对象。
 - TEMP临时表空间,系统用于临时存放数据(如排序),处理完后即可释放。
 
SQL> select file_name, tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
-------------------------------------------------------------------------------- ------------------------------
C:\ORACLE\ORADATA\ORCL\USERS01.DBF USERS
C:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1
C:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF SYSAUX
C:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
C:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE
SQL> select file_name, tablespace_name from dba_temp_files;
FILE_NAME TABLESPACE_NAME
-------------------------------------------------------------------------------- ------------------------------
C:\ORACLE\ORADATA\ORCL\TEMP01.DBF TEMP
2. 控制文件control file 
我们平时所指的oracle数据库,主要由两部分组成,数据库database和实例instance。
database就是物理硬盘上我们看得到的各种文件,如datafile,control file,redo log file,它们保存着所有数据。
instance则是由内存(SGA)和进程组成。当oracle启动时,它将数据加载到内存中,然后通过各种进程(PMON,SMON,DBWR,LGWR,CKPT)同database保持一致(读写数据)。所以我们操作oralce实际上是在和instance打交道,然后由它来更新数据库。
其中比较重要的是控制文件control file,它是存储着oracle instance信息,datafile,log file信息的内部二进制文件。
出于安全考虑,control file不止1个,它们保存着相同的内容,如果一个control file坏了,咱们还有备份。建议不要将所有的control file放在一个地方。
数据库启动次序:读取初始化参数文件SPFILE -> 为系统全局区(SGA)分配内存 -> 读取control file,然后找到数据文件和日志文件并打开使用。
SQL> select name, status from v$controlfile;
NAME STATUS
-------------------------------------------------------------------------------- -------
C:\ORACLE\ORADATA\ORCL\CONTROL01.CTL 
C:\ORACLE\ORADATA\ORCL\CONTROL02.CTL 
C:\ORACLE\ORADATA\ORCL\CONTROL03.CTL 
3. 日志文件
日志文件分为重做日志文件(redo log file)和归档日志文件(archive log file)。
SQL> select group#, status, member from v$logfile;
GROUP# STATUS MEMBER
---------- ------- --------------------------------------------------------------------------------
3 C:\ORACLE\ORADATA\ORCL\REDO03.LOG
2 C:\ORACLE\ORADATA\ORCL\REDO02.LOG
1 C:\ORACLE\ORADATA\ORCL\REDO01.LOG
redo log fiel有多个组group构成。一个group中能包括不止一个log file,日志信息是写到group的每个logfile中,所以一个group中的log file存储着一样的信息。当一个group写满之后就转到下一个group中,称之为日志切换。
当所有group都写满了后,就重头开始从第一个group开始,原来的内容将被覆盖丢失。如果不想被丢失,可以采用归档模式,即将数据保存到archive log file中。归档模式会给系统带来一定的性能问题。
查看database采用哪种模式:
SQL> select dbid,name,log_mode from v$database;
DBID NAME LOG_MODE
---------- --------- ------------
1232416663 ORCL NOARCHIVELOG
归档日志路径由SPFILE的log_archive_dest参数确定。
SQL> show parameter log_archive_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string 
log_archive_dest_1 string 
log_archive_dest_10 string 
log_archive_dest_2 string 
log_archive_dest_3 string 
log_archive_dest_4 string 
log_archive_dest_5 string 
log_archive_dest_6 string 
log_archive_dest_7 string 
log_archive_dest_8 string 
log_archive_dest_9 string 
log_archive_dest_state_1 string enable
log_archive_dest_state_10 string enable
log_archive_dest_state_2 string enable
log_archive_dest_state_3 string enable
log_archive_dest_state_4 string enable
log_archive_dest_state_5 string enable
log_archive_dest_state_6 string enable
log_archive_dest_state_7 string enable
log_archive_dest_state_8 string enable
log_archive_dest_state_9 string enable
警告日志文件alert_sid.log保存着例行的信息和错误信息,它的路经是:
SQL> select value from v$parameter where name='background_dump_dest';
VALUE
--------------------------------------------------------------------------------
c:\oracle\diag\rdbms\orcl\orcl\trace
SQL> show parameter background_dump_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string c:\oracle\diag\rdbms\orcl\orcl\trace
用户跟踪文件是oracle出现异常时自动创建的文本文件,它与警告文件一起构成了完整的故障信息描述体系。
SQL> select value from v$parameter where name='user_dump_dest';
VALUE
--------------------------------------------------------------------------------
c:\oracle\diag\rdbms\orcl\orcl\trace
SQL> show parameter user_dump_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string c:\oracle\diag\rdbms\orcl\orcl\trace
4. SGA
系统全局区(system global area)主要由3个区组成。
- 数据高速缓存区(data buffer cache):存放着系统最近使用的数据块。它有3种类型:脏区(dirty buffers, 已经修改需要写回数据文件的数据块),自由区(free buffers, 不包含任何数据并可以写入的区),保留区(pinend buffers, 包含正在处理的或明确保留的区)。
 - 重做日志缓冲区(redolog buffer): 保存日志信息,并在检查点checkpoint或buffer达到一定块数时由进程LGWR写入重做日志文件。
 - 共享池(shared pool):用于存储sql,pl/sql,package,dictionary,lock,character set等。分为library cache和dictionary cache。
 - 大池(large pool):可选的,可供备份和恢复操作。
 
4. 后台进程
- DBWn数据库写入器: 在SPFILE中的DB_WRITER_PROCESSES参数设置进程数目。
 - CKPT检查点参数:可选, 重做日志切换switch时产生。修改SPFILE中的CHECKPOINT_PROCESS参数为TRUE来启动检查点进程。
 - LGRW日志写入器
 - SMON系统监控器:执行恢复必须的进程。
 - PMON进程监控器:清除实效的用户进程,释放资源。
 - ARCH归档器: 可选,参数LOG_ARCHIVE_MAX_PROCESSES用来设置进程数。
 - LCKn锁:可选,并行服务器下可出现多个进程以便于通信。
 - RECO恢复器:分布式数据库下的可选进程。
 - Dnnn调度: 共享模式下的可选进程。一般多种通信协议情况下,每种协议至少创建一个调度进程(像路由,负责用户与服务器间的连接)。
 - SNPn快照进程: 可启动多个,参数JOB_QUEUE_PROCESS。
 - Pnnn并行查询进程: 参数PARALLEL_MIN_SERVERS设定启动数量。
 
oracle不同版本的后台进程数目不同,11g有200多个。
SQL> select name, description from v$bgprocess;
NAME DESCRIPTION
----- ----------------------------------------------------------------
PMON process cleanup
VKTM Virtual Keeper of TiMe process
DIAG diagnosibility process
.........................................
212 rows selected
5. 程序全局区PGA
PGA: process global area或者 program global area,保存私有信息和正在使用的操作系统资源信息。
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 0
6. 数据字典
数据字典的格式(前缀)
- USER_: 记录用户自己的对象
 - ALL_: 用户可以访问的所有对象
 - DBA_: 数据库的所有对象
 - V$_: 动态视图
 - GV_:分布式环境下的同台视图(global V$)
 
基本的数据库字典
DBA_TABLES(=TABS)  | 所有表  | 
DBA_TAB_COLUMNS(=COLS)  | 所有表的列信息  | 
DBA_VIEWS  | 所有视图  | 
DBA_SYNONYMS(=SYN)  | 所有同义词  | 
DBA_SEQUENCES(=SEQ)  | 序列  | 
DBA_CONSTRAINTS  | 约束  | 
DBA_INDEXS(=IND)  | 索引的简要信息  | 
DBA_IND_COLUMNS  | 索引的列信息  | 
DBA_TRIGGERS  | 触发器  | 
DBA_SOURCE  | 存储过程  | 
DBA_SEGMENTS  | 段  | 
DBA_EXTENTS  | 区间  | 
DBA_OBJECTS  | 所有对象  | 
CAT  | 当前用户能访问的所有基表  | 
TAB  | 当前用户创建的表,视图,同义词  | 
DICT  | 构成数据字典的所有表信息  | 
按数据库组件分类的数据字典
数据库  | V$DATABASE  |    | 
表空间  | DBA_TABLESPACES  |    | 
DBA_DATA_FILES  |    | |
DBA_FREE_SPACE  |    | |
控制文件  | V$CONTROLFILE  |    | 
   | V$PARAMETER  |    | 
   | V$CONTROLFILE_RECORD_SECTION  |    | 
数据文件  | DBA_DATA_FILES  |    | 
   | V$DATAFILE  |    | 
   | V$FILESTAT  |    | 
   | V$DATAFILE_HEADER  |    | 
段  | DBA_SEGMENTS  |    | 
扩展  | DBA_EXTENTS  |    | 
日志  | V$THREAD  |    | 
   | V$LOG  |    | 
   | V$LOGFILE  |    | 
归档状态  | V$DATABASE  |    | 
   | V$LOG  |    | 
   | V$ARCHIVED_LOG  |    | 
   | V$ARCHIVED_DEST  |    | 
实例  | V$INSTANCE  |    | 
   | V$PARAMETER  |    | 
   | V$SYSTEM_PARAMETER  |    | 
内存状态  | V$SGA  |    | 
   | V$SGASTAT  |    | 
V$DB_OBJECT_CACHE  | ||
   | V$SQL  |    | 
   | V$SQLTEXT  |    | 
   | V$SQLAREA  |    | 
后台进程  | V$BGPROCESS  |    | 
   | V$SESSION  |    | 
常用动态性能视图
V$FIXED_TABLE  | 列出当前发行的固定对象的说明   | 
V$INSTANCE  | 显示当前实例的状态   | 
V$LATCH  | 列出锁存器的统计数据   | 
V$LIBRARYCACHE  | 有关库缓存性能的统计数据   | 
V$ROLLSTAT  | 列出联机的回滚段的名称  | 
V$ROWCACHE  | 显示活动数据字典的统计   | 
V$SGA  | 有关系统全局区的总结信息   | 
V$SGASTAT  | 有关系统全局区的详细信息   | 
V$SORT_USAGE  | 显示临时段的大小及回话,可以看出哪些进程在进行硬盘的排序操作   | 
V$SQLAREA  | 列出共享区的sql使用统计(每个sql占一行),包括sql语句在内存,分析及执行准备的统计文本限制在1000个字符内  | 
V$SQLTEXT  | 在sga中属于共享sql游标的sql语句内容   | 
V$SYSSTAT  | 包括基本的实例统计信息   | 
V$SYSTEM_EVENT  | 包括一个事件的总等待时间   | 
V$WAITSTAT  | 列出块竞争统计数据   | 










