oracle 数据库与实例
数据库(物理概念)
指物理存在的各种数据库相关的文件或磁盘的集合,参数文件、控制文件、数据文件、重做日志文件等
采用ASM (Automic Storage Management) 或 RAW设备作为存储时可能不作为操作系统中可见的的文件
但仍然属于该定义
实例(逻辑概念)
一组Oracle后台进程 + 一个公共的内存区域 = 实例
一组后台进程:
指在数据库运行阶段实际对数据进行操作的进程
如将数据从缓存区写到磁盘时由ora_dbw0_<ORACLE_SID>进程完成
将数据日志由缓存区写到磁盘时由ora_lgwr_<ORACLE_SID>进程完成
此外还有系统监控、检查点等进程
这些进程对用户不可见,用户对数据的操作由服务器进程与其通信完成
在linux下用ps -aef | grep ORACLE_SID可直接看到这些进程
但由于windows是一个进程包含多个线程这些并不能直接在任务管理器中看到,可用线程查看器查看指定进程下的线程才能看到
SQL> !ps -aef | grep orcl
oracle 3887 1 0 11:56 ? 00:00:00 ora_pmon_orcl
oracle 3889 1 0 11:56 ? 00:00:00 ora_psp0_orcl
oracle 3891 1 0 11:56 ? 00:00:02 ora_mman_orcl
oracle 3893 1 0 11:56 ? 00:00:01 ora_dbw0_orcl
oracle 3895 1 0 11:56 ? 00:00:02 ora_lgwr_orcl
oracle 3897 1 0 11:56 ? 00:00:01 ora_ckpt_orcl
oracle 3899 1 0 11:56 ? 00:00:09 ora_smon_orcl
oracle 3901 1 0 11:56 ? 00:00:00 ora_reco_orcl
oracle 3903 1 0 11:56 ? 00:00:01 ora_cjq0_orcl
oracle 3905 1 0 11:56 ? 00:00:03 ora_mmon_orcl
oracle 3907 1 0 11:56 ? 00:00:00 ora_mmnl_orcl
oracle 3909 1 0 11:56 ? 00:00:00 ora_d000_orcl
oracle 3911 1 0 11:56 ? 00:00:00 ora_s000_orcl
oracle 3931 3883 0 11:56 ? 00:00:07 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 3934 1 0 11:56 ? 00:00:00 ora_arc0_orcl
oracle 3936 1 0 11:56 ? 00:00:05 ora_arc1_orcl
oracle 3940 1 0 11:56 ? 00:00:00 ora_qmnc_orcl
oracle 3962 1 0 11:57 ? 00:00:00 ora_q000_orcl
oracle 3964 1 0 11:57 ? 00:00:00 ora_q001_orcl
oracle 4997 1 0 12:20 ? 00:00:00 ora_j000_orcl
一个公共的内存区域:
指在实例启动时读取参数文件设定的值而产生的一个内存结构
可以在启动后用alter system命名修改,如采用spfile文件方式存取参数文件,则会同步修改参数文件对应值
下次启动时则按修改后的值分配内存,但彩用init文件方式的则还要手动修改参数文件
这个内存结构与实例是一对一关系,一个实例都且只有一个这样的内存结构
具体作用就是将该结构划分成多个内存块,每个内存块都缓存着不同作用的数据,因为操作内存比硬盘快很多,
所以对数据的操作都会先经过
用户查询数据 -> 查询内存中是否存在 -> 存在直接从内存中读取
用户查询数据 -> 查询内存在是否存在 -> 不存在读从磁盘读取 ->存入内存块
用户修改数据跟上面流程类似,总之对磁盘操作之前都会先经过内存结构中的区域
如果没有这个内存结构,那数据的操作都直接与磁盘交互,不仅IO无法承受,而且这样频繁无序的写磁盘,势必直接造成磁盘性能变差,寿命变短,所以我对其存在的直接理解就是: 提高数据读写效率
经过上面的分析,对实例(Instance) = 内存结构(Memory Struct) + 后台进程(Background Process) 的理解就更深一步了
为什么要每个实例要有个内存结构?
就是为了提高数据读写效率而设定的一个大型的内存区域,否则岂不是要实时与磁盘交互?
为什么要有后台进程
数据最终还是要存到磁盘上,所以需要有不同的进程将不同内存片段按某个条件批量写进磁盘
如数据写进程:ora_dbw0_<ORACLE_SID>
日志写进程:ora_lgwr_<ORACLE_SID>
对实例的运行状态监控:ora_pmon_<ORACLE_SID>
检查点进程:ora_pmon_<ORACLE_SID>
以及一些附属的进程
为什么叫实例
有了对后台进程与内存结构的理解,实例只是oracle中将上述两者的统称,其只是一个称呼,其本身并没有任何功能
真正干活的是进程与内存结构两弟兄
实例与数据库关系
相当于Linux中的挂载点与被挂载的文件系统一样,实例挂载数据库
一般实例与数据库是1:1的关系,但在RAC下一个数据库可被多个实例访问