Oracle数据库的组成
Oracle数据库的组成部分:
- 实例instance
- 内存
- SGA
- PGA
- 其他部分
- 内存
- 进程
Oracle后台进程、服务器端进程、客户端进程。
PMON、SMON、DBWR、LGWR、CKPT、其他。
- 数据库database
- 文件
控制文件、重做日志文件、数据文件
- 文件
- 其他部分
参数文件、密码文件、归档日志
数据库实例内存
sql在数据库实例的执行流程:
- 用户进程Client Process 向数据库发送一条SQL语句到监听器
- 监听器将请求转到数据库实例上
- 数据库实例开辟一个Server Process,和Client Process建立连接,组成一个Session。Server Process进行用户请求的处理
- 服务器端开辟一块内存PGA,存放用户的请求、SQL。之后到SGA区执行SQL语句
- 首先到SGA区的 Shared Pool中解析SQL语句(语法分析有没有语法错误、语义分析分析SQL语义),得到执行计划
- 按照执行计划到SGA区的 Database Buffer Cache访问数据
- 如果Database Buffer Cache内存中没有找到,Server Process就会去磁盘的数据文件中查找,读入到Database Buffer Cache中
- 读到数据之后,如果用户需要修改数据,就会在 Database Buffer Cache中修改数据块。修改之前会先将原来的数据放到undo表空间,然后才修改数据块
- 修改数据块之后,就要产生redo日志。就会在redo log buffer区域产生重做项
- 如果用户发出了commit,oracle的LGWR进程就会将 redo log buffer中的内容写入到磁盘中、将undo产生的数据写入磁盘。
- 如果用户发出了checkpoint检查点指令(
alter system checkpoint
),oracle的DBWn进程就会将数据块中的脏数据(数据块中修改了还没写入磁盘的数据称为脏数据)写入磁盘数据文件中
SGA
SGA(System Global Area):是Oracle中最重要的内存区域,所有用户共享。
组成:
shared pool
SQL字典区。SQL语句的解析
db buffer
数据缓冲区。数据库数据文件读到内存中的数据块
redo log buffer
重做日志区。产生的重做日志
其他区域
Java Pool、Large Pool等
SGA中发生的事情:
- SQL语句在这里被解析,生成执行计划,执行计划被共享
- 数据在这里被访问、被共享
- 重做日志在这里被产生
重做日志会很快刷到磁盘上(cpu空闲时,几乎每3秒就会刷到磁盘上)。只要重做日志被刷到磁盘上,即使内存的数据块没有被写入数据文件中,最后也可以通过重做日志进行恢复。
查看SGA参数:
sga_target:设置的SGA大小,0表示自动调整。
memory_target:11g之后才有的参数,设置oracle的内存大小,由oracle自动管理sga、pga大小
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 1G
sga_target big integer 0
SQL> show parameter memory;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 1232M
memory_target big integer 1232M
shared_memory_address integer 0
查看SGA当前大小:
Total System Global Area:SGA总大小
Fixed size:Oracle为了维护SGA区内存结构给的一个固定大小
Variable Size:Shared Pool大小
Database Buffers:数据块区域大小,有的数据库版本将该参数写作Cache Buffers
Redo Buffers:Redo大小
SQL> show parameter sgaSQL> show sga;
Total System Global Area 1071333376 bytes
Fixed Size 1375792 bytes
Variable Size 889192912 bytes
Database Buffers 176160768 bytes
Redo Buffers 4603904 bytes
PGA
单个会话私有的内存。
主要组成:
Sort Area
Order by等排序区。
当PGA的排序区不够用时,会使用临时表空间进行排序
Hash Area
Hash区,用于Hash运算
Bitmap Merge Area
位图合并区
PGA中发生的事情:
私有SQL区
私有SQL区包含了绑定变量值和运行时内存结构信息等数据。每一个运行SQL语句的会话都有一个块私有SQL区。所有提交了相同SQL语句的用户都有各自的私有SQL区,并且他们共享一个共享SQL区。因此,一个共享SQL区可能和多个私有共享区相关联。
游标和SQL区
一个Oracle预编译程序或OCI程序的应用开发人员能够很明确的打开一个游标,或者控制一个块特定的私有SQL区,将他们作为程序运行的命名资源。
会话内存
基于排序的操作(Order By、Group By、RollUp、窗口函数);
- Hash Join
- Bitmap merge
- Bitmap create
可以通过sql查询 v$process
视图来查看每个进程分配的PGA、已经使用的PGA:
-- PGA_USED_MEM、PGA_ALLOC_MEM
select * from v$process;
所以,要查看总的分配的PGA大小,可以直接对PGA_ALLOC_MEM求和:
select sum(PGA_ALLOC_MEM) from v$process;
数据库实例进程
内存和文件中的通讯等都需要通过进程。
可以通过sql查询 v$bgprocess
视图查看Oracle的所有后台进程:
select * from v$bgprocess;
SMON
SMON(System Monitor):系统监视器,后台进程。
作用:
- 实例恢复
- redo前滚
- 打开数据库
- 回滚
- 回收空间
- 释放临时表(临时段)
PMON
PMON(Process Monitor):进程监视器,后台进程。主要针对会话
作用:
- 回滚事务
- 释放锁及其他资源
- 重启死掉的调度器(在共享服务器中使用)
- 在监听器中注册服务器信息
从Oracle 9i 开始,监听器改为动态注册,即使删掉 listener.ora文件,PMON进程也可以注册服务器信息
DBWn和LGWR
DBWn(Database Writer):oracle可以启动很多DB Writer(DBW1~DBW9、DBWA~DBWz),将数据块中的脏数据写入数据文件中
LGWR(Log Writer):将内存中redo日志修改的内容(脏数据)写到磁盘上
DBWn、LGWR都是后台进程。
既然有DBWn进程将数据块的脏数据写入了数据文件,为什么还需要LGWR进程去再写一个redo日志文件?
答:数据文件中的数据都是有固定的位置的,修改的数据需要更新到指定的位置中,属于分散写,非常耗时。redo日志是一种日志文件,数据是从前往后按顺序写的,速度很快。当数据库异常宕机时,如果数据文件写入出现问题,只要redo日志正常写入了磁盘,依然可以完整的恢复数据库数据。
CKPT
CKPT(checkpoint):检查点,后台进程。
作用:
- 会启动DBWn来写脏数据(SIGNALLING DBWn at CKPT.)
- 完后会更新datafile的header和控制文件的header,而header中有同步锁需要的信息,即checkpoint的信息
- 在oracle中,正常情况下,所有文件必须同期性地同步,靠checkpoint完成。保证数据的一致性。
Server Process
Server Process:服务器进程,不是后台进程。
作用:
- 接收客户端发出的SQL请求
- 完成SQL的分析、执行计划和SQL的执行过程
专有模式下:一个客户端进程对应一个服务器进程。对客户端的响应快,但是如果客户端较多就要开很多服务器端,造成服务器很大压力。
共享模式下:实际是一个中间件,开了一个缓冲池,通过分发器把用户请求发给共享服务器,共享服务器进程可以响应很多用户,不是一对一的。可以用更少的进程服务更多的用户。生产环境中很少使用共享模式,实际中会通过weblogic等中间件构造连接池