之前写了一篇文章《Oracle-知识结构漫谈》 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新。
数据库的体系结构是从某一个角度来分析和考察数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。
Oracle数据库是一个逻辑概念,而不是一个运行数据库服务器的计算机系统或者一台Oracle服务器。
一般Oracle数据库 可以分为两部分:
实例是一个非固定的,基于内存的基本进程与内存结构。 当服务器关闭之后,实例也就不存在了。
数据库指的是固定的、基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等。
一般情况下,Oracle数据库都是一个数据库包含一个实例。
数据库服务器DatabaseServer 一般指的是数据库各软件部件(如sqlplus、oem、exp/imp等) 、 实例 及 数据库 3个主要部分, 是由安装在服务器上的所有的软件(包括各种类型的文件)及启动成功后的实例组成。
如上图,我们可以看出 SQL命令从客户端发出后,由Oracle的服务器进行响应,在内存区域中进行语法分析、编译、执行,将修改后的数据写入数据库文件,数据库的修改信息写入日志文件,再将SQL的执行结果返回给客户端。
在Oracle系统中,表空间和数据文件是Oracle数据库结构的基本要素.
在Oracle数据库中,用于存放数据库表、索引、回滚段等对象的磁盘逻辑空间叫做表空间。 如上所示。
一般在完成Oracle系统的安装并创建Oracle实例后,Oracle系统会自动创建多个表空间。
alter tablespace system add datafile '/data/cc/system02.dbf' size 10240M;
总结:
除了Oracle系统默认创建的表空间外,用户可以根据应用的规模及其所要存放的对象类型创建多个表空间,以区分用户数据与系统数据、索引和数据。
此外,不同应用的数据应将不同表空间的文件放在不同的盘上,减少I/O冲突。
数据文件DataFile是用于保存应用数据和Oracle系统内部数据的文件。 Oracle数据库由表空间组成,每个表空间可以包含一或者多个数据文件
管理用户数据和Oracle系统本身的数据,这些数据被自动存放在系统表空间对应的system01.dbf中。
二Oracle系统内部的数据字典、表如DBA_USERS、DBA_DATA_FILES等说存放的岠属于Oracle系统的内部数据,这也数据也存放在系统表空间对应的system01.dbf中。
用户数据是指用户应用系统的数据,包括与应用系统先关的信息。
select tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024*1024), 0) || 'G' total_space
from dba_data_files
order by tablespace_name;
从上面的查询结果看出来: 表空间和数据文件是一对不可分离的数据库实体。
select tablespace_name,file_name,bytes/1024/1024 "file_size(M)",autoextensible from dba_temp_files;
无论是普通的表空间还是临时表空间,当创建时至少需要一个数据文件。
Oracle创建数据文件时,实际上是将磁盘的操作系统重新格式化成Oracle数据块,并且每个Oracle数据块都有唯一标示。
一般情况下,Oracle数据块是操作系统块的倍数,比如操作系统块大小2048B,而Oracle数据块大小为8192B(DB_BLOCK_SIZE=8192)
SQL> show param db_block
NAME TYPE VALUE
--------------- ----------- --------
db_block_buffers integer 0
db_block_checking string FALSE
db_block_checksum string TYPICAL
db_block_size integer 8192
一般的,我们在设计数据库结构时需要将表、索引或者簇(Cluster)存储到一个已经存在的表空间上, 而表、索引或者簇都是占用空间的对象,Oracle把占空间的对象统一称为段(Segment)。
段是有多个区间(Extent)构成,而区间是由多个连续(块的编号地址相邻)的Oracle数据块构成。
所以Oracle中,数据块是一个基本的处理单位
因为控制文件中存放数据文件、日志文件等信息,所以Oracle实例在启动的时候必须访问控制文件。
Oracle实例在正常启动时,首先要访问的初始化参数文件SPFILE, 然后Oracle会为系统全局区(SGA)分配内存,这是Oracle实例处于安装状态,控制文件处于打开状态; 接下来,Oracle会自动读出控制文件中的所有数据文件和日志文件信息,并打开所有的数据文件及日志文件信息以便用户访问.
控制文件内部出了存放ORACLE实例及创建日期、数据文件、日志文件外,在系统运行的过程中,还存放系统更改号、检查点信息,及归档的当前状态信息等,如果开启了RMAN备份,还会存放RMAN的备份信息。
Oracle系统处于安全的考虑,建议在 系统安装时 指定多个控制文件,并将它们存放在不同的磁盘路径下。
查询数据库实例包含的控制文件信息路径
select name, status from v$controlfile;
Oracle日志文件分为 重做日志文件 和 归档日志文件。
特别是重做日志文件,是Oracle数据库系统正常提供服务不可或缺的。
Online Redo log file 是用来记录数据库所发生过的交易的信息及有Oracle内部行为引起的数据库变化信息。
在数据库恢复时,可以从该日志文件中读取出原来交易的数据。 在数据库运行期间,当用户发出commit命令时,数据库会将每笔交易记录到日志文件中,写入日志文件成功后,才会把信息传给用户程序。所以,在日志文件中可以随时督促信息以恢复某些交易数据。
当对表或者整个表空间设置了NOLOGGING属性时,基于表或表空间中所有表的DML操作都不会生成日志信息,当然也就减少了日志信息的产生。
为确保数据库系统的安全,每个Oracle实例用一个日志线程(Thread)来近路数据库的变化。 日志线程由若干日志组构成,日志组又由一个或者多个日志成员构成(当然也可以包括一个)。
可以从v$logfile数据字典中查询
select group#,status , member from v$logfile ;
可以根据 v$log_history 这个动态视图查询日志切换的频率,判断日志的大小是否合适。 日志组空间太小的话,第一会导致dbwr写的频率增加,增加了i/o;第二会造成事务的等待,延长事务周期,导致数据库假死。
按照官方建议,日志切换时间一般在10-15分钟比较适合。
Oracle实例在运行中产生日志信息,首先被记录在SGA中的日志缓冲区中, 当发出commit命令后(或者日志缓冲区信息满1/3或者3S过去)时,LGWR进程将日志信息从日志缓冲区中读出并写到日志文件组序列号小的文件中, 一个日志组写满后接着写另外一组。
在DBWR工作之前,LGWR首先将事务变化写入到重做日志。 LGWR工作触发条件: 1、提交事务(commit) 2、每隔3秒钟 3、当重做日志信息超过1M 4、重做日志缓冲区超过1/3满 5、SCN(System Change Number)
当LGWR进程将所有能用的日志文件都使用过一次后,它将再次转向第一个日志组重新覆写。
Oracle用日志文件序列号来跟踪不同的日志文件,当LGWR进程写满第一个日志组而转向另外一组时,称之为日志切换。
当日志发生切换时,Oracle会往警告日志文件(alter_sid.log) 记录相应的信息,以帮助用户观察各日志组的使用情况。
oracle系统运行有两种模式——归档模式和非归档模式。
非归档模式就是在系统运行期间,所产生的日志信息不断的记录到各日志文件组中,当所有的重做日志组被写满年后又重新从第一个日志组开始覆写日志信息内容。
归档模式就是在各日志文件(成员)都写满即将被覆盖前,现有归档进程(ARCH)将即将被覆盖的日志文件中的日志信息读取出来并写到归档日志文件中,以便后面的恢复操作时查找。
默认情况下,Oracle系统不采用归档运行模式。
查看数据库是否处于归档模式
SQL> SELECT log_mode FROM v$database;
LOG_MODE
------------
NOARCHIVELOG
如果将数据库设置为归档模式下运行, 归档日志的领有服务器参数文件SPFILE的log_archive_dest参数确定。
SQL> show param log_archive_dest
NAME TYPE VALUE
--------------- ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string LOCATION=/ccarch/cc valid_for=(all_logfiles,all_roles) db_unique_name=pr_cc
服务器参数文件SPFILE(Server Parmater File)是二进制文件,用来记录Oracle实例的基本参数信息,包括数据库实例名、控制文件所在路径、进程等。
服务器参数文件在Oracle安装时已默认的方式创建, 文件名为 SPFILEsid.ora , 其中sid为数据库实例名。
SPFILE中的参数由oracle系统自动维护,如过要修改某些参数,不能对SPFILE进行直接编辑, 需要通过alter system命令来修改。
作用:主要进行DBA权限的身份认证
密码文件的位置:
$ORACLE_HOME/dbs/orapw$ORACLE_SID
密码文件查找的顺序
--->orapw<sid>--->orapw--->Failure
Oracle的两种认证方式; - 使用与操作系统集成的身份验证 - 使用Oracle数据库的密码文件进行身份认证
两种认证方式, 决定在两个参数中
创建Oracle密码文件的命令
orapwd file=<fname> password=<password> entries=<users> force=<y/n>
告警日志文件是一个存放在Oracle系统目录下的特殊文本文件(trace file),用来记录数据库运行期间错误信息。
告警日志文件命名一般为alert_.log
,其中SID为ORACLE数据库实例名称。
10G中告警日志的路径 由Oracle系统的background_dump_dest参数指定。
SQL> show parameter background_dump_dest
NAME TYPE VALUE
------------------- ----------- --------------------
background_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace
11G及12C中,引入了ADR(Automatic Diagnostic Repository:一个存放数据库诊断日志、跟踪文件的目录),关于ADR对应的目录位置可以通过查看v$diag_info系统视图
SQL> select * from v$diag_info;
Diag Trace对应的目录为文本格式的告警日志文件所在的目录,而Diag Alert对应的目录为XML格式的警告日志(对应为log_x.xml)
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';
这里的Default Trace File就是缺省的会话跟踪文件名称
跟踪文件(trace file)的作用,通常是一个服务器进程对某种异常错误条件做出响应时创建的诊断文件。
路径由服务器参数文件SPFILEsid.ora的user_dump_dest参数指定。
SQL>show parameter DUMP_DEST
NAME TYPE VALUE
---------------- ----------- ------------------------------
background_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace
core_dump_dest string /oracle/diag/rdbms/pr_cc/cc/cdump
user_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace
background_dump_dest(后台转储) core_dump_dest(内核转储) user_dump_dest(用户转储)
跟踪文件名形:SID名+进程名+进程ID
Oracle服务器是由Oracle实例+Oracle数据库组成。
Oracle实例是有SGA+后台进程组成。 每一个Oracle实例都有自己的SGA和独立的Oracle进程集。
之前的博客 Oracle-内存管理解读
查看当前系统的SGA大小:
SQL>show parameter sga_max_size
NAME TYPE VALUE
------------------ ----------- ----------------------------
sga_max_size big integer 116992M
修改当前系统的SGA大小:
alter system set sga_max_size=1024m scope=spfile;
因为实例内存的分配是在数据库启动时进行的,所以要让修改生效,要重启数据库。
存储Oracle系统中最近使用过的数据块(即用户的高速缓冲区)
数据告诉缓冲区有3种类型 - 脏区Dirty Buffers - 自由区Free Buffers - 保留区Pinned Bffer
大小由db_cache_size 决定 查看:
SQL> show parameter db_cache_size
NAME TYPE VALUE
-------------- ----------- -------------------------
db_cache_size big integer 99G
修改:
SQL>alter system set db_cache_size=1024m;
在这些日志在写入重做日志文件之前, 必须先写入到从昨日之缓冲区,然后由LGWR进程将它写入磁盘,大小由LOG_BUFFER决定
查看:
SQL>show parameter shared_pool_size
NAME TYPE VALUE
--------------------- ----------- ------------------------
shared_pool_size big integer 10G
修改:
SQL>alter system set shared_pool_size=120m;
是一个可选的区域,用于一些大型的进程如Oracle的备份恢复操作、IO服务器进程等
该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小
被Oracle流所使用
SQL>select name description from v$bgprocess ;
Database Writer 数据库写。主要作用是将Database buffer cache(数据库缓冲区)里那些被更新过、但还没有被写入数据文件的数据写入到数据文件中。这里的n表示可以有多个数据库写操作.
可以修改SPFILE的DB_WRITER_PROCESSES参数,以允许使用多个DBWR进程,进程的名字分别为 DBW0、DBW1、DBW2等…
SQL>alter system set db_writer_processes=3 scope=spfile;
可选进程。
可以通过SPFILE中的CHECKPOINT_PROCESS参数为TRUE来启动检查点进程
日志文件写进程:是日志缓冲区的治理进程,负责把日志缓冲区中的日志项写入磁盘中的日志文件上。每个实例只有一个LGWR进程.
System Monitor,负责完成自动实例恢复和回收分类(sort)表空间。
PRocess monitor ,实现用户进程故障恢复、清理内存区和释放该进程所需资源等。
清除失败的进程 回滚事务 释放锁 释放其他资源
archiver process 把已经填满的在线日志文件拷贝到一个指定的存储设备上。仅当日志文件组开关(switch)出现时,才进行ARCH操作。ARCH不是必须的,而只有当自动归档可使用或者当手工归档请求时才发出。
可选进程 封锁进程:用于并行服务器系统,主要完成实例之间的封锁。
可选进程
负责解决分布事物中的故障。Oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。 RECO进程试图建立与远程服务器的通信,当故障消除后,RECO进程自动解决所有悬而未决的会话。
负责出护理数据库快照的自动刷新,并通过dbms_job包运行预定的数据库存储过程.
与SGA不同,PGA是一个私有区。
http://blog.csdn.net/yangshangwei/article/details/53124044#t25
SQL> show parameter pga
NAME TYPE VALUE
------------------ ----------------- ------------------
pga_aggregate_target big integer 10G
之前的博客 Oracle-数据字典解读