- Oracle 12c云数据库备份与恢复技术
- 姚世军
- 1715字
- 2021-04-01 17:48:22
1.3.2 内存结构
当数据库实例启动时,Oracle数据库服务器分配内存并启动若干后台进程。Oracle实例在启动时创建的内存结构用来保存数据库实例在运行过程中所需要处理的数据,主要记录如下内容:
①被执行的程序代码,即解析后的SQL或PL/SQL程序代码。
②用户连接会话信息,包括不活动的会话信息。
③缓存的数据,如用户查询和修改过的数据块以及重做记录等。
④程序运行时所需的各种信息,如查询状态等。
⑤进程之间共享和通信时所需的信息,如数据加锁信息等。
根据内存中存放的内容将数据库基本内存结构分为软件代码存储区、系统全局区(System Global Area,SGA)、程序全局区(Program Global Are,PGA)和用户全局区(User Global Are,UGA)四部分。
软件代码区存放正在运行或可以运行的程序代码。Oracle数据库代码是与用户程序分开的,存储在更加受保护的区域。SGA是由所有服务进程和后台进程所共享的内存段,它包含数据库实例的数据与控制信息。PGA是存放每个Oracle进程(如服务进程和后台进程)私有的数据和控制信息的非共享内存,它是在Oracle进程启动时由Oracle数据库创建的。Oracle中每个进程都拥有自己的PGA区。用户全局区UGA存放的是用户会话相关的内容。
Oracle的实例内存结构如图1-2所示。
图1-2 Oracle的实例内存结构
从图1-2可以看出,SGA中的数据被所有进程所共享,PGA中的数据只能由每个进程访问。
1.系统全局区SGA
SGA是一组可读写共享内存结构,包含一个Oracle数据库实例的数据和控制信息。如果多个用户并发连接到同一个实例,那么SGA中的数据由多个用户共享。每个Oracle实例只有一个SGA,SGA区中的信息能够被所有Oracle进程共享使用。数据库的各种操作主要都是在SGA区中进行的。
SGA区中保存着在进行数据管理、重做日志管理以及SQL程序分析时所必需的共享信息,主要包括数据库缓存、重做日志缓存、共享池、Java池和大型池等缓存块。这里主要介绍数据库缓存和重做日志缓存的概念。
(1)数据库缓存(Database Buffer Cache)
数据库缓存是SGA中保存最新从数据文件中读取的数据,所有连接到实例中的用户都共享数据库缓存。当用户向数据库请求数据时,如果所需的数据已经位于数据库缓存中,则将直接从数据库缓存中提取数据并将其返回用户;如果不在数据库缓存中,则将从数据文件中读取数据到数据库缓存。
(2)重做日志缓存(Redo Log Buffer)
重做日志缓存是存储对数据库所做修改信息的缓存区,这些重做信息以重做记录的形式存放。重做记录包含重做构造变化所需的各种信息。每当用户执行INSERT、UPDATE、DELETE等语句对表进行修改时,或者执行CREATE、ALTER、DROP等语句创建或修改数据库对象时,Oracle都会自动为这些操作生成重做记录。重做记录是由Oracle服务进程将它们从用户内存空间复制到SGA的重做日志缓存,然后由LGWR后台进程把重做日志缓存中的内容写入联机重做日志文件中。
重做日志缓存是一个循环缓存区,在使用时从顶端向底端写入数据,然后返回到缓冲区的起始点循环写入。重做日志缓存占用缓存区中的连续存储空间。
(3)查询SGA
所有数据库后台进程和服务进程都可以读SGA中的信息,数据库操作期间服务进程也可以写入SGA中。如果系统使用共享服务结构,那么请求队列和响应队列及PGA中的部分内容也在SGA中。
如果要了解SGA内存的大小,可以在SQL * Plus中执行SHOW SGA命令或查询动态性能视图V$SGA。如果要显示SGA更详细的信息,可以查询动态性能视图V$SGASTAT。
2.程序全局区PGA
(1)PGA的概念
程序全局区PGA是在用户进程连接数据库并创建会话时由Oracle为服务进程分配的,专门用来保存服务进程的数据和控制信息的内存结构。只有服务进程本身能够访问它自己的PGA区。每个服务进程都有自己的PGA区,各个服务进程PGA区的总和即为实例的PGA区的大小。PGA的大小由操作系统决定,并且分配后保持不变。
(2)查询PGA信息
在Oracle数据库中,可以从下面几个动态性能视图中查询PGA区内存分配信息:
● V$SYSSTAT 系统统计信息和用户会话统计信息。
● V$PGASTAT 显示内存使用统计信息。
● V$SQL_WORKAREA SQL游标所用工作区的信息。
● V$SQL_WORKAREA_ACTIVE 当前系统工作区的信息。
3.用户全局区
用户全局区(UGA)是会话内存区,即为登录信息等数据库会话所需的会话变量分配的内存,它本质是存储的会话状态。UGA由会话变量和OLAP池两部分组成。
UGA在整个会话生命周期内必须都可以使用。因此,在共享服务器连接时不能将UGA存储在PGA中,因为PGA是单个进程专用的,即在共享服务器连接时,UGA存储在SGA中,从而保证每个共享服务器进程都可以访问它。当使用专用服务器连接时,UGA存储在PGA中。