关系型数据库介绍
数据库管理系统(DBMS)
数据库管理系统(DBMS)是一种控制数据的存储、组织和检索的软件。
通常,DBMS具有以下元素:
- Kernel code 内核代码:这段代码可管理DBMS的内存和存储空间。
- Repository of metadata 元数据存储库:这个存储库通常被称为数据字典。
- Query language 查询语言:这种语言使应用程序能够访问数据。
关系模型(Relational Model)
E.F.Codd在他1970年的开创性论文中定义了一个基于数学集理论的关系模型–“A Relational Model of Data for Large Shared Data Banks”,就是今天最被广泛接受的数据库模型是关系模型。
关系数据库是符合关系模型的数据库。该关系模型主要有以下几个方面:
- Structures 结构:定义良好的对象可存储或访问数据库的数据。
- Operations 操作:明确定义的操作使应用程序能够操作数据库的数据和结构。
- Integrity rules 完整性规则:完整性规则管理对数据库的数据和结构的操作。
表是以行(元组,tuples)和列(属性,attributes)形式的关系的二维表示。表中的每一行都有相同的列集。关系数据库是在关系(表)中存储数据的数据库。例如,关系数据库可以在员工表、部门表和工资表中存储有关公司员工的信息。
关系数据库管理系统(RDBMS)
关系模型是关系数据库管理系统(RDBMS)的基础。RDBMS会将数据移动到数据库中,存储这些数据,并检索这些数据,以便应用程序可以操作这些数据。
Oracle数据库是一个RDBMS。一个实现面向对象特性的RDBMS,如用户定义的类型、继承和多态性,被称为对象化数据库管理系统(ORDBMS, object-relational database management system)。Oracle数据库已经将关系模型扩展到对象-关系模型,这使得在关系数据库中存储复杂的业务模型成为可能。
Oracle数据库简史
Oracle数据库发展中的亮点:
- 甲骨文公司成立:1977年,拉里·埃里森( Larry Ellison)、鲍勃·米纳(Bob Miner)和埃德·奥茨(Ed Oates)创办了咨询软件开发实验室(Software Development Laboratories),后来成为关系软件公司(RSI)。1983年,RSI成为甲骨文系统公司(Oracle Systems Corporation),后来又成为甲骨文公司( Oracle Corporation)。
- 第一个商用的RDBMS:1979年,RSI推出了Oracle V2(version 2),作为第一个基于sql的商业化RDBMS,这是关系数据库历史上具有里程碑意义的事件。
- 可移植版本的Oracle数据库:1983年发布的Oracle Version 3是第一个在大型机、小型计算机和个人电脑上运行的关系数据库。该数据库是用C语言编写的,从而使该数据库可以被移植到多个平台上。
- 对并发性控制、数据分发和可扩展性的增强:Version 4引入了多版本的读取一致性。Version 5,于1985年发布,支持客户端/服务器(client/server)计算和分布式数据库系统。Version 6对磁盘I/O、行锁定、可伸缩性以及备份和恢复进行了增强。此外,Version 6还引入了PL/SQL语言的第一个版本,这是对SQL的专有过程扩展。
- PL/SQL存储程序单元:1992年发布的Oracle7引入了PL/SQL存储过程和触发器。
- 对象(Objects)和分区(partitioning):Oracle8于1997年作为对象-关系数据库发布,支持许多新的数据类型。此外,Oracle8还支持对大表的分区。
- 互联网计算:1999年发布的Oracle8i数据库提供了对互联网协议的本地支持和对Java的服务器端支持。Oracle8i是为互联网计算而设计的,使数据库能够部署在多层环境中。
- Oracle Real Application Clusters (Oracle RAC):Oracle9i数据库在2001年引入了Oracle RAC,使多个实例能够同时访问单个数据库。此外,Oracle XML数据库(Oracle XML DB)还引入了存储和查询XML的能力。
- 网格计算(Grid computing):Oracle数据库10g在2003年引入了网格计算。这个版本使组织能够通过构建基于低成本商品服务器的网格基础设施来虚拟化计算资源。一个关键目标是使数据库进行自我管理和自我调优。Oracle自动存储管理(Oracle ASM)通过虚拟化和简化数据库存储管理,帮助实现了这一目标。
- 可管理性、可诊断性和可用性:2007年发布的Oracle数据库11g引入了一系列新特性,使管理员和开发人员能够快速适应不断变化的业务需求。适应性的关键是通过整合信息和尽可能使用自动化来简化信息基础设施。
- 插入云计算:Oracle数据库12c发布于2013年,是为云而设计的,具有新的多租户架构、内存列存储(In-Memory column store)和支持JSON文档。Oracle数据库12c帮助dba更有效地利用他们的IT资源,同时继续降低成本和提高最终用户的服务水平。
- 集成和内存性能:Oracle数据库18c简化了与目录服务的集成,如微软活动目录(Microsoft Active Directory)。它还引入了利用内存的功能,不仅为柱状数据模型,而且为高速行访问。
- 增强稳定性:Oracle数据库19c是Oracle数据库12c(12.2版)系列产品的长期支持版本。这个版本的一个主要焦点是稳定性。Oracle数据库19c还引入了对JSON和活动数据保护等特性的一些小但重要的改进。
Schema对象
在Oracle数据库中,数据库模式是逻辑数据结构或模式对象的集合。数据库用户拥有一个数据库模式,其名称与用户名相同。
Schema对象是用户创建的结构,它直接引用数据库中的数据。数据库支持许多类型的模式对象,其中最重要的是表和索引。
Schema对象只是数据库对象的一种,类似profiles和roles数据库对象并不在schema中。
表 Tables
一个表描述了一个实体。
索引 Indexes
索引是可在表的一个或多个列上创建的可选数据结构。索引可以提高数据检索的性能。
索引在逻辑上和物理上都是独立于数据的。因此,删除或创建索引,而不影响表或其他索引。在删除索引后,所有应用程序都将继续运行。
数据访问
Structured Query Language(SQL)
SQL功能:
- 查询数据
- 插入、更新和删除表中的行
- 创建、替换、修改和删除对象
- 控制对数据库及其对象的访问
- 保证数据库的一致性和完整性
Oracle SQL是ANSI标准的一个实现。OracleSQL支持许多超出标准SQL范围的特性。
PL/SQL 和Java
PL/SQL是对Oracle SQL的程序性扩展。
PL/SQL的一个主要好处是能够在数据库本身中存储应用程序逻辑。PL/SQL过程(procedure)或函数(function)是一个模式(schema)对象,它由一组SQL语句和其他PL/SQL构造组成,它们分组在一起,存储在数据库中,并作为一个单元运行,以解决特定问题或执行一组相关任务。服务器端编程的主要好处是,内置的功能可以部署在任何地方。
Oracle数据库还可以存储用Java编写的程序单元。
事务管理
Oracle数据库被设计为一个多用户数据库。数据库必须确保多个用户可以同时工作,而不会损坏彼此的数据。
事务 Transactions
事务是一个包含一个或多个SQL语句的逻辑原子工作单元。
数据并发 Data Concurrency
多用户RDBMS的一个要求是对数据并发性的控制,即由多个用户同时访问同一数据。
如果没有并发控制,用户可能会不正确地更改数据,从而损害数据的完整性。
Oracle数据库使用锁来控制对数据的并发访问。锁是一种防止访问共享资源的事务之间的破坏性交互的机制。锁有助于确保数据的完整性,同时允许对数据进行最大限度的并发访问。
数据一致性 Data Consistency
在Oracle数据库中,每个用户必须看到数据的一致视图,包括用户自己的事务和其他用户提交的事务所做的可见更改。
Oracle数据架构
一个Oracle数据库服务由一个database和至少一个instance组成。
Database和Instance
Database
数据库是位于磁盘上的存储数据的一组文件。这些文件可以独立于数据库实例而存在。
Instance
实例是管理数据库文件的一组内存结构。该实例由一个称为系统全局区(SGA,system global area)的共享内存区域和一组后台进程组成。一个实例可以独立于数据库文件而存在。
下图显示了一个数据库及实例:

对连接到实例的每个用户,其应用程序以一个客户端进程运行。 每个客户端进程都与它自己的服务器进程相关联。服务器进程有它自己的私有会话内存,称为程序全局区(PGA,program global area)。
虽然严格意义上的Oracle数据库是一组物理结构(文件和内存结构),但应用程序可以与单个物理数据库中的多个逻辑数据库进行交互,或者也可以与分布在多个物理数据库中的单个逻辑数据库进行交互。
Multitenant(多租户)结构
多租户体系结构使Oracle数据库能够成为多租户容器数据库(CDB,container database)。
CDB是包含零、一个或多个用户创建的可插拔数据库的单一物理数据库。可插入数据库(PDB, pluggable database)是模式(schema)、模式对象(schema objects)和非模式对象(nonschema objects)的可移植集合,它们在Oracle Net客户端中显示为非CDB。
多租户体系结构的好处
大型企业可能使用数百或数千个数据库,通常运行在多个物理服务器上的不同平台上。现代服务器能够处理比以前更重的工作负载。数据库可能只使用服务器硬件容量的一小部分。这种方法同时浪费了硬件和人力资源。通过将不同计算机上的多个物理数据库合并到单台计算机上的单个数据库中,多租户体系结构提供了以下好处:
- 降低硬件成本
- 更容易和更快速的移动的数据和代码
- 更容易地管理和监控物理数据库
- 数据和代码的分离
- 仅管理自己被授予特权的PDB的PDB管理员和管理整个CDB的CDB管理员之间的职责分离
对于管理的好处:
- 通过拔出和插入pdb,更容易升级数据和代码
- 在将pdb插入生产CDB之前,使用它们进行开发,更容易进行测试
- 能够闪回单个PDB到以前的SCN
- 能够在PDB级别上设置内存和I/O的性能限制
- 能够在应用程序容器中安装、升级和管理主应用程序的定义,应用程序容器是插入到公共应用程序根目录中的一组pdb
数据库整合(Database Consolidation)
数据库整合是将数据从一个或多个非cdb移动到一个CDB中的一般过程。
从Oracle数据库12c中开始,必须创建一个作为CDB或非CDB的数据库。可以将传统的非CDB作为PDB插入到CDB中。PDB/非CDB兼容性保证( PDB/non-CDB compatibility guarantee)意味着PDB的行为与从与Oracle Net连接的客户端中所看到的非CDB的行为相同。
下图显示了两个独立的非cdbs:hr和sales。每个非CDB都有自己的内存和一组数据库文件,并驻留在自己的计算机上。每个非CDB都有自己的专用用户应用程序。

下图显示了合并到名为MYCDB的CDB后的相同数据。

在物理上,MYCDB是一个Oracle数据库。MYCDB有一个数据库实例,尽管在Oracle RAC中可能有多个实例,以及一组数据库文件,就像一个非CDB文件一样。
MYCDB包含两个pdb:hrpdb和销售pdb。如上图所示,这些pdb在各自的应用程序中出现与数据库整合之前一样。要管理CDB本身或其中的任何PDB,CDB管理员可以连接到CDB根目录,CDB根目录是所有PDB所属的模式、模式对象和非模式对象的集合。
应用程序容器(Application Containers)
从Oracle数据库12.2开始,应用程序容器是一个可选的、用户创建的容器,用于存储一个或多个应用程序模型的数据和元数据。
应用程序(也称为应用程序模型)是存储在应用程序根目录中的一组已命名的、版本化的公共数据和元数据。例如,应用程序模型可能包括一组pdb中常见的表、视图、用户帐户和PL/SQL包的定义。
在某些方面,应用程序容器充当CDB中特定于应用程序的CDB。一个应用程序容器,如CDB本身,可以包括多个应用程序pdb,并使这些pdb能够共享元数据和数据。
例如,SaaS部署可以使用多个应用程序pdb,每个pdb都用于一个单独的客户,它们共享应用程序元数据和数据。例如,在下图中,sales_app是应用程序根目录中的应用程序模型。名为cust1_pdb的应用程序PDB只包含客户1的销售数据,而名为cust2_pdb的应用程序PDB只包含客户2的销售数据。可以为单个客户的pdb提供插拔、取消插拔、克隆和其他pdb级的操作。

关于多租户的概念可以查看《 Multitenant Administrator’s Guide》这本书。
Sharding(分片)结构
Oracle Sharding技术是一种基于跨多个Oracle数据库对数据进行水平划分的数据库扩展技术。应用程序将数据库池视为一个单一的逻辑数据库。
在分片体系结构中,每个数据库都托管在一个专用的服务器上,并有它自己的本地资源——CPU、内存、闪存或磁盘。这种配置中的每个数据库都被称为分片(shard)。所有的分片一起组成一个逻辑数据库,这被称为分片数据库(sharded database)。
水平分区涉及将数据库表分割为分片,以便每个分片包含具有相同列但不同行子集的表。以这种方式分割的表也被称为分片表(sharded table)。
下图显示了一个在三个分片上水平分割的分片表。

关系Oracle Sharding的概念可以查看《using Oracle sharding》这本书。
数据库存储结构
一个数据库可以从物理和逻辑的角度来考虑。
物理数据是可在操作系统级别上查看的数据。例如,Linux ls和ps等操作系统实用程序可以列出数据库文件和进程。像表这样的逻辑数据只对数据库有意义。SQL语句可以列出Oracle数据库中的表,但操作系统实用程序不能。
物理存储结构
物理数据库结构是存储数据的文件。
在执行CREATE DATABASE 语句时,将创建以下文件:
- Data files 数据文件:每个Oracle数据库都有一个或多个物理数据文件,其中包含所有的数据库数据。逻辑数据库结构的数据,如表和索引,被物理上存储在数据文件中。
- Control files 控制文件:每个Oracle数据库都有控制文件。控制文件包含指定数据库的物理结构的元数据,包括数据库名称以及数据库文件的名称和位置。
- Online redo log files 在线重做日志文件:每个Oracle数据库都有在线重做日志,这是两个或多个在线重做日志文件。在线重做日志由重做项(也称为重做日志记录)组成,它记录对数据所做的所有更改。
许多其他文件对于Oracle数据库服务器的功能非常重要。这其中包括参数文件(parameter files)和网络文件(networking files)。备份文件(backup files)和已存档的重做日志文件(archived redo log)是对备份和恢复非常重要的脱机文件。
逻辑存储结构
逻辑存储结构使Oracle数据库能够对磁盘空间的使用进行细粒度的控制。
Oracle 中有下列逻辑存储结构:
- Data blocks 数据块:Oracle 数据库中最小的访问单元。一个数据块对应于磁盘上特定数量的字节。
- Extents 区:区是在单个分配中获得的特定数量的逻辑上连续的数据块。
- Segments 段:段是为用户对象(例如,表或索引)、撤销数据(undo data)或临时数据(temporary data)分配的一组区段。
- Tablespace 表空间:表空间是数据段的逻辑容器。每个表空间都至少由一个数据文件组成。
数据库实例结构
Oracle数据库使用内存结构(memory structures)和进程(process)来管理和访问该数据库。
数据库进程(Oracle Database Processes)
进程是操作系统中可以运行一系列步骤的一种机制。一些操作系统使用术语作业(job)、任务(task)或线程(thread)。
Oracle数据库实例具有以下类型的进程:
- Client processes 客户端进程:创建和维护这些进程是为了运行应用程序或Oracle工具的软件代码。
- Background processes 后台进程:这些进程合并了一些功能,否则将由为每个客户端进程运行的多个Oracle数据库程序来处理。后台进程异步地执行I/O和监视其他Oracle数据库进程,以提供更高的并行性,以获得更好的性能和可靠性。
- Server processes 服务器进程:这些进程与客户端进程进行通信,并与Oracle数据库进行交互,以满足请求。
Oracle进程包括服务器进程和后台进程。在大多数环境中,Oracle进程和客户机进程都会在不同的计算机上运行。
内存结构(Instance Memory Structures)
Oracle数据库创建并使用内存结构来存储程序代码、用户之间共享的数据以及每个连接用户的私有数据区域。
数据库实例包含下列内存结构:
- System Global Area (SGA):SGA是一组共享的内存结构,其中包含一个数据库实例的数据和控制信息。
- Program Global Areas (PGA):PGA是一个包含服务器或后台进程的数据和控制信息的内存区域。对PGA的访问是进程专用的。每个服务器进程和后台进程都有自己的PGA。
应用程序和网络架构
为了充分利用给定的计算机系统或网络,Oracle数据库允许处理在数据库服务器和客户端程序之间进行分割。运行RDBMS的计算机处理数据库服务器的职责,而运行应用程序的计算机则处理数据的解释和显示。
应用程序(Application Architecture)
应用程序体系结构是指数据库应用程序连接到Oracle数据库的计算环境。最常见的两种数据库体系结构是客户端/服务器(C/S,Client/Server)和多层体系结构(multitier)。
Client-Server Architecture
在客户端/服务器体系结构中,客户端应用程序发起对数据库服务器上执行的操作的请求。服务端运行Oracle数据库软件,并处理并发、共享数据访问所需的功能。服务器接收并处理来自客户端的请求。
Multitier Architecture
在多层体系结构中,一个或多个应用程序服务器执行部分操作。应用程序服务器包含应用程序逻辑的大部分,为客户端提供对数据的访问,并执行一些查询处理。这样,在数据库上的负载就会减少。应用程序服务器可以作为客户端和多个数据库之间的接口,并提供额外的安全级别。
网络服务架构
Oracle网络服务是数据库和网络通信协议之间的接口,便于分布式处理和分布式数据库。
通信协议定义了在网络上传输和接收数据的方式。Oracle网络服务支持所有主要网络协议上的通信,包括TCP/IP、HTTP、FTP和WebDAV。
Oracle Net是Oracle网络服务的一个组件,它建立并维护一个从客户端应用程序到数据库服务器的网络会话。建立网络会话后,Oracle Net充当客户端应用程序和数据库服务器的数据快递员,在它们之间交换消息。Oracle Net可以执行这些作业,因为它位于网络中的每一台计算机上。
网络服务的一个重要组件是Oracle Net Listener(称为侦听器),它是一个在数据库上或网络的其他地方运行的进程。客户端应用程序向侦听器发送连接请求,侦听器管理这些请求到数据库的流量。当建立连接时,客户端和数据库直接通信。
配置Oracle数据库以服务于客户端请求的最常见的方法是:
- Dedicated server architecture 专用服务器架构:每个客户端进程都连接到一个专用的服务器进程。在客户端的会话期间,服务器进程不会被任何其他客户端共享。每个新的会话都被分配了一个专用的服务器进程。
- Shared server architecture 共享服务器架构:多个会话使用一个共享服务器进程池。客户端进程与调度程序进行通信,调度程序是一个使许多客户端能够连接到相同的数据库实例,而不需要为每个客户端提供专用的服务器进程的进程。
关于Oracle 数据库的网络结构可以参考《 Net Services Administrator’s Guide》这本书。
Oracle 文档介绍
Oracle文档分为3级(组):基本、中级(2+day系列)和高级。
基本组文档
两天内可以读完…
《database-concepts》:也就是本书,介绍Oracle数据库的一些基本概念。
《2 Day DBA 》:本手册教dba如何执行保持数据库运行所需的所有典型管理任务,包括如何执行基本的故障排除和性能监控活动。
《2 Day Developer’s Guide》:解释了如何通过SQL和PL/SQL使用Oracle数据库的基本特性。
中级组文档
针对数据库管理员有《 2 Day + Performance Tuning Guide》
针对开发者有《 2 Day + Java Developer’s Guide》
高级组文档
《 SQL Language Reference》
《Database Reference 》:描述数据库初始化参数、数据字典视图、动态性能视图、等待事件和后台进程。
《 PL/SQL Packages and Types Reference》
数据库管理员
《 Database Administrator’s Guide》:说明如何执行如创建和配置数据库、维护和监视数据库、创建模式对象、调度作业和诊断问题等任务。
《 Database Security Guide》:描述了如何通过使用默认的数据库特性来为Oracle数据库配置安全性。
《 Database Performance Tuning Guide》:描述如何使用Oracle数据库工具来优化数据库性能。本指南还描述了创建数据库的性能最佳实践,并包括与性能相关的参考信息。
《 Database SQL Tuning Guide》:描述SQL处理、优化器、执行计划、SQL操作符、优化器统计信息、应用程序跟踪和SQL顾问。
《Database Backup and Recovery User’s Guide》:介绍如何备份(backup)、还原(restore)和恢复(recover)Oracle数据库,如何对数据库文件备份,以及如何在存储系统之间传输数据。
《 Real Application Clusters Administration and Deployment Guide》:解释如何安装、配置、管理和故障排除Oracle RAC数据库。
《 Multitenant Administrator’s Guide》:多租户结构的管理。
《using Oracle sharding》:Oracle Sharding的介绍。
开发者
《Database Development Guide》:本手册解释了应用程序设计的基本原理,并描述了在SQL和PL/SQL中开发的基本概念。
《 Database PL/SQL Language Reference》:描述PL/SQL语言的所有信息,包括数据类型、控制语句、集合、触发器、软件包和错误处理。
《Database Java Developer’s Guide》:描述如何在Oracle数据库中开发、加载和运行Java应用程序。
《Database SecureFiles and Large Objects Developer’s Guide》:说明如何使用大型对象(LOB)、安全文件LOB和数据库文件系统(DBFS)来开发新的应用程序。




