zoukankan      html  css  js  c++  java
  • 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下一个数据库可被多个实例访问

  • 相关阅读:
    python redis操作
    subprocess模块的使用
    tcpcopy 流量复制工具
    Python名称空间与闭包
    python 偏函数
    Python面向对象的特点
    vsftpd 安装及使用虚拟用户配置
    shell 并发脚本
    Centos7 搭建LVS DR模式 + Keepalive + NFS
    python pip 升级
  • 原文地址:https://www.cnblogs.com/doclaim/p/3127913.html
Copyright © 2011-2022 走看看