Oracle数据库详解:核心概念与基础介绍
引言
在当今的企业级数据管理领域,Oracle数据库无疑占据着举足轻重的地位。它以其卓越的性能、稳定性、可扩展性和安全性,成为无数大型企业、金融机构、政府部门以及互联网公司的首选数据库解决方案。然而,对于初学者或者非专业人士来说,Oracle数据库的内部机制和复杂架构可能会让人感到望而却步。
本文旨在为读者提供一个关于Oracle数据库核心概念和基础架构的详细介绍。我们将深入探讨Oracle数据库最基本、最重要的组成部分,理解它们各自的作用以及它们之间如何协同工作,从而帮助读者构建对Oracle数据库的扎实认知。无论你是数据库管理员新手、开发人员,还是对Oracle技术感兴趣的学习者,本文都将为你打开通往Oracle世界的大门。
我们将从整体架构入手,逐步深入到内存结构、进程结构、存储结构,再到数据对象、事务管理、用户权限等关键概念。通过对这些基础知识的梳理和讲解,希望读者能够更清晰地理解Oracle数据库的强大之处,并为后续的学习和实践打下坚实的基础。
第一章:Oracle数据库概述
1.1 什么是Oracle数据库?
Oracle数据库,由甲骨文公司(Oracle Corporation)开发,是一个强大的、企业级的关系型数据库管理系统(RDBMS)。它基于关系模型,使用结构化查询语言(SQL)进行数据操作。与许多其他数据库系统不同,Oracle数据库以其复杂的架构和丰富的功能集著称,能够支持极其庞大的数据量、极高的并发访问以及严格的数据安全和完整性要求。
Oracle数据库不仅仅是一个存储数据的仓库,它还提供了一整套用于管理、访问和保护数据的工具和服务。这些服务包括但不限于:
- 数据存储与检索:高效地组织和存储数据,并提供快速的数据查询和操作能力。
- 事务管理:确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。
- 并发控制:允许多个用户同时访问和修改数据,而不会相互干扰或破坏数据完整性。
- 安全性:提供强大的身份验证、授权和审计机制,保护数据免遭未经授权的访问。
- 备份与恢复:提供可靠的数据备份和恢复机制,应对各种故障情况,确保业务连续性。
- 高可用性:通过集群、数据复制等技术,确保数据库服务的持续可用性。
- 可扩展性:能够随着数据量和用户负载的增长而水平或垂直扩展。
1.2 Oracle数据库的历史与市场地位
Oracle数据库的历史可以追溯到上世纪70年代末,是最早的商业化关系型数据库之一。经过几十年的发展,Oracle数据库不断演进,引入了大量创新技术,如分布式数据库、面向对象特性、互联网计算架构、自主数据库等。
凭借其全面的功能、出色的性能和可靠性,Oracle数据库在全球企业级数据库市场中长期占据领导地位,尤其在金融、电信、制造、政府等关键行业应用广泛。尽管面临来自MySQL、PostgreSQL、Microsoft SQL Server、NoSQL数据库以及云数据库服务的竞争,Oracle数据库依然凭借其强大的生态系统、成熟的技术支持和对复杂业务场景的良好适应性,保持着强大的竞争力。
1.3 Oracle数据库的关键特性
Oracle数据库之所以强大,得益于其一系列关键特性:
- 可移植性:可以在多种操作系统和硬件平台上运行。
- 标准化:高度遵循SQL标准,但也提供了PL/SQL这一强大的过程化扩展。
- 面向对象特性:支持对象-关系特性,允许在关系模型中处理复杂数据类型。
- 分区(Partitioning):将大型表或索引分解成更小的、更易于管理的部分,提高性能和可管理性。
- 并行处理(Parallelism):利用多个CPU同时执行查询和事务,加速数据处理。
- 高级安全性:提供精细的访问控制、数据加密、审计和虚拟私有数据库(VPD)等功能。
- 高级复制和数据集成:支持多种数据复制技术,如Data Guard、GoldenGate。
- 强大的工具生态:提供或支持SQL*Plus, SQL Developer, RMAN (Recovery Manager)等多种管理和开发工具。
第二章:Oracle数据库基本架构
理解Oracle数据库的核心在于理解其独特的架构。Oracle数据库的核心架构可以分为两个主要组成部分:数据库(Database)和数据库实例(Database Instance)。这两个概念密切相关,但又相互独立。
2.1 数据库(Database)
数据库是指存储在磁盘上的物理文件的集合。这些文件包含了实际的数据、控制信息以及用于恢复数据库所需的信息。一个Oracle数据库至少包含以下几种文件类型:
- 数据文件(Datafiles):存储实际的用户数据(表、索引等)以及系统数据。一个数据库可以有一个或多个数据文件,这些文件组成了数据库的逻辑存储单元——表空间(Tablespaces)。
- 控制文件(Control Files):包含数据库的物理结构信息,例如数据库名称、数据文件、重做日志文件和归档日志文件的位置和名称。它是数据库启动的关键文件,如果控制文件丢失或损坏,将无法启动数据库。
- 重做日志文件(Redo Log Files):记录所有对数据库所做的更改(事务)。这些记录用于在发生故障时恢复数据库,确保所有已提交的事务不会丢失。重做日志文件通常以组(Groups)的形式存在,每组包含一个或多个成员(Members),Oracle会循环写入这些组。
- 参数文件(Parameter File):一个文本文件(PFILE)或二进制文件(SPFILE),定义了数据库实例的配置参数,如内存大小、进程数量、文件路径等。数据库实例在启动时会读取这个文件。
除了上述核心文件,一个运行中的数据库还可能涉及其他文件,如:
- 归档重做日志文件(Archived Redo Log Files):当重做日志文件被写满并切换到下一组时,如果归档模式开启,这些已满的重做日志文件会被复制到指定的归档位置,形成归档重做日志文件。它们对于完成时间点恢复至关重要。
- 密码文件(Password File):允许通过网络以特定的管理权限(如SYSDBA, SYSOPER)连接到数据库实例,即使数据库尚未完全启动。
- 备份文件(Backup Files):通过备份工具(如RMAN)创建的文件,用于在发生故障时恢复数据库。
总而言之,数据库是存储数据的物理集合。
2.2 数据库实例(Database Instance)
数据库实例是指在数据库服务器内存中运行的一组后台进程(Background Processes)和一块共享内存区域(SGA – System Global Area)。实例是访问和操作数据库的门户。当用户或应用程序连接到Oracle数据库时,实际上是连接到正在运行的数据库实例。
一个数据库可以被多个实例同时访问(在RAC – Real Application Clusters 环境下),但通常情况下,一个单机数据库只有一个实例。
理解数据库和实例之间的关系至关重要:实例是用于访问和管理数据库的手段。没有运行中的实例,用户无法访问存储在磁盘上的数据库文件。 实例在启动时会读取参数文件,分配共享内存(SGA),并启动后台进程。它然后会找到并打开控制文件,接着是重做日志文件,最后打开数据文件,使数据库可用。当实例关闭时,它会释放SGA,终止后台进程,并关闭数据库文件。
这种架构设计的优势在于:
- 高性能:通过SGA缓存数据和执行计划,减少磁盘I/O。
- 并发性:后台进程协调多个用户请求。
- 可恢复性:通过重做日志确保事务的持久性和数据库的可恢复性。
- 灵活性:可以通过调整实例的参数来优化性能和资源使用。
第三章:实例结构:内存与进程
数据库实例是用户与数据库交互的接口,它主要由内存结构和进程结构组成。
3.1 内存结构(Memory Structures)
Oracle实例的内存结构主要包括共享内存区域(SGA)和程序全局区域(PGA)。
-
共享全局区域 (SGA – System Global Area):
SGA是一块分配在服务器内存中的、所有连接到同一个实例的用户进程都可以共享的内存区域。它是Oracle实例的核心内存组件,用于存储缓存的数据、SQL执行计划、日志信息等。SGA的大小对数据库性能有显著影响。主要组件包括:- 数据库缓存(Database Buffer Cache):缓存从数据文件中读取的数据块副本。当用户查询数据时,Oracle首先在Buffer Cache中查找;如果找到(缓存命中),则直接从内存中获取,避免了昂贵的磁盘I/O。数据块的修改也首先在这里进行。
- 共享池(Shared Pool):缓存多种共享内存结构,包括:
- 库缓存(Library Cache):存储最近执行的SQL和PL/SQL代码(解析树、执行计划)。当相同的语句再次执行时,可以直接从库缓存中获取执行计划,避免重复解析,提高效率(硬解析 vs. 软解析)。
- 数据字典缓存(Data Dictionary Cache):缓存数据库元数据,如表定义、列信息、用户信息、权限等。
- 结果缓存(Result Cache):缓存SQL查询和PL/SQL函数的结果,加速重复查询。
- 重做日志缓冲区(Redo Log Buffer):缓存所有数据库更改的重做条目。这些条目是事务日志的一部分,会周期性地由LGWR进程写入重做日志文件。这个缓冲区是循环写入的,其大小影响事务提交的速度。
- 大型池(Large Pool):一个可选的、用于大型内存分配的区域,例如:
- 共享服务器模式下的用户会话信息。
- 并行执行消息缓冲区。
- RMAN的备份和恢复操作。
它减少了Shared Pool的碎片,但并不会被所有配置共享池的参数自动占用。
- Java池(Java Pool):用于Java虚拟机(JVM)在数据库中运行时所需的内存,如Java类定义、Java session state等。
- 流池(Streams Pool):用于Oracle Streams复制和数据集成功能所需的内存。
现代Oracle数据库通常使用自动内存管理(AMM)或自动共享内存管理(ASMM),由MMAN进程自动调整SGA各组件的大小(ASMM)或SGA与PGA的总大小(AMM),以优化性能。
-
程序全局区域 (PGA – Program Global Area):
PGA是一块分配给每个服务器进程或后台进程的私有内存区域。它不被多个进程共享。PGA的内容因进程类型而异,对于服务器进程来说,主要用于存储:- 排序区域(Sort Area):执行排序操作(如ORDER BY, GROUP BY, DISTINCT, UNION, 或者合并连接Merge Join)所需的内存。
- 哈希区域(Hash Area):执行哈希连接(Hash Join)或哈希聚合(Hash Aggregation)所需的内存。
- 会话信息(Session Information):用户会话的状态变量、登录信息等。
- 游标状态(Cursor State):关于打开的游标的信息。
- 绑定变量值(Bind Variable Values):在SQL语句中使用的绑定变量的值。
与SGA不同,PGA不是共享的。Oracle提供了自动PGA管理功能,通过
pga_aggregate_target
参数来限制所有服务器进程PGA总量的上限,并由Oracle自动管理单个进程PGA的大小。
3.2 进程结构(Process Structures)
Oracle实例的进程结构主要包括用户进程、服务器进程和后台进程。
-
用户进程(User Processes):
当用户或应用程序连接到Oracle数据库时,会启动一个用户进程。例如,运行SQL*Plus客户端就是一个用户进程。用户进程负责发起数据库请求。 -
服务器进程(Server Processes):
服务器进程负责处理来自用户进程的请求。它与用户进程通信,并与Oracle实例(SGA和后台进程)交互来执行SQL语句或PL/SQL块。- 专用服务器(Dedicated Server):这是默认模式。每个连接到数据库的用户进程都有一个对应的服务器进程。这种模式简单,但当连接数很多时,会占用大量服务器资源。
- 共享服务器(Shared Server):在这种模式下,多个用户进程共享一个或少量服务器进程。用户进程连接到调度器(Dispatcher)进程,调度器将请求放入请求队列,由共享服务器进程从队列中取出请求并处理。这种模式可以支持更多连接,但增加了架构的复杂性。
-
后台进程(Background Processes):
后台进程是Oracle实例启动时启动的一组进程,它们执行维护数据库结构和操作的各种任务。这些进程持续运行,对数据库的正常运行至关重要。一些主要的后台进程包括:- 数据库写进程 (DBWn – Database Writer): 将Buffer Cache中修改过的数据块(称为“脏块”)写入数据文件。这样做是为了减少前台用户进程等待写入磁盘的时间,提高性能。通常有多个DBW进程(DBW0, DBW1, … DBW9, … DBWa-DBWj)。
- 日志写进程 (LGWR – Log Writer): 将Redo Log Buffer中的重做条目写入重做日志文件。LGWR是写重做日志的唯一进程。当用户提交事务、Redo Log Buffer达到一定阈值、DBWn进程写入数据块或每隔3秒时,LGWR会被唤醒。将重做信息尽快写入磁盘是保证数据不丢失的关键。
- 系统监视进程 (SMON – System Monitor): 执行实例恢复(如果实例异常关闭)、清理不再使用的临时段、回收未使用的自由空间等任务。
- 进程监视进程 (PMON – Process Monitor): 负责清理异常终止的用户进程所占用的资源,如回滚未提交的事务,释放锁,释放PGA内存。它还会注册实例到监听器(Listener)。
- 检查点进程 (CKPT – Checkpoint): 在数据库进行检查点时更新控制文件和数据文件头。检查点是数据库状态的一个点,表示在此点之前的所有修改都已由DBWn写入数据文件。检查点有助于加快数据库恢复速度。CKPT本身不写数据块,它只是通知DBWn写入,并更新控制文件。
- 归档进程 (ARCn – Archiver): 如果数据库以归档模式(ARCHIVELOG mode)运行,ARCn进程会将写满的重做日志文件复制到归档日志目标位置。这对于介质恢复(Media Recovery)是必需的。可以配置多个归档进程(ARC0, ARC1, 等)。
- 管理器管理进程 (MMAN – Memory Manager): 如果启用了自动内存管理(AMM),MMAN进程负责根据系统负载自动调整SGA和PGA的总大小。如果启用了自动共享内存管理(ASMM),它负责调整SGA内部各组件(如Buffer Cache, Shared Pool)的大小。
- 其他进程:还有许多其他后台进程,如
- LMON (Lock Monitor): 在RAC环境下监视全局锁。
- LCKn (Lock Process): 在RAC环境下管理实例间锁。
- MMNL (Manageability Monitor Lite): 负责将部分性能统计信息从SGA的循环缓冲区(如ASH)写入磁盘。
- DIAG (Diagnosibility Daemon): 监视操作系统和实例健康状况。
- VKT monitor (Virtual Keeper of Time monitor): 用于提供精确的时间。
理解这些进程的作用对于数据库性能优化和故障排除至关重要。
第四章:数据库结构:存储文件详解
前面提到数据库是磁盘上文件的集合。本章将更详细地介绍这些物理文件。
4.1 数据文件(Datafiles)
数据文件是存储数据库数据的物理文件。它们构成了数据库的逻辑存储结构——表空间。当创建一个表、索引或其他对象时,其数据会存储在与该对象关联的表空间所对应的数据文件中。数据文件的大小可以固定,也可以配置为自动扩展(autoextend)。数据文件可以在线(数据库打开时)或离线,也可以进行备份和恢复。
4.2 控制文件(Control Files)
控制文件是数据库中最小但最重要的文件之一。它记录了数据库的物理布局和状态信息,包括:
- 数据库名称。
- 所有数据文件、重做日志文件和归档日志文件的名称和位置。
- 创建数据库的时间。
- 当前的日志序列号(log sequence number)。
- 检查点信息。
控制文件对于数据库的启动和运行至关重要。由于其重要性,Oracle建议配置多个控制文件的副本(multiplexing control files)并存储在不同的磁盘上,以防止单点故障。当数据库启动时,实例首先需要找到并读取控制文件。
4.3 重做日志文件(Redo Log Files)
重做日志文件记录了对数据库所做的所有更改(事务记录)。这些记录是恢复数据库的“日志”或“轨迹”。它们以循环方式使用,通常分为多个组,每组包含一个或多个成员。LGWR进程负责顺序地向当前活动的重做日志文件组写入重做条目。当一个组写满后,Oracle会切换到下一个组。
重做日志文件的主要作用是:
- 实例恢复(Instance Recovery):如果数据库实例异常终止(例如服务器断电),在下次启动时,SMON进程会利用重做日志文件来前滚(roll forward)所有已提交的事务,并将未提交的事务回滚(roll back),使数据库恢复到一致状态。
- 介质恢复(Media Recovery):如果数据文件丢失或损坏,可以通过备份的数据文件和归档重做日志文件来恢复数据库到故障发生前的状态或某个时间点。
出于可靠性考虑,重做日志文件通常也需要进行多路复用(multiplexing redo log file members)到不同的磁盘上。
4.4 归档重做日志文件(Archived Redo Log Files)
当数据库运行在归档模式(ARCHIVELOG mode)下时,写满的重做日志文件会在被覆盖使用之前,由ARCn进程复制到指定的归档位置。这些复制出来的文件就是归档重做日志文件。归档日志文件与联机重做日志文件一起,构成了完整的恢复链。归档模式是进行介质恢复和时间点恢复的前提。非归档模式(NOARCHIVELOG mode)只能进行不完全恢复,可能会丢失数据。
4.5 参数文件(Parameter File)
参数文件包含了一系列初始化参数,这些参数定义了数据库实例的特性,如SGA大小、PGA目标、控制文件位置、进程数量、各种超时设置等。参数文件可以是文本格式的PFILE(Initialization Parameter File),也可以是二进制格式的SPFILE(Server Parameter File)。SPFILE是推荐使用的,因为它存储在服务器端,允许动态修改部分参数而无需重启实例,并且所有RAC实例可以共享同一个SPFILE。
4.6 密码文件(Password File)
密码文件允许拥有特定管理权限(如SYSDBA、SYSOPER)的用户在没有网络认证的情况下,通过网络连接到数据库实例,即使数据库是关闭的或处于NOMOUNT状态。这在启动、关闭或进行数据库恢复时非常有用。
第五章:逻辑存储结构
虽然数据最终存储在物理文件(数据文件)中,但Oracle数据库提供了一个逻辑存储结构层,使得管理数据更加灵活和方便。这个逻辑结构是分层的:数据块 -> 区 -> 段 -> 表空间。
5.1 数据块(Data Block)
数据块是Oracle数据库中最小的逻辑存储单元,也是最小的I/O单元。数据文件由多个Oracle数据块组成。每个数据块的大小在创建数据库时确定(通常是 4KB、8KB、16KB 或更大),并在整个数据库生命周期内保持不变。一个数据块可以包含多行数据,但一行数据不能跨越多个数据块(除非使用了特殊的存储类型如LOB)。数据块内部有复杂的结构,包括块头(header)、自由空间(free space)和行数据(row data)。
5.2 区(Extent)
区是由一系列逻辑上连续的数据块组成的空间分配单位。当需要为段(Segment)分配存储空间时,会分配一个或多个区。区是Oracle一次性分配给段的空间,以减少碎片。
5.3 段(Segment)
段是用于存储特定数据库对象(如表、索引、回滚/撤销信息、临时数据)的所有区的集合。例如,创建一个表时,Oracle会为这个表创建一个或一个或多个段,这些段包含了存储表数据的所有区。段是用于分配存储空间的基本对象。常见的段类型有:
- 数据段(Data Segments):存储表、聚簇表的数据。
- 索引段(Index Segments):存储索引的数据。
- 撤销段(Undo Segments):存储用于事务回滚和读一致性的撤销(undo)信息。它们位于撤销表空间(UNDO Tablespace)中。
- 临时段(Temporary Segments):在执行排序、哈希聚合等操作时临时存储中间数据。它们位于临时表空间(TEMPORARY Tablespace)中。
5.4 表空间(Tablespace)
表空间是数据库中逻辑存储结构的最高层。它是一个逻辑容器,用于组织段。每个表空间由一个或多个数据文件组成。一个表空间中的段存储在构成该表空间的数据文件中。通过表空间,DBA可以方便地管理存储空间,例如:
- 将不同类型的数据(如用户数据、索引、系统对象、临时数据、撤销数据)分别存储在不同的表空间中,以便于管理、备份和恢复。
- 将表空间的文件放在不同的磁盘上,以提高I/O性能。
- 对表空间进行离线、只读或脱机操作。
Oracle数据库有几个重要的默认表空间:
- SYSTEM:包含数据库的数据字典(所有对象的元数据)。它是数据库启动必需的。
- SYSAUX:SYSTEM表空间的辅助表空间,包含许多数据库特性和工具所需的数据,如AWR、Statspack、Streams、Spatial等。
- UNDO:包含撤销段,用于存储撤销信息,确保事务回滚和读一致性。
- TEMP:包含临时段,用于排序等操作。
逻辑存储结构与物理存储结构的对应关系:
表空间(逻辑)对应于一个或多个数据文件(物理)。
段(逻辑)由一个或多个区(逻辑)组成。
区(逻辑)由一系列逻辑上连续的数据块(逻辑)组成。
数据块(逻辑)最终存储在数据文件(物理)中。
这种分层结构提供了高度的灵活性和抽象性,使得DBA可以在逻辑层面管理存储,而不必直接操作底层的物理文件。
第六章:数据库对象
数据库对象是存储或引用数据或执行操作的命名结构。用户通过创建和操作这些对象来使用数据库。常见的Oracle数据库对象包括:
- 表(Table):关系型数据库中最基本的对象,用于以行和列的形式存储数据。表有名称、列名、列数据类型等定义。
- 视图(View):一个或多个表或其他视图的逻辑表示,本身不存储数据。视图是一个存储的查询,每次访问视图时,Oracle会执行其 underlying 查询来生成结果集。视图可以简化复杂查询、提供数据安全性(只显示部分列或行)以及提供数据抽象。
- 索引(Index):为了提高数据检索速度而创建的对象。索引基于表中的一个或多个列创建,类似于书的目录。当执行查询时,如果查询条件涉及索引列,Oracle可能会使用索引来快速定位所需的数据行,避免全表扫描。索引会占用存储空间,并在数据修改(插入、更新、删除)时需要维护。常见的索引类型有B树索引、位图索引等。
- 序列(Sequence):用于生成唯一数值序列的对象,通常用于生成主键值。序列独立于表,多个表可以共享同一个序列。
- 同义词(Synonym):对象的别名。同义词可以简化对象名称,或隐藏对象的真实位置(例如,通过同义词访问另一个用户的对象)。
- 过程(Procedure)和函数(Function):存储在数据库中的PL/SQL代码块。过程执行一个或一系列操作,没有返回值;函数执行计算并返回一个值。它们可以封装业务逻辑,提高代码的可重用性和安全性。
- 包(Package):相关的过程、函数、变量、常量等PL/SQL对象的集合。包提供了模块化和封装性,可以提高代码的可维护性和可管理性。
- 触发器(Trigger):与表、视图或数据库事件(如登录、启动、关闭)关联的PL/SQL代码块。当特定事件发生时,触发器会自动执行。例如,可以在插入、更新或删除表中的数据时触发一个过程,用于强制业务规则或审计。
这些对象共同构成了数据库应用程序的基础。
第七章:数据完整性与约束
数据完整性是指数据的准确性、一致性和可靠性。Oracle数据库提供了多种机制来强制数据完整性,其中最常用和核心的是约束(Constraints)。约束是在表级别定义的规则,用于限制表中允许的数据。
常见的约束类型包括:
- 主键约束(Primary Key – PK):唯一标识表中每一行的列或列组合。主键必须满足两个条件:唯一性(表中任意两行的主键值不能相同)和非空性(主键列的值不能为NULL)。一个表只能有一个主键。主键会自动在对应的列上创建一个唯一的索引。
- 外键约束(Foreign Key – FK):用于建立表之间的关系。外键是一个表中的一列或列组合,其值必须参照(引用)另一个表(称为父表或被参照表)的主键或唯一键的值。外键约束维护了参照完整性,确保不会出现指向不存在的父行的数据。
- 唯一性约束(Unique Key – UK):保证某一列或列组合中的所有值是唯一的,允许有NULL值(但通常只允许一个NULL,具体行为取决于Oracle版本和实现)。唯一性约束会自动在对应的列上创建一个唯一索引。与主键不同,一个表可以有多个唯一性约束。
- 检查约束(Check Constraint):用于强制某一列的值必须满足一个特定的条件。例如,可以定义一个检查约束,要求一个表示年龄的列其值必须大于等于0。
- 非空约束(Not Null):确保某一列的值不能为NULL。
约束是数据库设计中确保数据质量的重要手段。它们在数据插入、更新或删除时由数据库自动检查和强制执行。
第八章:事务管理
事务(Transaction)是数据库操作的一个逻辑工作单元。一个事务包含一个或多个数据库操作(如INSERT, UPDATE, DELETE, SELECT)。事务必须满足ACID特性,以保证数据的可靠性:
- 原子性(Atomicity):事务是一个不可分割的工作单元。事务中的所有操作要么全部成功执行,要么全部失败并回滚到事务开始前的状态。
- 一致性(Consistency):事务执行后,数据库从一个有效状态转换到另一个有效状态。事务不会破坏数据库的完整性约束。
- 隔离性(Isolation):多个并发执行的事务互不干扰。每个事务仿佛是在独立地访问数据,不会看到其他事务未提交的中间状态数据。Oracle通过锁机制和读一致性(Read Consistency)来实现隔离性。
- 持久性(Durability):一旦事务提交成功,其对数据库的改变就是永久性的,即使发生系统故障也不会丢失。这是通过将重做日志写入磁盘来实现的。
在Oracle中,事务的生命周期通过以下语句管理:
- COMMIT:提交当前事务。所有在事务中进行的修改被永久保存到数据库中,并对其他用户可见。同时,事务中获取的锁被释放。
- ROLLBACK:回滚当前事务。撤销事务中所有未提交的修改,使数据库回到事务开始前的状态。事务中获取的锁被释放。
- SAVEPOINT:在事务中设置一个命名点。可以回滚到某个保存点,而不是回滚整个事务。
Oracle使用UNDO数据来实现事务的回滚和读一致性。当修改数据时,Oracle会将数据的旧值写入UNDO段。如果事务回滚,Oracle就利用UNDO数据恢复旧值。并发事务读取数据时,如果发现数据正在被其他事务修改且尚未提交,Oracle会利用UNDO数据构建一个读一致性的数据视图,避免脏读。
第九章:用户、模式、权限与角色
数据库安全性是任何数据库系统的核心组成部分。Oracle数据库提供了强大的安全模型来控制谁可以访问哪些数据以及执行哪些操作。
- 用户(User):连接到Oracle数据库的账户。每个用户都有一个唯一的用户名和密码(或使用其他认证方式)。
- 模式(Schema):在Oracle中,模式与用户是紧密关联的。一个模式是数据库对象的集合,这些对象属于一个特定的用户。当一个用户创建对象(如表、视图、存储过程)时,这些对象默认存储在该用户的模式下。通常情况下,一个用户拥有一个与其用户名相同的模式。当提及”某个模式”时,通常指代的是属于某个用户的对象集合。
- 权限(Privileges):允许用户执行特定操作的权利。权限分为:
- 系统权限(System Privileges):允许用户执行数据库系统级别的操作,如创建用户、创建表、连接到数据库、备份数据库等。例如,
CREATE SESSION
(连接数据库)、CREATE TABLE
、ALTER ANY TABLE
。 - 对象权限(Object Privileges):允许用户对特定的数据库对象执行操作,如在表上执行
SELECT
、INSERT
、UPDATE
、DELETE
操作,或在过程/函数上执行EXECUTE
操作。
- 系统权限(System Privileges):允许用户执行数据库系统级别的操作,如创建用户、创建表、连接到数据库、备份数据库等。例如,
- 角色(Role):权限的命名集合。可以将多个权限授予给一个角色,然后将角色授予给用户。这样做的好处是简化了权限管理:当需要改变一组用户的权限时,只需修改角色的权限,所有被授予该角色的用户都会自动继承这些改变。
通过合理地创建用户、组织对象在模式中,并使用权限和角色来控制访问,可以构建一个既安全又易于管理的数据库环境。
第十章:连接数据库
用户或应用程序需要通过网络连接到Oracle数据库实例才能进行操作。这个连接过程通常涉及:
10.1 监听器(Listener)
监听器是一个独立于数据库实例的进程,运行在数据库服务器上。它负责接收客户端的连接请求。当客户端发起连接请求时,它会联系监听器,监听器根据连接信息(如服务名、SID)决定将连接请求转交给哪个数据库实例,并建立客户端进程与服务器进程之间的连接。监听器的配置信息存储在 listener.ora
文件中,客户端的连接信息存储在 tnsnames.ora
文件中。
10.2 连接工具
Oracle提供了多种连接和管理数据库的工具:
- SQL*Plus:Oracle提供的命令行工具,功能强大,常用于执行SQL语句、PL/SQL块以及数据库管理命令。
- SQL Developer:Oracle提供的图形化工具,基于Java开发,功能丰富,支持SQL开发、数据库管理、性能调优等。
- 各种编程接口:如JDBC (Java Database Connectivity), OCI (Oracle Call Interface), .NET Data Provider等,供应用程序开发使用。
第十一章:高可用性与备份恢复基础
虽然本文侧重基础概念,但高可用性和备份恢复是保证数据库可靠性的关键。Oracle提供了业界领先的HA和DR(灾难恢复)解决方案。
- 备份(Backup):创建数据库的副本,以防数据丢失或损坏。备份可以是在线备份(数据库运行时进行)或离线备份。Oracle推荐使用RMAN(Recovery Manager)工具进行备份,它支持全库备份、增量备份、归档日志备份等。
- 恢复(Recovery):在发生故障(如介质故障、用户错误、实例崩溃)时,使用备份和重做日志(包括归档日志)将数据库恢复到一致状态。Oracle的恢复过程通常包括数据文件还原(Restore)和前滚(Recover)应用重做日志。
- 高可用性(High Availability):通过冗余和故障转移机制,最小化停机时间。Oracle的高可用性解决方案包括:
- Oracle Data Guard:创建物理或逻辑备用数据库,通过传输和应用主数据库的重做日志来保持同步。当主库发生故障时,可以快速切换到备库。
- Oracle Real Application Clusters (RAC):多个实例同时访问同一个数据库文件集合。一个节点故障不会导致整个数据库停止服务。
重做日志和归档重做日志文件是Oracle恢复机制的核心,它们记录了所有的数据更改,使得数据库能够从任何时间点(只要有足够的归档日志)恢复到一致状态。
第十二章:Oracle数据库版本与选择
Oracle数据库提供多种版本和授权模式,以满足不同规模和需求的客户:
- Oracle Database Enterprise Edition (EE):功能最全面,包含所有高级特性,如RAC、分区、高级安全性、高级压缩等,适用于对性能、可用性、可扩展性和安全性要求最高的关键任务应用。
- Oracle Database Standard Edition 2 (SE2):功能相对精简,但在中小型企业环境中仍提供了强大的功能和可用性,适用于对成本敏感但仍需要可靠关系型数据库的场景。SE2有CPU数量限制。
- Oracle Database Express Edition (XE):免费版本,功能高度受限(如CPU核数、内存、存储空间),适合学习、开发或小型应用。
- 云服务:Oracle Cloud Infrastructure (OCI) 提供各种数据库云服务,如 Autonomous Database (ADB),它是高度自动化和优化的服务。
选择哪个版本取决于具体的业务需求、数据量、并发用户数、对高级特性的需求以及预算。
结论
本文详细介绍了Oracle数据库的核心概念和基础架构,包括其整体架构(数据库与实例)、内存结构(SGA与PGA)、进程结构(后台进程)、物理存储文件(数据文件、控制文件、重做日志、参数文件)、逻辑存储结构(数据块、区、段、表空间),以及数据库对象、数据完整性、事务管理、用户权限等关键主题。
通过深入理解这些基础知识,读者应该能够对Oracle数据库的内部工作原理有一个更清晰的认识,这对于进行数据库管理、性能调优、故障排除以及应用程序开发都至关重要。
Oracle数据库是一个庞大而复杂的系统,本文仅仅触及了其表面。要成为一名熟练的Oracle专业人士,还需要进一步学习其高级特性、管理工具(如RMAN, Data Pump, SQL*Loader)、性能调优技术、高可用性解决方案(RAC, Data Guard)以及云数据库技术等。
希望本文能为你的Oracle数据库学习之旅提供一个坚实的基础。继续探索和实践,你将能够驾驭这个强大的数据库系统,并在数据管理的广阔领域取得成功。