上图为数据库结构体系的展示。
其中数据库的实例包括SGA和一系列后台管理,监视进程。
数据库包括三种文件:数据文件、控制文件、重做日志文件。
数据库和数据库实例是oracle结构体系中核心的部分。
oracle服务器和实例
oracle服务器和实例是不同的两个概念,服务器不仅仅是物理概念,还包括系统进程,而实例则是重点的维护对象。
-
oracle实例(instance)
要访问数据库必须先启动实例。
实例启动时先分配内存区,然后再启动后台进程,后台进程执行数据库的输入、输出以及监控其他oracle进程。
数据库启动中有五个进程是必须启动的(SMON、PMON、CKPT、DBWR、LGWR)否则实例无法创建。
我们可以在警告日志中查看到详细过程。
如何查看警告日志:https://mp.csdn.net/console/editor/html/105365148
注意:如果计算机重启时自动启动数据库,如果用户安装了其他占用大量内存的应用软件,可能会导致内存不足,系统无法为oracle分配SGA,必须的五个进程也无法启动
-
oracle服务器(server)
oracle服务器由数据库实例和数据库文件组成,这就是数据库管理系统(DBMS)。
数据库服务器除了维护实例和数据库文件外,还在用户建立与服务器的连接时启动服务器进程并分配PGA(程序全局区)。
-
oracle数据库物理结构(文件组成)
oracle数据库的物理结构就是数据库中的一系列操作系统文件,oracle数据库由三类文件组成:
- 数据文件:数据文件包含数据库中的实际数据,是数据库操作中数据的最终储存位置。
- 控制文件:包含维护数据库和验证数据库完整性的信息,它是二进制文件。
- 重做日志文件:重做日志文件包含数据库发生变化的记录,是在发生故障时用于数据恢复。
-
参数文件、密码文件和归档日志文件
虽然这三个文件不是oracle数据库文件,但却是数据库不可缺少的三个文件。
- 参数文件:参数文件中定义了数据库实例的特性。在参数文件中包含为SGA中内存结构分配空间的参数,如何分配数据库告诉缓冲区的大小等,参数文件时正文文件,可以使用vim查看。
- 密码文件:密码文件授予用户启动和关闭数据库实例,在刚安装完数据库时,oracle的默认用户名和密码就存储在密码文件中,oracle可以借此判断用户的操作权限。
- 归档日志文件:归档日志文件时日志文件的脱机备份,是在发生故障后进行数据恢复时可能使用到改文件。
数据库连接与会话
连接与会话是紧密相关的两个概念。
-
数据库连接
连接时用户与数据库服务器之间的通信途径,一个会话可以提供多个连接。oracle提供了多重数据库连接的方式,以下列举三种连接方式:
- 基于主机的连接方式:客户端与服务器在同一台计算机上。
- 基于客户机-服务器的方式:客户端与服务器在不同计算机上,客户通过网络连接数据库,远程访问、维护等。
- 客户应用服务器-数据库服务器:这种方式成为三层访问模式,用户首先访问应用服务器,然后由应用服务器连接数据库。
-
会话
会话是指一个明确地数据库连接。用户一旦采用一种方式连接数据库,我们就称这种连接为一个会话。
一个用户可以发起多个会话,例如用sys用户建立两个会话后查看,可以看到同时有两个会话sys用户
SQL> select username,status from v$session;
USERNAME STATUS
------------------------------------------------------------ ----------------
SYS ACTIVE
SYS INACTIVE
连接与会话之间的区别
oracle数据库内存结构
oracle内存结构有PGA何SGA两大部分组成。
PGA称为程序全局区,程序全局区不是实例的一部分,当服务器进程启动时才会分配PGA。
SGA称为系统全局区,它是实例的一部分,当数据库实例启动时,首先分配SGA,在系统全局区中包含了一下几个重要的内存区,即数据高速缓存、重做日志缓存、共享池、大型池、java池。
-
共享池(shared pool)
oracle引入共享池的目的就是共享SQL或者PL/SQL代码,即把解析到的SQL代码的结果在这里缓存,其中PL/SQL代码不仅在这里缓存,还在这里共享。
共享池分为两个部分组成:库缓存和数据字典缓存。
库缓存
库缓存存储了最近使用过的SQL语句,当然其容量有限,oracle采用了LRU(least recent used)算法管理库缓存。一旦缓冲区填满就将最近最少使用的程序从缓存中清除。由于oracle没有直接修改库缓存的指令,所以只能通过修改共享池的大小实现。
设置和查看共享池的大小:
SQL> alter system set shared_pool_size=16M;
系统已更改。
SQL> show parameter shared_pool_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
shared_pool_size big integer
16M
数据字典缓存
该缓存区就是与数据字典相关的一段缓冲区。在数据字典缓冲区中,存储了数据文件、表、索引、列、用户、权限信息和其他一些数据库对象的定义。在SQL语句的解析阶段,数据库服务器需要这些信息来解析用户名和用户的访问权限。
如果oracle缓存了这些信息会缩短查询的时间。
-
数据库高速缓存区(database buffer cache)
数据库高速缓存区存储了最近从数据文件中读入的数据块信息或用户更改后需要写回数据库的数据信息,此时这些没有提交给数据库的更改后的数据成为脏数据。当用户执行查询语句时,如果用户查询的数据在缓存中,则可以不用再到磁盘中读取数据,这样读取的速度会快很多。
可见oracle设置缓存的目的基本都是提高查询速度,减少用户的查询响应时间。
oracle使用 DB_BLOCK_SEZE和DB_BLOCK_BUFFERS设置高速缓存的大小,前者是数据块的大小,后者是数据库的个数,两者的乘积就是数据库高速缓存区的大小。
查看库高速缓存区、库高速缓存数据块大小、高速缓存数据库个数
SQL> show parameter db_block_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
db_block_size integer
8192
SQL> show parameter db_block_buffer
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
db_block_buffers integer
0
SQL> show parameter db_cache_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
db_cache_size big integer
0
虽然系统会自动是分配数据库高速缓存大小,但是用户依然可以自己设置:
SQL>alter system set db_cache_size=200M
系统已更改
buffer cache advisory parameter(缓冲区顾问参数)
oracle中引入缓冲区顾问参数的作用:
缓冲区顾问用于启动或者关闭统计信息,这些信息用于预测不同的缓冲区大小导致的不同行为特性。DBA可以参考这些统计信息,基于当前的数据库工作负载设置优化的数据库高速缓存。
- OFF:关闭缓存顾问,不分配工作内存
- ON:开启缓存顾问,分配工作内存
- READY:开启缓存顾问,不分配工作内存
打开、关闭、查看缓存顾问
SQL> alter system set db_cache_advice=OFF;
系统已更改。
SQL> show parameter db_cache_advice;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
db_cache_advice string
OFF
SQL> alter system set db_cache_advice=ON;
系统已更改。
SQL> show parameter db_cache_advice;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
db_cache_advice string
ON
查看数据库高速缓存信息
select*from v$db_cache_advice
-
重做日志高速缓存区(redo log buffer cache)
用户执行了sql操作会使得数据库发生变化时,这些变化了的数据写入数据库高速缓存之前会先写入重做日志高速缓存区,同时变化了之前的数据也会放入重做日志高速缓存区,这样数据库在执行数据恢复的时候只知道前后滚哪些数据了。
如何查看重做日志高速缓存区大小
重做日志高速缓存区参数log_buffer是静态参数,如果修改会报错
SQL> show parameter log_buffer;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
log_buffer integer
2453504
SQL> alter system set log_buffer=10M;
alter system set log_buffer=10M
*
第 1 行出现错误:
ORA-02095: 无法修改指定的初始化参数
-
大型池(large pool)
大型池是SGA中的一段可选内存,只在共享服务器环境中配置大型池。
在共享服务器环境中,oracle在共享池中额外分配空间用于储存用户进程和服务器进制之间的会话信息,但是用户进程区UGA的大部分将在大型池中分配,这样可以减轻共享池的负担。在大规模的输入、输出及备份过程中也需要大型池作为缓存空间。
查看和修改大型池参数
SQL> show parameter large_pool_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
large_pool_size big integer
0
SQL> alter system set large_pool_size=10M;
系统已更改。
SQL> show parameter large_pool_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
large_pool_size big integer
12M
-
Java池(Java pool)
java池也是一段可选内存区,在安装完java或者使用java程序时必须设置java池,它用于java语言编写的指令。java语言与PL/SQL语言在数据库中有相同的储存方式。
查看和修改java池大小
SQL> show parameter large_pool_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
large_pool_size big integer
4M
SQL> show parameter java_pool_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
java_pool_size big integer
0
SQL> alter system set java_pool_size=1M;
系统已更改。
SQL> show parameter java_pool_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
java_pool_size big integer
4M
-
流池(streaming pool)
流池也称为流内存,它是oracle流专用的内存池,流是oracle数据库中的一个数据共享。
-
PGA(进程全局区)
进程全局区是服务器进程专用的一块内存,它是在操作系统进程专用的内存。
系统中的其他内存是无法访问这块内存的。
PGA独立于SGA,它是由操作系统在本地分配的。
PGA中存储了服务器进程或单独的后台进程的数据信息和控制信息。
它随着服务器进程的创建而被分配内存,随着进程终止而释放内存。
PGA不是一个共享区域,而是服务器进程专有的区域。
在专有服务器配置中包括了以下概念:
- 排序区:对某些SQL语序执行的结果进行排序
- 会话信息:包含本次会话的用户权限和性能统计信息。
- 游标状态:标明当前的会话执行的SQL语句的处理阶段
- 堆栈区:包含其他会话变量
专有服务器下的PGA模式
共享服务器下的PGA模式
-
UGA(用户全局区)
在共享服务器模式下有一个重要的概念UGA,它是用户会话状态,这部分内存会话中可以访问,UGA存储在每个共享服务器都可以访问的SGA中,这样任何服务器都可以使用用户会话的数据和其他信息。在专有服务器模式下,用户会话状态不需要共享,所以UGA总是在PGA中分配。
-
如何查看SGA中内存分配情况
SQL> show sga
Total System Global Area 776646656 bytes
Fixed Size 2257272 bytes
Variable Size 444599944 bytes
Database Buffers 327155712 bytes
Redo Buffers
-
如何查看SGA大小
SQL> show parameter sga_max_size;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
sga_max_size big integer
744M
oracle数据库后台进程
后台进程是数据库实例启动时,在数据库服务器端启动的管理程序,它使得数据库的内存结构和数据库物理内存之间协调工作。从功能上考虑,在数据库内存结构、后台进程和数据库物理结构之间的关系如上图。
数据库后台有五个进程是必须要启动的SMON、PMON、DBWR、LGWR、CKPT。
-
SMON(系统监控进程)
系统监控进程主要是进行数据库实例恢复。当数据库发生故障的时候(如操作系统重启),此时实例SGA中没有写到磁盘的信息将全部丢失。数据库重启后,SMON将会自动恢复实例,以下是恢复的步骤:
- 前滚所有没有写入的数据文件而记录在重做日志中的数据。此时,SMON监控进程读取重做日志文件,把用户更改的数据重新写入数据块。
- 打开数据库,此时或许SMON的前滚操作还没完成,这样的目的是为了方便用户及时登录,以免前滚时间太长,影响用户行为。
- 回滚未提交的事务。
除此以外,SMON还执行某些空间维护的作用
- combine,coalesces,adjacent数据文件中的自由空间
- 回收数据文件中的临时段
-
PMON(进程监控进程)
PMON负责服务器进程的管理和维护工作,进程失败或者连接异常发生时,该进程负责一些清理工作:
- 回滚没有提交的事务。
- 释放所持有的当前的表或者行锁
- 释放进程占用的SGA资源
- 监视其他oracle的后台进程,在必要时重启这些后台进程
- 向oracleTNS监视器注册刚启动的实例。如果监听器在运行,就与这个监听器通信并传递如服务名、实例的负载等参数,如果实例没有启动,PMON就会定期地尝试连接监听器来完成实例的注册
-
DBWR(数据库写入进程)
数据库高速缓存区中出现了脏数据这个概念,脏数据就是用户更改了,但是没有提交到数据库中的数据。因为在数据文件与数据库高速缓存中的数据不一致,顾称脏数据。
这种脏数据必须在一定的条件下写入到数据文件中,这就是数据库写入进程的作用。
数据库写进程就是负责把数据库高速缓存区中的脏数据写到数据文件中。(因为oracle数据库设计的思路就是减少I/O次数,但是脏数据达到一定程度或者某种条件的时候就提交一次脏数据,如果不用DBWR,直接提交脏数据,这样会增加oracle的磁盘输入输出,占用系统时间降低效率)
数据库的写进程是离散到不同数据库文件的,执行一个更新时,数据库写进程会修改不同的空间中储存的数据块的和索引块,所以数据库写进程的离散写的速度很慢。
一个数据库实例可以启动多个数据库写进程,在多CPU系统可以使用多个数据库写进程来分担单个写进程的工作负载。
发生数据库写进程写入脏数据的事件:
- 发生检查点事件
- 脏数据达到了门限值
- 数据库缓冲区没有足够的缓存为其他的事务提供足够的空间
- 表空间处于热备份状态
- 表空间被置为离线状态
- 表空间被置为只读状态
- 删除表或截断表
- 超时
-
LGWR(重做日志写进程)
重做日志写进程负责将重做日志缓冲区中的数据写到重做日志文件。
重做日志缓冲区中的内容是恢复事务所需要的信息。
重做日志写进程是顺序写的,它比离散写的效率要高,将每个事物的重做信息全部放在重做日志中,通过数据库高速缓存中缓存的脏数据块,而由重做日志写进程大规模顺序写,整体来说可以提高系统的性能。
重做日志写进程在满足一个条件时会启动进程工作:
- 当事务提交时
- 当重做日志高速缓冲区1/3被占用时
- 当重做日志缓冲区有1MB的数据时
- 当数据库写进程将脏数据写到数据库之前
-
ARCH/ARCn(归档日志进程)
归档日志进程是可选进程,它不是在实例启动时自动启动的。
它的作用是在把写满的重做日志文件的数据写到一个归档日志中,这个归档用作截止故障时的数据库恢复。
重做日志文件负载实例失败时的数据恢复,因为SGA中没有被保存的数据会全部丢失,使用重做日志就可以完全恢复事务,而归档日志进程用于介质恢复,如:磁盘损坏,就可以使用以前备份的数据文件,使用重做日志文件和归档重做日志文件就可以完全恢复数据库。
归档进程不在实例启动时自启动,所以生产环境数据库中必须使用归档模式,防止灾难性的数据损坏。
查看系统的归档模式
SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 1
当前日志序列 1
设置数据库为归档模式,并启用自动归档
前提:必须先关闭数据库,以MOUNT参数启动数据库,更改后再切换到OPEN状态即可
SQL> alter database close;
数据库已更改。
SQL> alter database dismount;
数据库已更改。
SQL> shutdown;
ORA-01507: ??????
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 776646656 bytes
Fixed Size 2257272 bytes
Variable Size 444599944 bytes
Database Buffers 327155712 bytes
Redo Buffers 2633728 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 1
下一个存档日志序列 1
当前日志序列 1
查看归档日志目录
SQL> show parameter db_recovery;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
db_recovery_file_dest string
/u01/app/oracle/fast_recovery_
area
db_recovery_file_dest_size big integer
4182M
-
CKPT(检验点进程)
检验点是一个事件,当数据库写进程将SGA中被修改了的数据库高速缓存中的数据写到数据文件时产生,这些被修改的数据包括提交和未提交的数据。
由于引入了检验点,使得所有的检验点的所有发生了变化的数据都写到数据文件中,在实例恢复时,就不必恢复校验点之前重做日志中的数据,加快了系统恢复的效率。
校验点进程不是用来建立校验点,只是在校验点发生时,会触发这个进程进行一系列工作:
- 校验点进程要将校验点号码写入相关的数据文件的文件头中
- 校验点进程把校验点号码,SCN号、重做日志序列号、归档日志名等都写入到控制文件中。
oracle提供一个指令,可以让用户强制产生校验点,使得用户可以干预校验点的产生
强制执行校验点
SQL> alter system checkpoint;
系统已更改。