什么是Oracle数据库
Oracle DateBase是一款关系型数据库管理系统(RDBMS),同类的产品还有MySQL,SQLServer等。
我们会把那个承载我们核心数据的系统笼统地称为数据库服务器。
严格意义上来讲Oracle DateBase是由两个部分组成:
(image/png)
instance + database = database server
oracle instance:一组后台进程和内存结构
oracle database:存放在操作系统上的物理文件
(image/png)
一、DataBase
一个数据库系统是一个数据表的集合,存在三种文件类型:
control files(控制文件),data files(数据文件),online redo log files(日志文件)。
查看数据文件、控制文件、日志文件:
SELECT name FROM v$datafile;
SELECT name FROM v$controlfile;
SELECT name FROM v$logfile;
Date File
Oracle数据库中的表空间由一个或多个物理数据文件组成。数据文件只能与一个表空间和一个数据库相关联。
Oracle数据库通过分配指定数量的磁盘空间和文件头所需的开销,为表空间创建一个数据文件。如果文件很大,这个过程可能会花费大量的时间。任何数据库中的第一个表空间总是SYSTEM表空间,因此Oracle数据库在创建数据库时自动为SYSTEM表空间分配,数据库的第一个数据文件。
Control File
数据库控制文件是数据库启动和成功操作所必需的一个小型二进制文件。在数据库使用过程中,Oracle数据库会不断更新控制文件,因此无论何时打开数据库,它都必须能够用于编写。如果由于某种原因控制文件不可访问,那么数据库就不能正常运行。
每个控制文件只与一个Oracle数据库相关联。
控制文件包含有关实例访问所需的关联数据库的信息,这些信息在启动时和正常操作时都需要。控制文件信息只能通过Oracle数据库修改;没有数据库管理员或用户可以编辑控件文件。
Redo Log File
REDO条目记录SQL语句本身。
以及执行后对数据库中某个文件某个块做的修改。包括DML、DDL操作。
二、Instance
- 笼统的讲:instance = SGA + background processes
1 SGA系统全局区
SGA基本组件主要有Database Buffer Cache、Redo Log Buffer、Shared Pool、Large Pool、Java Pool、Streams Pool。
- 查看数据库中分配给SGA的大小:
show parameter sga_
1.1 Database Buffer Cache
- LRU算法:清除最近较少使用的缓存
作用:
- 缓存数据:用于缓存从磁盘数据文件中读入的数据块,为所有用户共享。服务器进程负责将数据文件的数据从磁盘读入到数据缓冲区中,当后续的请求需要这些数据时,如果在内存中找到,则不需要再从磁盘读取。
- 延迟写数据文件:对数据的修改在内存缓冲区中进行,减少写磁盘的次数,提高I/O能力。数据缓冲区中被修改的数据块(脏块dirty block)由后天进程DBWR将其写入磁盘。
数据缓冲区的大小对数据库的读取速度有直接的影响
两个管理列表:
- 写列表:记录空闲区域
- LRU列表:清除最近最少使用的数据
内存缓冲区:
- free buffer:空闲缓冲区不包含任何有用的数据,数据库可以重用它们保存从磁盘读取的数据
- dirty buffer:脏缓冲区,包含已修改但尚未写到磁盘的数据
- pinned buffer:钉住/保留缓冲区,是用户会话当前正在激活使用的数据缓冲区
命中率
- 缓冲区读取操作比磁盘读取快得多
- 命中率测量用户从buffer cache中访问到所需数据的百分比,不包括请求冲磁盘读取所需数据
- 命中率=(1-物理读/逻辑读)*100
- 物理读:从磁盘读取数据
- 逻辑读:从内存读取数据
1.2 Redo Log Buffer
- REDO日志条目:重做日志缓冲区是SGA中的一个循环使用的缓冲区,它保存有关对数据库所作更改的信息,SQL语句和DML、DDL操作
- Redo Log Buffer占用缓冲区中连续的、顺序的空间,后台进程LGWR将重做日志缓冲区写到磁盘上的活动重做日志文件(或文件组)
- 记录所有REDO条目,目的是由于数据库恢复
- LGWR写入条件
- 当一个用户进程提交了一个事务记录时
- 每三秒一次
- 当条目达到三分之一容量时
- 在一个DBWR进程写入到磁盘前
- LGWR将REDO条目从Redo Log Buffer写入redo log file。那么服务器进程可以将新的日志项覆盖写入,因此数据库给Redo log buffer 分配了较小内存,5MB
- 较大Redo log buffer 减少redo log file 的IO操作,但是提交处理会花费较长时间;较小的Redo log buffer 将会在LGWR过于繁忙的进行写入,会造成系统CPU压力
- nologging 选项。该选项可以绕过redo log不进行记录,减少资源争用
- 查看Log Buffer:show parameter log_buffer
1.3 Shared Pool
共享池是对SQL、PL/SQL程序进行语法分析、编译、执行的内存区域。
包含Library Cache和Data Dictionary Cache。
Library Cache
- 主要存储编译过的SQL语句、PL/SQL语句,以及这些对象所依赖的table、index、view等对象的信息。
- 由所有用户共享使用
- 使用最近最少使用的LRU算法进行管理
- 发起一条SQL时,首先检查Library Cache中是否有一条已经解析过的且准备执行相同语句。
若有,Oracle就使用Library Cache的这个语句版本,从而减少更多的处理时间——称为软解析soft parse;
如果Oracle未发现Library Cache有次SQL代码的执行版本,则必须建立新的可执行代码——称为硬解析hard parse。
Data Dictionary Cache
- 主要包括对象定义、用户名、角色、权限等信息。
- 当执行一段SQL代码时:
Oracle首先需检查你是否具有执行该操作的权限。在Data Dictionary Cache中查看是否有相关信息,若无,Oracle把信息从数据字典表读到Data Dictionary Cache中。 - 数据字典未命中——即Oracle未在Data Dictionary Cache中发现需要的数据,那么需要花费额外的成本进行数据处理。
- 没有直接调整Library Cache和Data Dictionary Cache大小的方法,只能通过增加或减少Shared Pool。
Result Cache
- 存储SQL查询和PL/SQL的结果集
- 当数据库再次执行相同的SQL查询时,可以从Result cache中检索出结果而不用再次执行查询,极大提高性能。
1.4 Large Pool
- 数据库管理员可以配置一个称为大池的可选内存区域,为:
- 用于共享服务器和Oracle XA接口的会话内存(用于事务与多个数据库交互的地方)
- I/O服务器进程
- Oracle数据库备份和恢复操作
- 大池没有LRU列表。它与共享池中的保留空间不同,共享池中的保留空间使用与从共享池中分配的其他内存相同的LRU列表。
- 通过LARGE_POOL_SIZE查询大小。
1.5 Java Pool
- Java池内存在服务器内存中用于JVM中所有特定于会话的Java代码和数据。Java池内存的使用方式不同,具体取决于Oracle数据库运行的模式。
1.6 Streams Pool
- stream技术是为了在不同数据库之间共享数据。是为了支持实例中的streams活动而分配的内存。
2.后台进程
2.1 SMON(System Monitor)
Responsibilities:
- Instance recovery
- Rolls forward changes in online redo log files
- Opens database for user access
- Rolls back uncommitted transactions
- Coalesces free space
- Deallocates temporary segments
2.2 PMON(Process Monitor)
Cleans up after failed processes by:
- Rolling back the transaction
- Releasing locks
- Releasing other resources
- Restarting dead dispatchers
2.3 DBWn(Database Write Process)
DBWn writes when:
- Checkpoint occurs
- Dirty buffers reach threshold
- There are no free buffers
- Timeout occurs
- RAC ping request is made
- Tablespace OFFLINE
- Tablespace READ ONLY
- Table DROP or TRUNCATE
- Tablespace BEGIN BACKUP
2.4 LGWR(Log Writer)
LGWR writes:
- At commit
- When one-third full
- Every three seconds
- Before DBWn writes
2.5 CKPT(Checkpoint)
Responsible for:
- Signaling DBWn at checkpoints
- Updating datafile headers with checkpoint information
- Updating control files with checkpoint information
2.6 MMON and MMNL
- 可管理性监控流程manageability monitor process(MMON)
执行与自动工作负载存储库(Automatic Workload Repository AWR)相关的任务。 - 可管理性监控流程manageability monitor lite process(MMNL)
将统计信息从SGA中的活动会话历史(ASH)缓冲区写到磁盘。当ASH缓冲区满时,MMNL写入磁盘。
2.7 ARCn(Archiver)
- Automatically archives online redo log files when ARCHIVELOG mode is set
- Preserves the record of all changes made to the database