Oracle 数据库体系结构

文章翻译源于 Oracle Database Database Concepts,18c

数据库服务器是现代信息系统中的一个关键组件。

通常而言,服务器能够可靠地管理多用户环境中的大量数据,为用户提供并发的数据访问。数据库服务器同时能够阻止未授权的访问,并提供有效的故障恢复方案。

数据库与实例

一个 Oracle 数据库服务器(database server)由一个数据库(database)以及至少一个数据库实例(database instance,通常简称实例)组成。正是由于实例和数据库之间的关系如此紧密,Oracle database 有时候同时表示实例和数据库。

严格来说,这些术语的意义如下:

  • 数据库(Database)

    数据库代表磁盘上的一组文件,用于存储数据。这些文件可以独立于实例而存在。

  • 数据库实例(Database instance)

    实例是一组内存结构,用于管理数据库文件。实例由一个称为系统全局区(SGA)的共享内存区域以及一组后台进程组成。实例可以独立于数据库文件而存在。

下图显示了一个数据库和它的实例。对于每个连接到实例的用户连接,客户端进程负责运行应用程序。每个客户端进程与自己的服务器进程关联。服务器进程拥有自己的私有会话内存,称为程序全局区(PGA)。

Oracle Instance and Database


图 1-1 Oracle 实例与数据库

图中 SGA 包括数据库缓冲区高速缓存(Database Buffer Cache)、重做日志缓冲区(Redo Log Buffer)、共享池(Shared Pool)、大池(Large Pool)、固定 SGA(Fixed SGA)、Java 池(Java Pool)以及流池(Streams Pool)。SGA 右边是后台进程:PMON、SMON、RECO、MMON、MMNL 等。SGA 下边也是后台进程:DBWn、CKPT、LGWR、ARCn 以及 RVWR。再往下是 PGA 和服务器进程。服务器进程和客户端进程相互连接。客户端进程右边是数据库文件(数据文件、控制文件以及在线重做日志)、归档重做日志以及闪回日志。

虽然严格来说,一个 Oracle 数据库就是一组物理结构(文件和内存结构),应用程序可以与一个物理数据库中的多个逻辑数据库进行交互,也可以与跨越多个物理数据库的一个逻辑数据库进行交互。

本节包含以下主题:

  • 多租户体系结构
  • 分片系统结构

多租户体系结构

多租户体系结构(multitenant architecture)使得 Oracle 数据库能够成为一个多租户容器数据库(CDB)。

一个非 CDB 表示传统的 Oracle 数据库,不能包含可插拔数据库(PDB)。一个 CDB 表示一个物理数据库,可以包含零个、一个或者多个用户创建的可插拔数据库。一个可插拔数据库(PDB)是一个包含模式、模式对象以及非模式对象的可移动的集合,对于 Oracle Net 客户端而言,它就像一个传统的非 CDB。

注意:CDB 与 非 CDB 的体系结构不同,除非特定指出,本手册主要介绍非 CDB 的体系结构。

多租户体系结构的优势

多租户体系结构解决了传统的非 CDB 结构带来的诸多问题。

大型企业往往需要成百上千个数据库,它们通常运行在许多物理服务器中的不同平台之上。现代服务器能够处理更多的负载。数据库可能只利用了一部分的服务器硬件能力。这种方式即浪费了硬件,又浪费了人力。

多租户体系结构通过将不同计算机上的多个物理数据库进行合并,整合为单个计算机上的单个数据库,带来了以下优势:

  • 降低了硬件成本
  • 更加简单快速地移动数据和代码
  • 更加简单地管理和监控物理数据库
  • 数据和代码的分离
  • 管理员职责分离,PDB 管理员值管理授权的 PDB,CDB 管理员管理整个 CDB

同时,也为可管理性带来了以下优势:

  • 通过 PDB 的插拔操作,数据和代码的升级更加简单
  • 测试更加简单,在开发环境中使用 PDB,测试完成后将它们插入到生产环境中的 CDB
  • 支持将单个 PDB 闪回到之前的 SCN
  • 允许在 PDB 级别设置内存和 I/O 的性能限制
  • 能够在一个应用容器(application container)内安装、升级和管理一个总体的应用(application),应用容器包含一组插入到应用根容器(application root)中的 PDB。

数据库合并

数据库合并(Database consolidation)是将一个或多个非 CDB 中能够的数据迁移到一个 CDB 中的一般过程。

从 Oracle Database 12c 开始,创建数据库时必须指定创建 CDB 还是非 CDB。可以将一个传统的非 CDB 作为 PDB 插入到 CDB 中。PDB/非 CDB 兼容性保证意味着对于使用 Oracle Net 进行连接的客户端而言,PDB 和 非 CDB 一样。

下图显示了两个独立的非 CDB:hr 和 sales。每个非 CDB 位于独立的服务器,拥有各自的内存和数据库文件。每个非 CDB 拥有专用的应用程序。

Non-CDBs


图 1-2 非 CDB

接下来是合并到一个叫做 MYCDB 的容器数据库之后的结构图。

Consolidation of Non-CDBs into a CDB


图 1-3 合并非 CDB 到 CDB

从物理上来说,MYCDB 是一个 Oracle 数据库。 MYCDB 拥有一个数据库实例(在 Oracle Real Application Clusters 环境中可以存在多个实例)以及一组数据库文件,这些和非 CDB 一样。

MYCDB 包含两个 PDB:hrpdb 和 salespdb。如图 1-3 所示,这些 PDB 对于它们的应用程序而言,与合并之前没无差别。管理 CDB 或者其中的任何 PDB 时,CDB管理员可以连接到 CDB 根容器(root),它包含了一组模式、模式对象以及非模式对象的集合,所有的 PDB 都属于该容器。

应用容器

从 Oracle Database 12c Release 2 (12.2) 开始,用户可以创建应用容器(application container),用于存储一个或多个应用模型(application model)的数据和元数据。

应用(也称为应用模型)是存储在应用根容器(application root)中,一个命名的版本化的公共数据和元数据集合。例如,应用模型可以包含表、视图、用户帐户以及PL/SQL 包的定义,这些公共对象为一组 PDB 所共享。

某种程度而言,一个应用容器就是 CDB 中与某个应用相关的 CDB。应用容器和 CDB 一样可以包含多个应用 PDB,并且共享 PDB中 的数据和元数据。

例如,一个 SaaS 部署可以使用多个应用 PDB,每个客户分配一个 PDB,它们共享应用的数据和元数据。比如,下图中 sales_app 是应用根容器中的应用模型。应用 PDB cust1_pdb 只包含客户 1 的销售数据,cust2_pdb 只包含客户 2 的销售数据。可以针对单独的客户 PDB 执行插入、拔出、复制以及其他的 PDB 级别的操作。

SaaS Use Case


图 1-4 SaaS 案例

分片系统结构

Oracle 分片(Sharding)是一种数据库扩展技术,它基于跨数据库的水平数据分区。对于应用程序而言,这些分片的数据库整体就像是一个逻辑上的数据库。

Sharding 对于 OLTP 应用主要的好处包括线性可扩展性、故障隔离以及地理数据分布。Sharding 非常适合云端部署。与支持分片的 NoSQL 数据存储不同的是,Oracle Sharding 既提供了分片的优势,同时又不需要牺牲企业级 RDBMS 的功能。

在分片体系结构中,每个数据库都位于专用的服务器上,用于各自的本地资源:CPU、内存、闪存或者磁盘。其中的每个数据库都是一个分片(shard)。所有的分片共同组成一个逻辑的数据库,称为分片数据库(SDB)。

水平分区将数据库中的表分割到各个分片中,每个分片包含相同的列,以及数据行的不同子集。以这种方式分割的表被称为分片表(sharded table)。

下图显示了一个被三个节点水平分割的分片表。

Horizontal Partitioning of a Table Across Shards


图 1-5 跨分片的水平分区表

一种使用场景就是跨多个物理数据库分布式存储客户的帐户数据。例如,ID 为 28459361 的客户需要查找他的记录。下图显示了一种可能的架构。客户的请求通过一个连接池进行路由,sharding directors(网络监听器)将该请求分发到合适的分片, 该分片包含了该客户的所有数据。

Oracle Sharding Architecture


图 1-6 Oracle 分片体系结构

数据库存储结构

数据库可以从物理角度和逻辑角度进行分析。

物理数据是从操作系统层面可见的数据。例如,操作系统工具如 Linux 下的 ls 和 ps 能够显示数据库文件和进程。逻辑数据,例如表,只对数据库而言具有意义。SQL 语句能够查看 Oracle 数据库中的表,但是操作系统工具无法查看。

数据库存储物理结构和逻辑结构。由于物理结构和逻辑结构相互独立,用户可以管理数据的物理存储,而不会影响逻辑存储结构的访问。例如,重命名一个数据库文件不会修改存储在文件中的表的名称。

物理存储结构

数据库的物理结构是指存储数据的文件。

当管理员执行一个 CREATE DATABASE 语句时,将会创建一些文件:

  • 数据文件

    每个数据库包含一个或多个物理数据文件(data file),它们存储了数据库中所有的数据。数据库逻辑结构中的数据,例如表和索引,存储在这些物理文件中。

  • 控制文件

    每个 Oracle 数据库包含一个控制文件(control file)。控制文件中存储了描述数据库物理结构的元数据,包括数据库名称以及数据库文件的名称和位置。

  • 在线重做日志文件

    每个数据库包含一个在线重做日志(online redo log),它包含两个或更多在线重做日志文件组。在线重做日志由重做日志项(也称为重做日志记录)组成,其中记录了针对数据的所有变更。

除此之外,还有一些其他的文件,对于 Oracle 数据库也非常重要。其中包括参数文件和网络配置文件。备份文件和归档日志文件是一些离线的文件,对于备份和恢复至关重要。

逻辑存储结构

逻辑存储结构使得 Oracle 数据库能够对磁盘的使用进行细粒度控制。

逻辑存储结构包括:

  • 数据块

    从最细粒度来说,Oracle 数据库中的数据存储在数据块(data block)中。一个数据块对应于磁盘上的特定数量的字节。

  • 一个区(extent)是逻辑上连续的一定数量的数据块,通过一次分配获取,用于存储特定类型的信息。

  • 段(segment)是为用户对象(例如表或索引)、回滚数据或者临时数据分配的一组区。

  • 表空间

    一个数据库逻辑上由多个表空间(tablespace)组成。表空间是段的逻辑容器。每个表空间至少包含一个数据文件。

数据库实例结构

Oracle 数据库通过一些内存结构和进程来管理和访问数据库。所有的内存结构都位于数据库服务器的主存中。

当应用程序连接到 Oracle 数据库时,它们实际上是连接到数据库的实例上。实例为连接分配 SGA 之外的其他内存区域,并且启动后台进程之外的其他服务器进程。

Oracle 数据库进程

进程(process)是操作系统中能够执行一系列操作的机制。某些操作系统使用其他的术语,包括作业(job)、任务(task)或者线程(thread)。

在本节内容中,线程等价于进程。一个 Oracle 数据库实例包含以下进程:

  • 客户端进程

    这些进程用于运行应用程序代码或者 Oracle 工具。通常客户端进程来自于多个不同的计算机。

  • 后台进程

    这些进程代替 Oracle 服务器进程完成各种数据库操作。后台进程异步地执行 I/O 操作,并且监控其他 Oracle 数据库进程,提供了更高的并发,获得了更好的性能和可靠性。

  • 服务器进程

    这些进程用于和客户端进程通信,并且和 Oracle 数据库进行交互,完成各种请求操作。

Oracle 进程包括服务器进程(server process)和后台进程(background process)。在大多数情况下,Oracle 进程和客户端进程运行在不同的计算机上。

实例内存结构

Oracle 数据库为程序代码、数据共享以及用户私有数据区域创建不同的内存结构。

数据库实例涉及以下内存结构:

  • 系统全局区(SGA)

    SGA 是一组共享的内存结构,包含了一个数据库实例的数据和控制信息。SGA 组件包括数据库缓冲区高速缓存(database buffer cache)和共享的 SQL 区域等等。从 Oracle Database 12c Release 1 (12.1.0.2) 开始, SGA 可以包含一个可选的内存列存储(IM 列存储),支持数据在内存中按照列的方式存储。

  • 程序全局区(PGA)

    PGA 是一个内存区域,用于存储服务器进程或后台进程的数据和控制信息。只有所属的进程才能够访问相应的 PGA。每个服务器进程和后台进程都拥有自己的 PGA。

应用及网络体系结构

为了充分利用计算机系统或网络的能力,Oracle 数据库将整个处理流程划分为数据库服务器和客户端程序两部分。运行 RDBMS 的计算机完成数据库服务器的职责,运行应用程序的计算机负责解释和显示数据。

应用体系结构

应用体系结构(application architecture)是指连接到 Oracle 数据库的应用程序所在的计算环境。两种最常见的数据库体系结构就是客户端/服务器(C/S)和多层结构。

  • 在客户端/服务器结构中,客户端发起一个操作请求到数据库服务器。

    服务器运行 Oracle 数据库软件,完成并发的共享数据访问操作。服务器接收并处理客户端的请求。

  • 在传统的多层结构中,一个或者多个应用服务器承担一部分数据操作。

    应用服务器(application server)包含大量业务量逻辑,为客户端提供数据访问,并且执行一些查询的处理工作。这种方式下,数据库的负载得以减轻。应用服务器可以作为客户端和各种数据库之间的接口,并且提供多一层的安全。

面向服务架构(SOA)是一种多层体系结构,应用的功能封装在服务中。SOA 服务通常作为 Web services 来实现。Web services 可以通过 HTTP 进行访问,采用基于 XML 的标准发送数据,例如网络服务描述语言(WSDL)和 SOAP。

Oracle 数据库可以在传统的多层结构或 SOA 环境中扮演一个 Web service 提供者。

Oracle 网络体系结构

Oracle 网络服务(Oracle Net Services)是数据库和网络通信协议之间的一个接口,支持分布式处理和分布式数据库。

通信协议定义了数据在网络上传输和接受的方式。Oracle 网络服务支持所有主要的网络协议,包括TCP/IP、HTTP、FTP 以及 WebDAV。

Oracle Net 是 Oracle 网络服务的一个组件,用于建立和维护客户端与数据库服务器之间的网络会话。在网络会话建立之后,Oracle Net 继续扮演客户端应用和数据库服务器之间的数据信使,为它们完成信息的交换。Oracle Net 之所以能够完成这些操作,是因为它存在于网络中的每个计算机之上。

一个重要的网络服务组件就是 Oracle Net Listener(称为监听器),它是一个位于数据库服务器或者网络中其他位置的进程。客户端应用将连接请求发送到监听器,监听器管理这些数据库请求。连接建立之后,客户端与数据库直接进行通信,不再通过监听器。

最常见的Oracle 数据库服务配置方式包括:

  • 专用服务器模式

    每个客户端进程连接到一个专用的服务器进程。服务器进程在客户端会话期间不被任何其他客户端共享。每个新的会话都会分配一个专用的服务器进程。

  • 共享服务器模式

    数据库为多个会话创建一个共享服务器进程池。客户端进程与调度器(dispatcher)进行通信,它支持多个客户端连接到同一个数据库实例,而不需要为每个客户端分配一个专用的服务器进程。

相关文章

文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符...
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远...
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语...
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseErr...
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Or...
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点...