成为MySQL DBA后,再看ORACLE数据库(五、内存管理)

一、前言

在数据库的体系结构中,内存区是非常关键的一部分,一般而言数据库实例也是由内存+后台进程组成。不同于MySQL的单进程多线程架构,ORACLE是多进程架构,所以在内存管理上也更加复杂。ORACLE的内存管理一般分两部分:PGA(Program Global Area)和SGA(System Global Area)。翻开当年学习ORACLE笔记所画的体系结构图,这也是学习ORACLE印象最深的一张图,很清晰的展现了ORACLE的内存,进程,存储引擎等重要组成部分

二、PGA管理

PGA即程序全局区,是服务器进程(Server Process)使用的一块包含数据和控制信息的内存区域。对于Server Process,是当应用端向服务端发起会话连接时,Oracle会为每个会话启动一个Oracle进程,这也是在进程管理中的专用服务器模式,这是Oracle默认的模式。通常来说,PGA中包含私有SQL区(存放绑定信息、运行时内存结构等)、Session 信息等内容。因此可见,PGA是为会话服务的内存区。在PGA管理中,除了预分配的保留内存,PGA一般由以下两部分组成:1.会话内存(Session Memory):用于存放会话的登录信息以及其他相关信息;2.私有SQL区:包含绑定变量信息、查询执行状态信息以及查询工作区等,每个发出SQL查询的会话都拥有一块私有SQL区。

Oracle的应用程序或用户的应用程序执行时,都可能显示或隐式的打开游标(Open Cursor)来进行任务处理,打开游标就需要分配私有SQL区。管理私有SQL区是用户进程的责任,而分配和回收则依赖于具体的应用程序,为了防止过度的SQL工作区分配,Oracle通过OPEN_CURSORS参数来限制每个用户进程能够同时打开的游标数量。

在PGA中,有一部分称之为UGA(User Global Area),这也是经常见到的一个名词,PGA与UGA 关系,就如同Process和Session的关系,PGA是服务于进程的内存结构,包含进程信息;而UGA是服务于会话的,它包含的是会话的信息。

三、SGA管理

SGA即系统全局区,是一块用于加载数据、对象并保存运行状态和数据库控制信息的一块内存区域,通俗来讲就是数据库的数据缓存区域。当数据库启动到nomount状态时,SGA已经分配,同时启动后台进程。上面ORACLE的体系结构图中,显示了SGA的组成部分:

1.Buffer Cache(缓冲区高速缓存),用于存储最近使用的数据块,这个就类似于MySQL的innodb_buffer_pool;

2.Shared Pool(共享池),用于缓存SQL的执行计划,字典信息等,由于MySQL全是硬解析,所以MySQL是没有这部分的;

3.Redo Log Buffer(日志缓冲区),用于redo log的缓存。类似MySQL中的redo log buffer;

4.Large Pool,通常用于并行计算,rman备份恢复操作;

5.Java Pool,主要用于JVM等Java 选件;

关于sga各个区的使用信息可以通过v$sgainfo视图查询,更详细的分配和使用信息还可以通过v$sgastat视图查询。

四、自动内存管理

在通过dbca创建数据库时dbca.rsp文件中有个参数TOTALMEMORY,设置了数据库可用的最大内存,ORACLE根据这个值自动分配sga和pga的大小。此外,ORACLE中有个参数memory_target,这是一个动态参数,只要开启了这个参数,Oracle数据库将自行决定SGA以及PGA的分配和使用,这极大的简化了DBA对于内存的调整和管理工作。ORACLE还有个参数memory_max_target,这是一个静态参数,表示oracle实例的可以达到的最大内存大小,memory_target最大不能超过memory_max_target。对于sga,sga_max_size参数表示sga可以达到的最大内存大小,sga_target表示sga实际使用的实际内存大小,不能大于sga_max_size;对于pga,则通过pga_aggregate_target参数来指定pga最大可用的内存。

对比MySQL,我认为ORACLE的内存管理更加严谨,ORACLE把内存管理分为sga和pga,并且通过自动内存管理,dba无需再额外设置各个内存区域的参数值。而在MySQL中,除了参数innodb_buffer_pool_size的设置,还需要设置innodb_log_buffer_size、read_rnd_buffer_size、tmp_table_size等参数,此外MySQL分配给会话使用的内存和performance_schema使用的内存也需要关注,任何一个地方设置不合理或出现问题都可能导致整个系统内存使用率过高,在内存管理方面MySQL是更容易踩坑的。

 

posted @ 2024-06-02 17:28  海布里_MySQL  阅读(8)  评论(0编辑  收藏  举报