赞
踩
目录
官方文档:Oracle Database Database Concepts, 19c
注:edge可以右击转化为中文
数据库管理系统 (DBMS) 是控制数据的存储、组织和检索的软件。RDBMS的一个特征是物理数据存储独立于逻辑数据结构。
表描述实体,索引是一种可选数据结构,可以在表的一列或多列上创建,索引可以提高数据检索的性能。
事务是包含一个或多个 SQL 语句的逻辑原子工作单元。
数据库服务器是信息管理的关键。
Oracle 数据库服务器由一个数据库和至少一个数据库实例(通常简称为实例)组成。
由于实例和数据库的连接非常紧密,因此术语 Oracle 数据库有时用于指代实例和数据库。从最严格的意义上讲,这些术语具有以下含义:
数据库
数据库是位于磁盘上的一组文件,用于存储数据。这些文件可以独立于数据库实例存在。
数据库实例
实例是一组管理数据库文件的内存结构。该实例由一个共享内存区域(称为系统全局区域 (SGA))和一组后台进程组成。实例可以独立于数据库文件存在。
数据库整合是将数据从一个或多个非 CDB 移动到 CDB 的一般过程。
Oracle 分片是一种基于跨多个 Oracle 数据库对数据进行水平分区的数据库扩展技术。
物理数据库结构是存储数据的文件。
CREATE DATABASE
执行语句时,将创建以下文件:
许多其他文件对于 Oracle 数据库服务器的功能很重要。其中包括参数文件和网络文件。备份文件和存档的重做日志文件是对于备份和恢复很重要的脱机文件。
逻辑存储结构使 Oracle 数据库能够对磁盘空间的使用进行精细控制。
本主题讨论逻辑存储结构:
进程是操作系统中的一种机制,可以运行一系列步骤。
就本主题而言,线程等效于进程。Oracle 数据库实例具有以下类型的进程:
客户端进程
创建和维护这些进程是为了运行应用程序或 Oracle 工具的软件代码。大多数环境都有用于客户端进程的单独计算机。
后台进程
这些进程整合了原本由为每个客户端进程运行的多个 Oracle 数据库程序处理的功能。后台进程异步执行 I/O 并监控其他 Oracle 数据库进程,以提供更高的并行性,从而提高性能和可靠性。
服务器进程
这些进程与客户端进程通信,并与 Oracle 数据库交互以满足请求。
Oracle 进程包括服务器进程和后台进程。在大多数环境中,Oracle 进程和客户端进程在不同的计算机上运行。
系统全局区域 (SGA):SGA 是一组共享内存结构,其中包含一个数据库实例的数据和控制信息。SGA 组件的示例包括数据库缓冲区缓存和共享 SQL 区域。
计划全球区域 (PGA):PGA 是包含服务器或后台进程的数据和控制信息的内存区域。进入PGA是该过程独有的。每个服务器进程和后台进程都有自己的 PGA。
数据库架构是数据结构的逻辑容器,称为架构对象,架构对象的示例包括表和索引等。
某些架构对象将数据存储在称为段的逻辑存储结构类型中。
下图显示了表段和索引段、表空间和数据文件的可能配置。
- 一个表空间有多个数据文件
- 一个表的数据段可能跨越两个数据文件
- 一个段不能跨越多个表空间
所有 Oracle 数据库都包含默认管理帐户,创建数据库时,也会自动创建管理帐户。
表是 Oracle 中数据组织的基本单位。
表定义包括表名和列集。表可以包含虚拟列,与非虚拟列不同,虚拟列不占用磁盘空间。不可见列是用户指定的列,其值仅在按名称显式指定列时才可见。
行是与表中的记录对应的列信息的集合。
VARCHAR2():用于存储可变长度的字符数据。当存储的数据长度小于指定的长度时,只会占用实际使用的字节空间。
CHAR():用于存储固定长度的字符数据。如果存储的数据长度小于指定长度,会在数据后补空格字符。
NCHAR():用于存储固定长度的 Unicode 字符数据(即支持多语言字符集)。它可以存储 1 到 2000 字符,每个字符占据两个字节的存储空间。
NVARCHAR2():用于存储可变长度的 Unicode 字符数据。它可以存储 1 到 4000 字符。每个字符占据两个字节的存储空间。
日期时间数据类型是DATE和TIMESTAMP,Oracle数据库为时间戳提供全面的时区支持。
DATE 类型用于存储日期和时间,精确到秒级。日期存储在每个7字节的固定长度字段中,对应于世纪、年、月、日、小时、分钟和秒。格式 “DD-MON-YYYY HH24:MI:SS”。
TIMESTAMP:TIMESTAMP 类型用于存储日期、时间和纳秒级的时间戳数据,表示精度从秒到纳秒的不同级别。TIMESTAMP 类型占用 11 个字节或更多的存储空间,并且按照 “YYYY-MM-DD HH24:MI:SS.FF” 的格式进行存储和显示。
存储在数据库中的每一行都有一个地址。Oracle 数据库使用rowid数据类型来存储数据库中每一行的地址 (rowid)。
Rowids分为以下几类:
物理 rowid 将行的地址存储在堆组织的表、表集群以及表和索引分区中。
逻辑 rowid 将行的地址存储在按索引组织的表中。
外部 rowid 是外部表中的标识符,例如通过网关访问的 DB2 表。它们不是标准的 Oracle 数据库 rowid
Oracle数据库在内部使用rowids来构建索引。B 树索引是最常见的类型,它包含按范围划分的键的有序列表。每个键都与一个 rowid 相关联,该 rowid 指向关联行的地址以便快速访问。
格式模型:
TO_CHAR
、
TO_DATE
完整性约束是限制表中一列或多列的值的命名规则。
Oracle 使用表空间中的数据段来保存表数据,默认情况下,表被组织为堆,这意味着数据库将行放置在最适合的位置,而不是按用户指定的顺序放置。因此,堆组织的表是行的无序集合。
当用户添加行时,数据库会将行放在数据段中的第一个可用空间中。不保证按插入行的顺序检索行。虚拟列不占用磁盘空间。
rowid 实际上是行的 10 字节物理地址。对于表集群,同一数据块中不同表中的行可以具有相同的 rowid。Oracle 数据库在内部使用 rowid 来构建索引。
空值是列中没有值。空值表示缺失、未知或不适用的数据。
数据库可以使用表压缩来减少表所需的存储量,堆组织的表用字典压缩效果很好。
基本表压缩:基于列,使用类似于字典编码的方式来压缩数据。它通过移除重复值和使用更紧凑的存储格式来减小数据占用的空间。数据变化比较少的表。
高级行压缩:基于行,通过减小每行记录的存储空间,来实现更高程度的压缩。适用于需要更高压缩率且数据变化频繁的表。Oltp
默认情况下,如果对压缩单元中的任何行更新或删除,数据库将锁定所有行。可以选择为表启用行级锁定,数据库仅锁定受更新或删除操作影响的行。
混合列式压缩使用称为压缩单元的逻辑构造来存储一组行,混合列压缩对不同类型的 DML 操作中的行锁定有影响。
表集群是一组共享公共列并将相关数据存储在同一块中的表。
优点:
- 群集表联接的磁盘 I/O 减少。
- 改进了聚集表联接的访问时间。
- 存储相关表和索引数据所需的存储空间较少,因为不会为每一行重复存储集群键值。
不适用:
- 这些表经常更新。
- 这些表经常需要全表扫描。
- 表需要截断。
索引集群是使用索引来定位数据的表集群。集群索引是集群键上的 B 树索引。必须先创建聚类索引,然后才能将任何行插入到聚簇表中。
哈希集群类似于索引集群,只是索引键被替换为哈希函数。不存在单独的群集索引。在哈希群集中,数据是索引。
属性群集表是一个堆组织的表,它根据用户指定的群集指令将数据存储在磁盘上。这些指令指定单个或多个表中的列。
基于联接列的属性聚类分析称为联接属性聚类分析。与表聚类相比,联接属性聚类表不会将一组表的数据存储在同一数据库块中。
区域是一组连续的数据块,用于存储相关列的最小值和最大值。I/O:一个或多个在索引中找键值、另一个用于读取写入。这种减少可以显著降低表扫描的 I/O 和 CPU 开销。
临时表保存仅在事务或会话期间存在的数据。
临时表在必须缓冲结果集的应用程序中很有用。专用临时表对于动态报告应用程序很有用。
与永久表一样,全局临时表是在数据字典中静态定义的持久对象。对于私有临时表,元数据仅存在于内存中,但可以驻留在磁盘上的临时表空间中。 CREATE ... TEMPORARY TABLE
外部表访问外部源中的数据,就像此数据位于数据库的表中一样。
当 Oracle 数据库应用程序必须访问非关系数据时,外部表非常有用。数据仓库。
访问驱动程序是解释数据库外部数据的 API。
区块链表是为集中式区块链应用程序设计的仅追加表,在区块链表中,行链是一系列通过散列方案链接在一起的行。行内容是一个连续的字节序列,其中包含行的列数据和链中前一行的哈希值。
有时可以加快数据访问速度。索引是在逻辑上和物理上独立于与其关联的对象中的数据的架构对象,索引是减少磁盘 I/O 的众多方法之一。
索引的缺点包括:
手动创建索引通常需要深入了解数据模型、应用程序和数据分布。
随着数据的变化,索引可能不再有用,或者可能需要新索引。
索引占用磁盘空间。
当索引数据上发生 DML 时,数据库必须更新索引,这会产生性能开销。
键是一组列或表达式,您可以基于其构建索引。
从 19c 开始,Oracle可以自动创建和管理索引:Alter table a auto index on;
主键和唯一键自动具有索引,唯一索引保证表中没有两行在键列中具有重复值。
复合索引(也称为串联索引)是表中多个列的索引,通常,最常访问的列排在第一位:
CREATE INDEX a ON employees (last_name, job_id, salary);
Oracle将索引数据存储在索引段中。索引段的表空间是所有者的默认表空间,可以将索引存储在与其表不同的表空间中,可以选择不备份仅包含索引的表空间。
创建索引后,数据库会自动维护和使用索引。
B 树是平衡树的缩写,有两种类型的块:用于搜索的分支块和用于存储键值的叶块。B 树索引的上层分支块包含指向较低级索引块的索引数据。
叶块包含每个索引数据值和用于查找实际行的相应 rowid。
如果 SQL 语句仅访问索引列,则数据库直接从索引而不是表中读取值。如果该语句除了访问索引列之外还访问非索引列,则数据库将使用 rowid 来查找表中的行。通常,数据库通过交替读取索引块和表块来检索表数据。
全索引扫描Full Index Scan:数据库按索引数据顺序读取整个索引,每次只读取一个数据库,避免排序,读取的数据块是经过无序的多块读取的。
快速全索引扫描Fast Full Index Scan:数据库按物理存储顺序读取,可以读取多个数据块, 用于数据检索。
索引范围扫描 Index Range Scan:对索引的有序扫描,其中在条件中指定了索引的一个或多个前导列。数据库通常使用索引范围扫描来访问选择性数据。
索引唯一扫描Index Unique Scan:当谓词使用相等运算符引用索引键中的所有列时。
索引跳过扫描Index Skip Scan:如果复合索引的前导列中只有很少的非重复值,而索引的非前导键中有许多非重复值,逻辑子索引的数量由前导列中的非重复值的数量决定。
聚类因子:扫描索引时访问的数据块的数量。
反向键索引:是一种B树索引,它在保持列顺序的同时物理反转每个索引键的字节。反转键解决了 B 树索引右侧叶块的争用问题,用于插入顺序键的 I/O 分布更均匀。
升序和降序索引:CREATE INDEX xx ON hr.employees(a ASC, b DESC);
前缀压缩:压缩 B 树索引或索引组织的表中部分主键列值,前缀条目(分组)和后缀条目(唯一或几乎唯一),数据库通过在索引块中的后缀条目之间共享前缀条目来实现压缩。
默认情况下,唯一索引的前缀由除最后一个之外的所有键列组成。如果键没有定义为具有唯一的块,则数据库通过向分组块附加rowid来提供唯一的块。
注:如果在单个列上创建唯一索引,则 Oracle 无法使用前缀键压缩,因为不存在通用前缀。
高级索引压缩:12.1.0.2,压缩索引的使用方式与未压缩索引相同,适用于非唯一索引和唯一索引,前缀压缩在非唯一索引上效果很好,但在前导列没有很多重复的索引上效果一般。
12.2之后有个高压缩,可以指定,在后面加COMPRESS ADVANCED。
在位图索引中,数据库存储每个索引键的位图。在传统的B树索引中,一个索引条目指向一行。在位图索引中,每个索引键存储指向多行的指针。位图索引可以包括完全由空值组成的键,这与B树索引不同,位图中的每个位对应于一个可能的 rowid。
用到位图索引:索引列的基数较低,即非重复值的数量远小于表行的数量;
索引表是只读的,或者不受 DML 语句的重大修改。
因为一个键指向许多行,所以索引数据上的DML通常会锁定所有这些行,不适用OLTP 。
位图联接索引是用于联接两个或多个表的位图索引。
Oracle 数据库使用 B 树索引结构来存储每个索引键的位图。
计算涉及一个或多个列的函数或表达式的值,并将其存储在索引中。基于函数的索引可以是 B 树或位图索引,索引函数可以是算术表达式。
基于函数的索引是为了提高查找速率,但仍必须计算函数以处理语句。
对于WHERE子句中包含表达式的查询,优化器可以对基于函数的索引使用索引范围扫描。
应用程序域索引是特定于应用程序的自定义索引。虚拟列对于加快对从表达式派生的数据的访问也很有用。
应用程序域索引是特定于应用程序的自定义索引。
二级索引使用既不是主键也不是主键前缀的列,提供对按索引组织的表的快速有效的访问。
二级索引使用逻辑 rowid 来查找表行,逻辑 rowid 包括物理猜测。
对于堆组织的表,二级索引的访问涉及扫描二级索引和额外的 I/O 来获取包含该行的数据块。对于按索引组织的表,二级索引的访问会有所不同,具体取决于物理猜测的用途和准确性:
在没有物理猜测的情况下,访问涉及两个索引扫描:扫描二级索引,然后扫描主键索引。
通过物理猜测,访问取决于其准确性:
通过准确的物理猜测,访问涉及辅助索引扫描和额外的 I/O,以提取包含该行的数据块。
对于不准确的物理猜测,访问涉及辅助索引扫描和 I/O 以获取错误的数据块(如猜测所示),然后按主键值对索引组织表进行索引唯一扫描。
按索引组织的表上的二级索引可以是位图索引。位图索引存储每个索引键的位图。
分区使您能够将非常大的表和索引分解为更小且更易于管理的部分,每个分区都是一个独立的对象,具有自己的名称和可选的存储特征。
从应用程序的角度来看,仅存在一个架构对象。SQL 语句无需修改即可访问分区表。分区对于许多不同类型的数据库应用程序非常有用,尤其是那些管理大量数据的数据库应用程序。好处包括:
表或索引的每个分区必须具有相同的逻辑属性,例如列名、数据类型和约束,但是,每个分区可以具有单独的物理属性,例如它所属的表空间。
分区键是一组由一列或多列组成的列,用于确定分区表中每一行应位于的分区,Oracle使用分区键自动将插入、更新和删除操作定向到相应的分区。
Oracle有很多分区策略,控制数据库将数据放入分区,基本策略是范围、列表和哈希分区。
单极分区是只用一种,复合分区是使用多种。
范围:数据库根据分区键的值范围将行映射到分区,通常是日期。
间隔:是范围分区的扩展,如果插入的数据超出现有范围分区,则 Oracle 会自动创建指定间隔的分区。避免显式创建范围分区,分区键值确定范围分区的高值,称为转换点。
列表:数据库使用离散值列表作为每个分区的分区键,分区键由一列或多列组成,使用列表分区来控制各个行映射到特定分区的方式。
哈希:数据库根据数据库应用于用户指定的分区键的哈希算法将行映射到分区。行的位置由数据库应用于该行的内部哈希函数确定,哈希分区在更新争用高的OLTP系统中也很有用。当分区数为 2 的幂时,哈希算法会在所有分区中创建大致均匀的行分布。
引用:子表的分区策略仅通过与父表的外键关系来定义。对于父表中的每个分区,子表中存在一个相应的分区。父表将父记录存储在特定分区中,子表将子记录存储在相应的分区中。
复合:表通过一种数据分发方法进行分区,然后使用第二种数据分发方法将每个分区进一步细分为子分区。范围、列表和哈希分区都可以作为复合分区表的子分区策略。
复合分区具有以下几个优点:
根据 SQL 语句,在一个或两个维度上进行分区修剪可能会提高性能。
查询可能能够在任一维度上使用完全或部分分区联接。
您可以对单个表执行并行备份和恢复。
分区数大于单级分区,这可能有利于并行执行。
如果许多语句可以从分区修剪或分区连接中受益,则可以实现滚动窗口以支持历史数据,并且仍然可以在另一个维度上进行分区。
可以根据分区键的标识以不同的方式存储数据。例如,您可能决定以只读的压缩格式存储特定产品类型的数据,并保持其他产品类型数据未压缩。
数据库将复合分区表中的每个子分区存储为单独的段,因此,子分区属性可能不同于表的属性或子分区所属的分区。
分区表由一个或多个分区组成,这些分区单独管理,可以独立于其他分区运行。
分区表由一个或多个表分区段组成。单个表或分区可以包含压缩和未压缩的块,这保证数据大小不会因为压缩而增加。如果压缩会增加块的大小,则数据库不会将其应用于该块。
已分区索引与已分区表一样,被划分为更小、更易于管理的部分。
堆组织表的部分或全部分区可以以压缩格式存储,压缩可节省空间并加快查询执行速度。
分区索引是与分区表一样,已划分为更小且更易于管理的部分的索引。
本地分区索引中,索引与其表在相同的列上分区,具有相同的分区数和相同的分区边界。
本地分区索引在数据仓库环境中很常见。本地索引具有以下优点:
可用性提高,因为使分区中的数据无效或不可用的操作仅影响此分区。
简化了分区维护。移动表分区时,或者当数据老化出分区时,只需重建或维护关联的本地索引分区。在全局索引中,必须重建或维护所有索引分区。
如果发生分区的时间点恢复,则可以将索引恢复到恢复时间。不需要重新生成整个索引。
与表分区一样,本地索引分区存储在其自己的段中。每个段包含总索引数据的一部分。因此,由四个分区组成的本地索引不是存储在单个索引段中,而是存储在四个单独的段中。
全局分区索引是独立于创建它的基础表进行分区的B树索引。单个索引分区可以指向任何或所有表分区,而在本地分区索引中,索引分区和表分区之间存在奇偶校验。全局索引对于 OLTP 应用程序非常有用。在 OLTP 系统中,表可以按一个键(例如列)进行分区,但应用程序可能需要使用许多不同的键(例如,按 或 )访问数据。
分片表:水平分区涉及跨分片拆分数据库表,以便每个分片包含具有相同列但行子集不同的表。分片使您能够将大型表分解为更易于管理的部分,称为分片。
分片表是在多个数据库(称为分片)中划分为更小且更易于管理的部分的表。
Oracle 分片将表空间创建和管理为一个称为表空间集的单元。
视图是一个或多个表的逻辑表示形式。视图从它所基于的表(称为基表)派生其数据。基表可以是表或其他视图。对视图执行的所有操作实际上都会影响基表。
通常用于:1、通过限制对表中一 “组预定行或列的访问来提供额外的表安全性;
2、隐藏数据复杂性;
3、以与基表不同的角度呈现数据;
4、将应用程序与基表定义中的更改隔离开来。
对视图执行的操作会影响基表中的数据,并受基表的完整性约束和触发器的约束。
Sql语句引用视图时,oracle执行:
1、尽可能对视图的查询与定义视图的查询合并,无法合并就可能不使用引用列的索引;
2、解析共享SQL区域中的合并语句,共享池没有oracle再解析新语句;
3、执行sql语句。
如视图是虚拟表一样,对象视图也是虚拟对象表。视图中的每一行都是一个对象,它是对象类型的一个实例。对象类型是用户定义的数据类型。
可更新联接视图也称为可修改联接视图,它涉及两个或多个基表或视图,并允许DML操作。可更新视图在SELECT语句的顶级FROM子句中包含多个表,并且不受WITH READ ONLY子句的限制。
实例化视图是已作为架构对象预先存储或“具体化”的查询结果,在复制环境中,实例化视图与另一个数据库(称为 master 数据库)中的表共享数据。
实例化视图在以下方面与索引类似:
它们包含实际数据并占用存储空间。
当主表中的数据发生更改时,可以刷新它们。
当用于查询重写操作时,它们可以提高 SQL 执行的性能。
它们的存在对 SQL 应用程序和用户是透明的。
完全刷新将执行定义实例化视图的查询。最初创建实例化视图时,将进行完全刷新,除非实例化视图引用预构建的表,或者您将该表定义为 DEFERRED。
增量刷新(快速刷新)仅处理对现有数据的更改,仅处理更改可能会导致非常快的刷新时间。
两种形式:基于日志,实例化视图日志或直接加载程序日志会记录对基表的更改;分区更改跟踪(PCT),仅当对基表进行分区时,PCT 刷新才有效,删除受影响再重新计算。
在位in-place或异位out-of-place刷新。
查询重写将按照主表编写的用户请求转换为语义上等效的请求,其中包括具体化视图。实例化视图包含预先计算的聚合和联接,因此查询重写可以使用实例化视图快速回答查询。
序列是一个架构对象,多个用户可以从中生成唯一的整数。序列生成器提供了一种高度可伸缩且性能良好的方法来为数字数据类型生成代理键。
序列定义,包括其名称以及序列是上升还是下降,序列定义还指示:
数字之间的间隔
数据库是否应在内存中缓存生成的序列号集
达到限制时序列是否应循环
同一序列生成器可以为多个表生成数字。序列在多用户下很有用,生成唯一编号,而不会产生磁盘 I/O 或事务锁定的开销。
数据仓库有两个重要组成部分:维度和事实。
维度是用于指定业务问题的任何类别,
维度表是一种逻辑结构,用于定义列对或列集之间的分层(父/子)关系。
CREATE DIMENSION:多个LEVEL子句,每个子句标识维度中的一个列或列集;一个或多个HIERACHY子句,指定相邻级别之间的父子关系;可选的ATTRIBUTE子句,每个子句标识与单个级别关联的附加列或列集。
同义词是架构对象的别名。如果必须重命名或移动基础对象,则只需重新定义同义词。基于同义词的应用程序无需修改即可继续工作。
数据必须保持数据完整性,即遵守数据库管理员或应用程序开发人员确定的业务规则,包括:
使用触发的存储数据库过程强制实施业务规则
使用存储过程完全控制对数据的访问
在数据库应用程序的代码中强制实施业务规则
使用 Oracle 数据库完整性约束,这是在列或对象级别定义的规则,用于限制数据库中的值
完整性约束: Oracle能够在表和列级别应用约束。
Not null非空;unique key 唯一;primary key主键;foreign key外键;check检查;ref。
唯一键约束:适用于不允许重复值的任何列,主键约束的目的是唯一地标识每个表行。
主键约束:在指定的列或一组列中没有两行具有重复的值;没有空值。
外键约束:两表有公共列,引用的列必须唯一,具体如下图所示。
关系模型允许外键的值与引用的主键值或唯一键值匹配,或者为null。如果复合外键的任何列为 null,则键的非 null 部分不必与父键的任何相应部分匹配。
父键修改参照完整性约束操作:无操作,级联删除,设置为null的删除。
插入父表:始终唯一就正常;插入子表:外键值在引用列存在或者为null就可以;
更新无操作父表:子表没有引用就行; 更新无操作子表:新外键值仍然属于引用列;
删除无操作父表:子表没有引用就行。
检查约束: 如果 DML 导致约束的条件计算结果为 false,则回滚 SQL 语句.
VALIDATE现有数据必须符合约束,NOVALIDATE现有数据不需要符合约束。
在不可延期约束中, 数据库会在每条语句的末尾检查约束。如果违反了约束,则语句将回滚。
可递延约束允许事务用SET CONSTRAINT延迟检查约束,直到发出commit。如果对数据库所做的更改可能违反约束,则此设置有效地使您能够禁用约束,直到所有更改都完成。
您可以设置数据库检查可延迟约束时的默认行为。您可以指定以下任一属性:
INITIALLY IMMEDIATE
数据库在每个语句执行后立即检查约束。如果违反了约束,则数据库将回滚该语句。
INITIALLY DEFERRED
数据库在发出
COMMIT
时检查约束。如果违反了约束,则数据库将回滚事务。
每个 Oracle的只读引用表和视图的中心集统称为数据字典,动态性能视图是在数据库打开和使用时不断更新的特殊视图。
数据字典由基表和视图组成。
基表
它们存储有关数据库的信息。只有 Oracle 数据库才能写入和读取这些表。用户很少直接访问基表,因为它们是规范化的,并且大多数数据都以神秘格式存储。
视图
它们使用联接和
WHERE
子句将基表数据解码为有用的信息(如用户名或表名)以简化信息。视图包含数据字典中所有对象的名称和说明。某些视图可供所有数据库用户访问,而其他视图仅供管理员访问。
数据字典视图以集合的形式分组, 一个集合由三个视图组成,并通过其前缀相互区分:
带有DBA_前缀的视图显示整个数据库中的所有相关信息,视图仅供管理员使用。
带有ALL_前缀的视图是指用户对数据库的整体视角。用户拥有的架构对象, 用户通过公共或显式授予特权和角色有权访问的架构对象的信息。
前缀为USER_的视图:数据库中用户的私有环境,包括关于由用户创建的模式对象的元数据、由用户授予的权限等;仅显示与用户相关的行,返回ALL_ views中的信息的子集;具有与其他视图相同的列,除了列OWNER是隐含的;为了方便可以具有缩写的PUBLIC同义词.
DUAL当一个值必须只返回一次(例如当前日期和时间)时可以用到,所有数据库用户都可以访问DUAL。
数据字典用system打开, oracle会不断更新数据字典,以反映数据库的变化。更改或操作数据字典表中的数据可能会对数据库操作产生永久性不利影响。
大部分数据字典信息都在数据字典缓存中, 描述表及其列的列不缓存在字典缓存中,但可以缓存在数据库缓冲区缓存中。
Oracle维护一些V$视图(是动态的),它们在数据库打开和使用时会不断更新。
动态性能视图包含如下信息:系统和会话参数、内存使用和分配、文件状态(包括 RMAN 备份文件)、作业和任务的进度、数据库执行、统计信息和指标
动态性能视图具有以下主要用途:Oracle Enterprise Manager 使用这些视图来获取有关数据库的信息、管理员可以使用这些视图进行性能监视和调试。
几乎每个V$视图都有一个对应的GV$视图。动态性能视图基于从数据库内存结构构建的虚拟表。视图不是存储在数据库中的传统表。不保证视图的读取一致性,因为数据是动态更新的。
数据定义语言DLL 语句定义、结构更改和删除架构对象。能够:
1、创建、更改和删除架构对象和其他数据库结构,包括数据库本身和数据库用户;
2、删除架构对象中的所有数据,而不删除这些对象的结构(
truncate
);与delete相比,truncate不会撤销数据,所以比delete快,truncate也不会调用删除触发器。3、授予和撤权限和角色(grant、revoke);
4、打开和关闭审核选项(
audit
、noaudit);5、向数据字典添加注释(commit);
数据操作语言DML语句查询或操作现有架构对象中的数据。DDL 语句更改数据库的结构,而 DML 语句查询或更改内容。构成逻辑工作单元的DML语句集合称为事务。
内连接:内部连接是两个或多个表的连接,仅返回满足连接条件的行;
外连接:外连接返回满足连接条件的所有行;
笛卡尔乘积:如果两个表没有连接条件,则数据库将执行笛卡尔连接。
管理 DML 语句所做的更改,并将 DML 语句分组到事务中。
1、使对事务的更改永久化 (commit)
2、撤消事务中自事务开始rollback或保存点rollback to savepoint以来的更改。
rollback语句结束事务,但rollback to savepoint不会。3、设置可以回滚到的点savepoint。
4、为事务建立属性 set transcation。
5、指定是在DML语句之后检查可延迟完整性约束,还是在提交事务时检查set constant。
会话控制语句动态管理用户会话的属性。
会话是数据库实例内存中的一个逻辑实体,表示当前用户登录到数据库的状态。会话从数据库对用户进行身份验证开始持续,直到用户断开连接或退出数据库应用程序。
系统控制语句更改数据库实例的属性。
能够更改设置,如共享服务器的最小数量、终止会话以及执行其他系统级任务。
优化器生成描述可能的执行方法的执行计划。优化程序通过考虑多个信息源来确定哪个执行计划最有效。在确定 SQL 语句的最佳执行计划时,优化程序执行以下操作:
表达式和条件的评估
检查完整性约束以了解有关数据的更多信息并基于此元数据进行优化
语句转换
优化器目标的选择
访问路径的选择
连接顺序的选择
可以通过设置优化器目标和收集优化器的代表性统计信息来影响优化器选择:
吞吐量All_rows:优化程序尽快将结果的最后一行发送到客户端应用程序;
初始响应时间FIRST_ROWS:该提示指示优化程序尽快将第一行发送到客户端。
典型的最终用户交互式应用程序将受益于初始响应时间优化,而批处理模式的非交互式应用程序将受益于总吞吐量优化。
优化器包含三个主要组件:转换器、估计器和计划生成器。
优化器的输入是经过分析的查询。优化程序执行以下操作:
优化程序接收已解析的查询,并根据可用的访问路径和提示为 SQL 语句生成一组可能的计划。
优化程序根据数据字典中的统计信息估计每个计划的成本。成本是与使用特定计划执行语句所需的预期资源使用成比例的估计值。
优化程序比较计划的成本,并选择成本最低的计划(称为查询计划)传递给行源生成器。
查询转换器确定更改查询的形式是否有帮助,以便优化器可以生成更好的执行计划。查询转换器的输入是已分析的查询,优化器将其表示为一组查询块。
估算器确定给定执行计划的总体成本。
选择性此度量值表示行集中的一小部分行。选择性与查询谓词或谓词的组合相关联。
基数此度量值表示行集中的行数。
成本此度量表示使用的工作单位或资源。查询优化器使用磁盘 I/O、CPU 使用情况和内存使用情况作为工作单元。
计划生成器会为提交的查询尝试不同的计划。优化程序选择成本最低的计划。
访问路径:用于检索行的查询。通常,索引扫描适用于小部分数据,全表扫描大部分数据:
访问路径是查询用于检索行的技术。
1、全表扫描:从表中读取所有行,并筛选出不符合选择条件的行。
2、Rowed扫描:数据库首先从语句子句或通过索引扫描获取所选行的rowid,然后根据其 rowid 定位每个选定行。
3、索引扫描:此扫描在索引中搜索 SQL 语句访问的索引列值。如果语句仅访问索引的列,则 Oracle 直接从索引读取索引列值。
4、集群扫描:存储在索引表集群中的表中检索数据。数据库首先通过扫描聚类索引来获取所选行的 rowid,Oracle 根据此行查找行。
5、哈希扫描:在哈希簇中查找行,数据库首先通过将哈希函数应用于语句指定的集群键值来获取哈希值。然后,Oracle 扫描包含具有此哈希值的行的数据块。
优化程序统计信息:描述有关数据库和数据库中对象的详细信息的数据集合。
优化程序统计信息包括以下内容:
表统计信息:其中包括行数、块数和平均行长度。
列统计信息:其中包括列中非重复值和空值的数量以及数据的分布。
指数统计:其中包括叶块的数量和索引级别。
系统统计:其中包括 CPU 和 I/O 性能和利用率。
Hints 提供了一种手动干预查询执行计划的机制,可以在某些情况下改善查询性能。
带有FIRST_ROWS提示的 SELECT 执行计划,无提示的 SELECT 执行计划:
SQL 处理的一般阶段是解析、优化、行源生成和执行。
SQL 处理的第一阶段是 SQL 解析。
在解析调用期间,数据库将执行以下检查:语法检查、语义检查、共享池检查。
程序发出SQL语句时,parse调用或创建一个游标,它是特定会话的私有SQL区域的句柄,该区域保存已解析的SQL语句和其他处理信息。游标和专用SQL区域位于PGA中。
查询优化是选择执行 SQL 语句的最有效方法的过程。
优化程序使用行数、数据集大小和其他因素来生成可能的执行计划,并为每个计划分配数字成本。数据库使用成本最低的计划。
数据库必须对每个唯一的 DML 语句至少执行一次硬解析,并在此解析期间执行优化。
行源生成器是从优化器接收最佳执行计划并生成可由数据库使用的迭代计划的软件。
在执行期间,SQL引擎执行行源生成器生成的树中的每个行源。这是DML处理中唯一的必填步骤。
与 DDL 相比,大多数 DML 语句都有一个查询组件。在查询中,执行游标会将查询生成的行放入结果集中。
数据库可以一次读取一行或成组读取结果集行。在提取中,数据库选择行,如果查询请求,则对行进行排序。每次连续的读取都会检索结果的另一行,直到读取最后一行。
PL/SQL 单元存储在数据库中。当应用程序调用存储过程时,数据库会将编译的 PL/SQL 单元加载到系统全局区域(SGA) 中的共享池中。PL/SQL 和 SQL 语句执行器协同工作以处理过程中的语句。
PL/SQL 包是一组相关的子程序,以及它们使用的游标和变量,一起存储在数据库中,以便作为一个单元继续使用。
PL/SQL 匿名块是一个未命名的、非持久性的 PL/SQL 单元。
PL/SQL 模块可以包含各种不同的 PL/SQL 语言结构:变量和常量、游标、异常。
PL/SQL 集合是一组有序的元素,所有元素的类型都相同。
当发生以下操作之一时,都会触发触发器:
使用触发器和完整性约束来定义和强制实施任何类型的完整性规则。但是,建议仅使用触发器来实施无法使用完整性约束定义的复杂业务规则。
过度使用触发器可能会导致复杂的相互依赖关系,如级联触发器,从而产生意外效果。
行触发器,删除一百行,触发一百次;语句触发器,删除一百行,触发一次。
INSTEAD OF
触发器
INSTEAD OF 触发器由 Oracle 触发,而不是执行触发语句。这些触发器可用于透明地修改无法直接通过 DML 语句修改的视图。
事件触发器
您可以使用触发器将有关数据库事件的信息发布到订阅者。事件触发器分为以下几类:
触发定义时间:在触发语句之前、在受触发语句影响的每行之前、在受触发语句影响的每行之后、在触发语句之后。
PL/SQL 触发器具有以下基本组件:
触发器名称:该名称在同一架构中的其他触发器名称中必须是唯一的。
触发器事件或语句:触发事件或语句是导致调用触发器的 SQL 语句、数据库事件或用户事件。例如,用户更新表。
触发限制:触发器限制指定触发触发器必须包含的布尔表达式。例如,除非可用部件的数量小于当前的再订购量,否则不会调用触发器。
true
触发的操作:触发操作是包含发出触发语句且触发器限制计算结果为 true 时要运行的 SQL 语句和代码的过程。例如,用户在挂单表中插入一行。
Oracle 将 PL/SQL 触发器以编译形式存储在数据库模式中,就像 PL/SQL 存储过程一样。当CREATETRIGGER语句提交时,编译后的PL/SQL代码存储在数据库中,共享池删除PL/SQL触发器的源代码。
多用户数据库必须:数据并发(同时访问数据)、数据一致性(访问的数据相同)。
Oracle的查询具有以下特征:读取一致性查询、非阻塞查询。
读取一致性查询:查询返回的数据在单个时间点内已提交且一致;oracle不允许脏读。
非阻塞查询:数据的读取器和写入者不会相互阻塞。
Oracle 始终强制实施语句级读取一致性,从而保证单个查询返回的数据在单个时间点提交且一致。
事务级读取一致性,事务中的每个语句都会看到来自同一时间点的数据。
ANSI/ISO 事务隔离级别
脏读
事务读取由另一个尚未提交的事务写入的数据。
不可重复(模糊)读取
事务重新读取它以前读取的数据,并发现另一个已提交的事务已修改或删除数据。例如,用户查询一行,然后查询同一行,却发现数据已更改。
幻影阅读
事务重新运行返回一组满足搜索条件的行的查询,并发现另一个已提交的事务插入了满足该条件的其他行。
例如,事务查询员工数。五分钟后,它执行相同的查询,但现在这个数字增加了一个,因为另一个用户插入了新员工的记录。满足查询条件的数据比以前多,但与模糊读取不同,以前读取的数据保持不变。
Oracle 提供已提交读取(默认)和可序列化隔离级别。此外,数据库还提供只读模式。
事务执行的每个查询都只能看到查询开始之前提交的数据,而不是事务。此隔离级别是默认级别。它适用于很少有事务可能发生冲突的数据库环境。已提交读取事务中的查询可避免读取在查询过程中提交的数据。
数据库为每个查询提供一致的结果集,保证数据一致性,用户无需执行任何操作。
在已提交的读取事务中,当事务尝试更改由未提交的并发事务更新的行时,会发生冲突写入。
阻止行修改的事务有时称为阻塞事务。已提交读取事务等待阻塞事务结束并释放其行锁。如下:
如果阻塞事务回滚,则等待事务将继续更改先前锁定的行,就好像其他事务从未存在过一样。
如果阻塞事务提交并释放其锁,则等待事务将继续对新更改的行进行预期更新。
注:会话A修改了行A未提交时,会话B再修改行A,会话B就会堵塞等待会话Acommit。
事务仅看到事务开始时提交的更改(而不是查询)以及事务本身所做的更改。
可序列化事务在环境中运行,使其看起来好像没有其他用户在修改数据库中的数据。可序列化隔离适用于以下环境:
使用仅更新几行的大型数据库和短事务
两个并发事务修改相同行的可能性相对较低
运行时间较长的事务主要是只读的
在可序列化隔离中,通常在语句级别获得的读取一致性扩展到整个事务。事务读取的任何行在重新读取时都保证相同。任何查询都保证在事务期间返回相同的结果,因此无论查询运行了多长时间,其他事务所做的更改都对查询不可见。可序列化事务不会遇到脏读、模糊读或幻像读。
当可序列化事务失败并出现
ORA-08177
错误时,应用程序可以执行多个操作,包括:
将执行的工作提交到该点
执行其他(但不同)语句,也许在回滚到事务中较早建立的保存点之后
回滚整个事务
只读隔离级别类似于可序列化的隔离级别,但只读事务不允许在事务中修改数据,除非用户是 SYS
。
锁是一种防止破坏互的机制,存在多用户模式。
数据库使用两种类型的锁:独占锁和共享锁。在行或表等资源上只能获取一个独占锁,但在单个资源上可以获取多个共享锁。
锁会影响读取器和编写器的交互:
- 仅当由编写器修改时,才会锁定行;
当语句更新一行时,事务仅获取此行的锁。通过在行级别锁定表数据,数据库可以最大程度地减少对相同数据的争用。在正常情况下,数据库不会将行锁定升级到块或表级别。- 行的编写器阻止同一行的并发编写器;
如果一个事务正在修改行,则行锁会阻止另一个事务同时修改同一行。- 读取器从不阻止编写器;
由于行的读取器不会锁定它,因此编写器可以修改此行- 当编写器更改时,数据库使用撤消数据为读者提供一致的行视图。
锁满足以下重要的数据库要求:
一致性:在用户完成之前,其他会话不得更改会话正在查看或更改的数据。
完整:数据和结构必须以正确的顺序反映对它们所做的所有更改。
Oracle 在执行 SQL 语句时自动获取必要的锁
完整性
Oracle 数据库在多用户数据库中使用两种锁定模式:
在锁转换中,数据库会自动将限制性较低的表锁转换为限制性较高的表锁。
死锁是两个或多个用户等待彼此锁定的数据的情况。死锁会阻止某些事务继续工作。Oracle会自动检测死锁,并通过回滚死锁中涉及的语句来释放一组冲突的行锁来解决冲突。
注:会话A修改了行A,会话B再修改行B,会话A再修改行B就会堵塞,此时会话B再去修改行A就会死锁,直接回滚会话B。
数据库根据资源和正在执行的操作,自动获取不同限制级别的不同类型的锁。
DML锁(也称为数据锁)保证多个用户同时访问的数据的完整性,有行锁(TX)表锁(TM)。
行锁(TX 锁)是单行表上的锁。行锁主要用作排队机制,以防止两个事务修改同一行,行锁一直存在,直到事务提交或回滚。
如果事务获取了行的锁,则该事务还会获取包含该行的表的锁。表锁可防止冲突的 DDL 操作,这些操作将覆盖当前事务中的数据更改。
Oracle将锁信息存储在包含锁定行的数据块中。数据库使用排队机制来获取行锁,如果事务需要锁定未锁定的行,则事务会在数据块中放置锁定。
表锁(TM 锁)DML 操作需要表锁来代表事务保留对表的 DML 访问权限,并防止与事务冲突的 DDL 操作。可以在以下任何模式下保持表锁:
行共享 (RS Row Share)
此锁也称为子共享表锁 (SS),表示在表上持有锁的事务已锁定表中的行并打算更新它们。行共享锁定是最低级别的共享模式锁。
行独占表锁定 (RX Row eXclusive)
此锁也称为次独占表锁 (SX),通常表示持有锁的事务已更新表行或发出
SELECT ... FOR UPDATE
。SX 锁允许其他事务在同一表中同时查询、插入、更新、删除或锁定行。因此,SX 锁允许多个事务同时获取同一表的 SX 和子共享表锁。共享表锁定 (S Share)
事务持有的共享表锁允许其他事务查询该表(不使用
SELECT ... FOR UPDATE
),但仅当单个事务持有共享表锁时,才允许更新。由于多个事务可能同时持有共享表锁,因此持有此锁不足以确保事务可以修改表。共享行独占表锁定 (SRX Shared Row eXclusive)
此锁也称为共享子独占表锁 (SSX),比共享表锁更具限制性。一次只有一个事务可以获取给定表上的 SSX 锁。事务持有的 SSX 锁允许其他事务查询表(除外
SELECT ... FOR UPDATE
),但不允许更新表。独占锁 (X eXclusive)
此锁是最严格的,禁止其他事务执行任何类型的 DML 语句或在表上放置任何类型的锁。
锁和外键:锁定行为取决于外键列是否编制索引。如果未为外键编制索引,则子表会全表被锁定,并发性将降低。如果子表指定 ,则从父表中删除可能会导致从子表中删除。
数据字典(DDL)锁在正在进行的DDL操作作用于或引用对象时保护架构对象的定义。
Oracle 代表任何需要它的 DDL 事务自动获取 DDL 锁,用户无法显式请求 DDL 锁。
独占锁(排它锁)可防止其他会话获取 DDL 或 DML 锁,大多数 DDL 操作都需要独占 DDL 锁。
共享DDL 锁可防止对冲突的 DDL 操作进行破坏性干扰,但允许类似 DDL 操作的数据并发。
解析锁由 SQL 语句或 PL/SQL 程序单元为其引用的每个模式对象持有。
获取解析锁,以便在更改或删除引用的对象时使关联的共享 SQL 区域失效。解析锁不允许任何 DDL 操作,并且可以中断以允许冲突的 DDL 操作。
在 SQL 语句执行的解析阶段,在共享池中获取解析锁。只要该语句的共享 SQL 区域保留在共享池中,就会保持锁。
Oracle使用各种类型的系统锁来保护内部数据库和内存结构,用户无法访问这些机制。
Latch闩锁是一种低级序列化机制,用于协调多用户对共享数据结构、对象和文件的访问。
闩锁可保护共享内存资源在被多个进程访问时免受损坏。具体而言,锁存器可保护数据结构免受以下情况的影响:
多个会话并发修改
被一个会话读取,同时被另一个会话修改
访问时内存的释放(老化)
通常,单个闩锁可保护 SGA 中的多个对象。与排队闩锁(如行锁)不同,闩锁不允许会话排队。闭锁的增加意味着并发性的降低,过多的硬解析操作会造成对库缓存闩锁的争用。
互斥对象 (mutex) 是一种低级机制,可防止内存中的对象在并发进程访问时老化或损坏。互斥锁类似于闩锁,但闩锁通常保护一组对象,而互斥锁保护单个对象。
互斥体有几个好处:
互斥锁可以减少争用的可能性。
由于闩锁保护多个对象,因此当进程尝试同时访问其中任何一个对象时,它可能会成为瓶颈。通过序列化对单个对象而不是组的访问,互斥锁提高了可用性。
互斥锁比锁存器消耗更少的内存。
在共享模式下,互斥锁允许多个会话并发引用。
内部锁是比闩锁和互斥锁更高层次、更复杂的机制,具有多种用途。
数据库使用以下类型的内部锁:
字典缓存锁
这些锁的持续时间非常短,在修改或使用条目时保存在字典缓存中的条目上。它们保证正在解析的语句不会看到不一致的对象定义。字典缓存锁可以是共享的,也可以是独占的。共享锁在解析完成时释放,而独占锁在 DDL 操作完成时释放。
文件和日志管理锁
这些锁保护各种文件。例如,内部锁保护控制文件,以便一次只有一个进程可以更改它。另一个锁协调联机重做日志文件的使用和存档。锁定数据文件以确保多个实例以共享模式装入数据库,或者一个实例以独占模式装入数据库。由于文件和日志锁指示文件的状态,因此这些锁必须长时间保持。
表空间和撤消段锁
这些锁可保护表空间并撤消段。例如,访问数据库的所有实例必须就表空间是联机还是脱机达成一致。撤消段已锁定,以便只有一个数据库实例可以写入段。
可以手动覆盖 Oracle 数据库默认锁定机制。
借助 Oracle 数据库锁管理服务,您可以为特定应用定义自己的锁。
事务是包含一个或多个 SQL 语句的逻辑原子工作单元。
事务对 SQL 语句进行分组,以便全部提交(这意味着它们应用于数据库),或者全部回滚,这意味着它们从数据库中撤消。Oracle 数据库为每个事务分配一个称为事务 ID 的唯一标识符。
所有 Oracle 事务都遵循数据库事务的基本属性,称为 ACID 属性。ACID 是以下内容的首字母缩写词:
原子数
事务的所有任务都已执行或不执行。没有部分交易。例如,如果事务开始更新 100 行,但系统在更新 20 行后失败,则数据库会将更改回滚到这 20 行。
一致性
事务将数据库从一个一致状态带到另一个一致状态。例如,在借记储蓄账户并贷记支票账户的银行交易中,故障不得导致数据库仅贷记一个账户,这会导致数据不一致。
隔离
在提交事务之前,事务的效果对其他事务不可见。例如,更新表的一个用户看不到另一个用户同时进行的未提交的更改。因此,在用户看来,事务似乎是串行执行的。
持久性
已提交事务所做的更改是永久性的。事务完成后,数据库通过其恢复机制确保事务中的更改不会丢失。
数据库事务由一个或多个语句组成。具体而言,事务由以下内容之一组成:
一个或多个数据操作语言 (DML) 语句,它们共同构成对数据库的原子更改
一种数据定义语言 (DDL) 语句
事务有开始和结束。
事务在遇到第一个可执行SQL语句时开始。
事务开始时,Oracle会将事务分配给可用的撤消数据段,以记录新事务的撤消条目。在分配撤消段和事务表槽之前,不会分配事务 ID,这发生在第一个 DML 语句期间。事务 ID 对于事务是唯一的,表示撤消段编号、槽和序列号。
事务结束,发生以下任一操作时,事务结束:
语句级原子性,这意味着 SQL 语句是一个原子工作单元,要么完全成功,要么完全失败。
系统更改编号 (SCN) 是 Oracle 数据库使用的逻辑内部时间戳。SCN 对数据库中发生的事件进行排序,以单调递增的顺序出现。
Oracle在系统全局区域 (SGA)中递增 SCN。当事务修改数据时,数据库会将新的 SCN 写入分配给该事务的撤消数据段。然后,日志编写器进程立即将事务的提交记录写入联机重做日志。提交记录具有事务的唯一 SCN, SCN 还是实例恢复和媒体恢复机制的一部分。
事务控制是对 DML 语句所做的更改以及将 DML 语句分组到事务中的管理。
相关语句:Commit永久化、savepoint保存点、rollback撤销这段时间的修改。
事务名称是用户指定的可选标记,用于提醒事务正在执行的工作。
活动事务是已启动但尚未提交或回滚的事务。
保存点是事务上下文中用户声明的中间标记。
未提交事务的回滚会撤消事务中 SQL 语句对数据执行的任何更改:
- 使用相应的撤消段撤消事务中所有 SQL 语句所做的所有更改;
- 释放事务持有的所有数据锁
- 删除事务中的保存点
- 结束事务
提交结束当前事务,并使事务中执行的所有更改永久化:
- 数据库生成唯一的scn;
- 日志编写器进程 (LGWR) 进程将重做日志缓冲区中的剩余重做日志条目写入联机重做日志,并将事务 SCN 写入联机重做日志。
- 释放对行和表的锁定。
- 删除事务中的保存点
- Oracle 数据库执行提交清理。
- 数据库将事务标记为完成。
事务提交后,用户可以查看更改。提交的速度不会随着事务中修改的数据大小而增加,提交中最长的部分是 LGWR 执行的物理磁盘 I/O。但是,LGWR 花费的时间减少了,因为它一直在后台以增量方式写入重做日志缓冲区的内容。
从 Oracle 数据库 12c 开始,事务防护为应用程序提供了一种工具,用于在可恢复中断后确定正在进行的事务的状态。在 Oracle12c 之前,返回到客户端的提交消息不是持久性的。
下图是客户端应用程序和数据库之间交互的高级表示形式。
标准提交情况下,数据库提交事务并向客户端返回成功消息。在图 10-2 中,客户端提交一个 commit 语句并收到一条消息,指出通信失败。在这种情况下,客户端不知道事务的状态。
通信失败后,数据库可能仍在运行提交,并且不知道客户端已断开连接。检查事务状态并不能保证活动事务在检查后不会提交。如果客户端由于此信息过期而重新发送提交,则数据库可能会重复该事务,从而导致逻辑损坏。
Oracle 数据库通过使用称为逻辑事务 ID 的全局唯一标识符来解决通信故障,逻辑事务ID唯一标识在失败的会话上提交的最后一个数据库事务。
对于从客户端提交一个或多个事务的每个往返行程,数据库将存储一个逻辑事务 ID。此 ID 可以为提交数据的每次往返访问的应用程序与数据库之间的交互提供事务幂等性。
最多一次协议通过要求数据库执行以下操作来访问提交结果:
在约定的重试保留期内维护逻辑事务 ID
提交时保留逻辑事务 ID
在事务运行时,数据库和客户端都持有逻辑事务 ID。数据库在身份验证时、从连接池借用时以及每次从执行一个或多个提交操作的客户端驱动程序的往返时为客户端提供逻辑事务 ID。
使用事务防护时,当错误可恢复且会话上的最后一个事务尚未提交时,应用程序可以重播事务。当最后一个事务提交且用户调用已完成时,应用程序可以继续。应用程序可以使用事务保护将已知结果返回到客户端,以便客户端可以决定要执行的下一个操作。
应用程序连续性尝试通过在计划外和计划内中断后重播不完整的应用程序请求来屏蔽应用程序的中断。在此上下文中,请求是应用程序的工作单元,请求由从连接池签出和签入数据库连接之间进行的调用来划分。
应用程序连续性的关键组件是运行时、重新连接和重播。阶段如下:
正常运行时间
在此阶段,应用程序连续性执行以下任务:
识别数据库请求
确定本地调用和数据库调用是否可重放
构建代理对象以启用重播(如有必要)和管理队列
保留原始调用并验证这些调用,直到数据库请求结束或重播被禁用
重新连接
此阶段由可恢复的错误触发。应用程序连续性执行以下任务:
确保为数据库请求启用重播
管理超时
获取与数据库的新连接,然后验证这是有效的数据库目标
使用事务防护确定最后一个事务是否成功提交(不会重新提交已提交的事务)
重播
应用程序连续性执行以下任务:
重播队列中保留的呼叫
如果在重播期间出现用户可见的结果更改,则禁用重播
不允许提交,但允许提交最后一次调用(遇到错误)
成功重播后,请求将从故障点继续。
自治事务是可以从另一个事务(即主事务)调用的独立事务,特征:
自治事务不会看到主事务所做的未提交的更改,并且不会与主事务共享锁或资源。
提交自治事务时,自治事务中的更改对其他事务可见。因此,用户可以访问更新的信息,而无需等待主事务提交。
自治事务可以启动其他自治事务。除了资源限制之外,对可以调用的自治事务级别没有限制。
分布式事务是包含一个或多个语句的事务,这些语句使用称为数据库链接的架构对象更新分布式数据库的两个或多个不同节点上的数据。
与本地数据库上的事务不同,分布式事务更改多个数据库上的数据。
两阶段提交机制保证参与分布式事务的所有数据库要么全部提交,要么全部撤消事务中的语句。当两阶段提交被任何类型的系统或网络故障中断时,就会发生可疑分布式事务。
关系数据库系统RDBMS的一个特征是逻辑数据结构(如表、视图和索引)独立于物理存储结构。
由于物理结构和逻辑结构是分开的,因此您可以管理数据的物理存储,而不会影响对逻辑结构的访问。Create database 发出生成的数据文件:
Oracle ASM 是适用于 Oracl文件的高性能、易于管理的存储解决方案。Oracle ASM 是一个卷管理器,提供专为数据库使用而设计的文件系统,并为数据库提供了高性能、可扩展和可靠的存储解决方案。
Oracle ASM磁盘是调配到Oracle ASM磁盘组的存储设备,可以是物理磁盘或分区、存储阵列中的逻辑单元号(LUN)、逻辑卷或网络连接文件。可以在数据库运行时在磁盘组中添加或删除 Oracle ASM 磁盘。
Oracle ASM磁盘组是作为逻辑单元管理的Oracle ASM磁盘的集合。磁盘组中的数据结构是独立的,会占用磁盘组中的一些磁盘空间。
Oracle ASM文件是存储在Oracle ASM磁盘组中的文件。数据库可以将数据文件、控制文件、联机重做日志文件和其他类型的文件存储为 Oracle ASM 文件。
Oracle ASM扩展区是Oracle ASM文件的一部分。ASM文件由一个或多个文件扩展区组成。每个 Oracle ASM 扩展数据块由特定磁盘上的一个或多个分配单元组成。
Oracle ASM分配单元是磁盘组内的基本分配单元。分配单元是 Oracle ASM 分配的最小连续磁盘空间。
Oracle ASM实例是管理Oracle ASM磁盘的特殊Oracle实例。
Oracle ASM 实例基于与数据库实例相同的技术构建。例如,Oracle ASM 实例具有与数据库实例类似的系统全局区域(SGA) 和后台进程。
Oracle托管文件是一种文件命名策略,使您能够根据数据库对象而不是文件名指定操作,可以在不指定其数据文件名称的情况下创建表空间。
在操作系统级别,Oracle将数据库数据存储在称为数据文件的结构中,每个 Oracle 数据库必须至少有一个数据文件,Oracle以物理方式将表空间数据存储在数据文件中。
每个未分区的模式对象和对象的每个分区都存储在其自己的段中,该段仅属于一个表空间。表空间和数据文件密切相关,但有重要区别:
- 表空间由一个或多个数据文件组成;
- 数据库的数据存储在每个表空间中的数据文件中;
- 段可以跨越一个或多个数据文件,但不能跨越多个表空间;
- 数据库必须具有SYSTEM和SYSAUX表空间。在数据库创建过程中,Oracle会自动为SYSTEM对象分配任何数据库的第一个数据文件。SYSTEM数据库包含数据字典,一组包含数据库元数据的表。通常,数据库还有一个撤消表空间和一个临时表空间(TEMP)。
下图显示了表空间、数据文件和段之间的关系。
永久表空间包含持久性架构对象。永久表空间中的对象存储在数据文件中
临时表空间仅在会话期间包含模式对象。本地管理的临时表空间具有临时文件(临时文件),它们是旨在以哈希、排序和其他操作存储数据的特殊文件。临时文件还会在内存空间不足时存储结果集数据。
临时表空间类似于永久表空间,但以下情况除外:
每个数据文件都处于联机(可用)或脱机(不可用)状态。从12c开始,可以使用ALTER DATABASE MOVE DATAFILE语句在数据库打开并访问联机数据文件时将该文件从一个物理文件移动到另一个物理文件。您可以使用此技术来实现以下目标:
将表空间从一种存储移动到另一种存储
将不常访问的数据文件移动到成本较低的存储
将表空间设为只读,并将其数据文件移动到一次写入存储,例如一次写入多次读取 (WORM) 驱动器
将数据库移动到 Oracle ASM 中
Oracle通过分配指定的磁盘空间量加上数据文件头的开销,为表空间创建数据文件。数据文件头包含有关数据文件的元数据。每个标头都包含一个绝对文件编号(唯一标识数据库中的数据文件)和一个相对文件编号(唯一标识表空间中的数据文件)。
当 Oracle首次创建数据文件时,分配的磁盘空间将被格式化,但不包含任何用户数据。
数据库控制文件是一个仅与一个数据库关联的小型二进制文件。每个数据库都有一个唯一的控制文件,但允许多个相同的副本。
Oracle 数据库使用控制文件来查找数据库文件并管理数据库的状态。
控制文件包含如下信息:
数据库名称和数据库唯一标识符 (DBID)
数据库创建的时间戳
有关数据文件、联机重做日志文件和存档重做日志文件的信息
表空间信息
RMAN 备份
控制文件用于以下用途:
Oracle 在数据库使用期间连续读取和写入控制文件,并且必须在数据库打开时可供写入。
Oracle支持同时打开多个相同的控制文件并将其写入同一数据库。通过在不同磁盘上多路复用控制文件,数据库可以实现冗余,从而避免单点故障。Oracle 建议维护多个控制文件副本,每个副本位于不同的磁盘上。
有关数据库的信息存储在控制文件的不同部分中,每个部分都是有关数据库某个方面的一组记录。
控制文件包含以下类型的记录:
读和写控制文件块不同于读和写数据块。对于控制文件,Oracle数据库直接从磁盘读取和写入程序全局区域(PGA)。每个进程分配一定数量的PGA内存用于控制文件块。
恢复的最关键结构是联机重做日志,联机重做日志记录对数据文件的更改,由两个或多个预分配的文件组成。
数据库维护联机重做日志文件以防止数据丢失,服务器进程将每个事务同步写入重做日志缓冲区,然后 LGWR进程将其写入联机重做日志。当数据库更改撤消段时,数据库也会将这些更改写入联机重做日志。因此,联机重做日志始终包含永久对象的撤消数据。
数据库实例的联机重做日志称为重做线程。
单实例配置中,只有一个实例访问数据库,因此只存在一个重做线程。RAC中,每个实例都有自己的重做线程。联机重做日志由两个或多个联机重做日志文件组成,Oracle至少需要两个文件,以确保一个文件始终可供写入,以防另一个文件正在清除或存档过程中。
Oracle一次仅使用一个联机重做日志文件来存储从重做日志缓冲区写入的记录。
日志编写器进程 (LGWR)进程主动写入的联机重做日志文件称为当前联机重做日志文件。
当数据库停止写入一个联机重做日志文件并开始写入另一个日志文件时,将发生日志切换。通常,当当前联机重做日志文件已满且必须继续写入时,会发生切换。但是,您可以将日志切换配置为定期进行,而不管当前联机重做日志文件是否已填满,并手动强制日志切换。
日志编写器循环写入联机重做日志文件。当日志编写器填充最后一个可用的联机重做日志文件时,进程将写入第一个日志文件,重新启动循环。图 11-6 说明了重做日志的循环写入。
当日志切换并且日志编写器开始写入每个文件时,数据库会为每个文件分配一个新的日志序列号。当数据库重用联机重做日志文件时,此文件将接收下一个可用的日志序列号。
Oracle可以在不同的位置自动维护两个或多个相同的在线重做日志副本。
联机重做日志组由联机重做日志文件及其冗余副本组成。每个相同的副本都是联机重做日志组的成员。每个组由一个数字定义,例如组1、组2等。理想情况下,成员的位置应位于单独的磁盘上,以便一个磁盘的故障不会导致整个联机重做日志丢失。
在图11-7中,A_LOG1和B_LOG1是组1的相同成员,而A_LOG2和B_LOG2是组2的相同成员。组中的每个成员的大小必须相同。LGWR并发写入组1(成员A_LOG1和B_LOG1),然后并发写入组2(成员A_LOG2和B_LOG2),然后写入组1,依此类推。LGWR从不同时写入不同组的成员。Oracle 建议多路复用联机重做日志。
存档的重做日志文件是联机重做日志组的已填充成员的副本。该文件不被视为数据库的一部分,而是由数据库创建并写入用户指定位置的联机重做日志文件的脱机副本。
存档的重做日志文件是备份和恢复策略的关键部分。您可以使用存档的重做日志文件执行以下操作:
恢复数据库备份
更新备用数据库
使用 Oracle LogMiner 实用程序获取有关数据库历史记录的信息
生成归档重做日志文件的操作称为归档。该操作可以是自动的,也可以是手动的。只有当数据库处于ARCHIVELOG模式时才可能。
归档的重做日志文件包括重做条目和相同成员的联机重做日志组的日志序列号。如果数据库处于ARCHIVELOG模式,并且启用自动存档,则存档程序进程(ARCn)将存档其中一个文件。如果A_LOG1损坏,则进程存档B_LOG1。归档的重做日志包含从启用归档开始存在的每个重做日志组的副本。
联机重做日志文件包含重做记录,重做记录具有更改的所有相关元数据,包括以下内容:
更改的 SCN 和时间戳
生成更改的事务的事务 ID
提交事务(如果已提交)时的 SCN 和时间戳
进行更改的操作类型
修改后的数据细分受众群的名称和类型
Oracle为数据库中的所有数据分配逻辑空间。
数据库空间分配的逻辑单元是数据块、扩展数据块、段和表空间。在物理级别,数据存储在磁盘上的数据文件中。数据文件中的数据存储在操作系统块中。
段包含一个或多个区段,每个区段包含多个数据块。
在12-2示例中,一个段具有存储在不同数据文件中的两个扩展数据块。
数据块是 Oracle 数据库中数据存储的最小逻辑单元:一个逻辑数据块对应于特定数量的物理磁盘空间字节,例如 2 KB;
区段extent是一组逻辑上连续的数据块,分配用于存储特定类型的信息;
段是为特定数据库对象分配的一组区:例如,employees表的数据存储在其自己的数据段中,而employees的每个索引存储在其自己的索引段中。每个消耗存储的数据库对象都由单个段组成;
Oracle必须使用逻辑空间管理来跟踪和分配表空间中的扩展数据块。
Oracle 数据库根据您创建的类型管理表空间中的空间。您可以创建以下任一类型的表空间:
本地管理的表空间(默认)
数据库使用表空间本身中的位图来管理扩展数据块。因此,本地管理的表空间为位图留出了一部分表空间。在表空间中,数据库可以使用自动段空间管理(ASSM)或手动段空间管理 (MSSM)来管理段。
字典管理的表空间
数据库使用数据字典来管理盘区。
本地管理的表空间在数据文件头中维护一个位图,以跟踪数据文件体中的可用空间和已用空间,每个比特对应于一组块。分配或释放空间时,Oracle会更改位图值以反映块的新状态。下图是位图管理存储的概念表示。标头中的1表示已用空间,而0表示可用空间。
本地管理的表空间具有以下优点:
避免使用数据字典管理盘区
如果消耗或释放扩展数据块中的空间会导致另一个操作消耗或释放数据字典表或撤消段中的空间,则递归操作可能会在字典管理的表空间中发生。
自动跟踪相邻的可用空间
这样,数据库就无需合并自由盘区。
自动确定本地管理的盘区的大小
或者,所有扩展数据块在本地管理的表空间中可以具有相同的大小,并覆盖对象存储选项。
段空间管理是从包含段的表空间继承的属性。在本地管理的表空间中,数据库可以自动或手动管理段。例如,可以自动管理表空间用户中的段,而手动管理表空间工具中的段。
自动段空间管理 (ASSM) 方法使用位图来管理表空间中的空间。ASSM效率更高,并且是永久的、本地管理的表空间的默认值。
位图具有以下优点:简化管理、提高可用性(多个事务可以搜索单独的可用数据块列表,从而减少争用和等待)、RAC环境中空间与实例的动态关联
传统的手动段空间管理(MSSM) 方法使用称为可用列表的链表来管理段中的可用空间。对于具有可用空间的数据库对象,空闲列表会跟踪高水位标记(hwm)下的块,高水位标记 (HWM) 是已使用和尚未使用的段空间之间的分界线。
除了PCTFREE之外,MSSM还要求您使用SQL参数来控制空间分配。PCTUSED设置当前使用的块中必须存在的可用空间的百分比,以便数据库将其放入空闲列表中。
一个对象可能有多个空闲列表,对表执行 DML 的多个会话可以使用不同的列表,这可以减少争用。每个数据库会话在其会话期间仅使用一个空闲列表。
可以创建具有一个或多个空闲列表组的对象,这些组是空闲列表的集合。每个组都有一个主自由列表,用于管理组中的各个进程空闲列表。免费列表(组)的空间开销可能很大。
手动管理段空间可能很复杂。必须调整PCTFREE和PCTUSED以减少行迁移并避免浪费空间。
字典管理的表空间使用数据字典来管理其扩展数据块。
每当分配或释放数据块以供重用时,Oracle 数据库都会更新数据字典中的表。例如,当表需要扩展数据块时,数据库将查询数据字典表并搜索空闲扩展数据块。如果数据库找到空间,则修改一个数据字典表,并在另一个数据字典表中插入一行。通过这种方式,数据库通过修改和移动数据来管理空间。
数据库在后台执行以获取数据库对象空间的SQL是递归 SQL。频繁使用递归SQL可能会对性能产生负面影响,因为必须序列化对数据字典的更新。本地管理的表空间(缺省值)可避免此性能问题。
Oracle用数据块(也称为 Oracle 块或页面),管理数据库数据文件中的逻辑存储空间。数据块是数据库 I/O 的最小单位。
在物理级别,数据库数据存储在由操作系统块组成的磁盘文件中。
操作系统块是操作系统可以读取或写入的最小数据单位。相反,Oracle 块是一种逻辑存储结构,其大小和结构对操作系统来说是未知的 。
操作系统块的大小可能与数据块不同,数据库请求多个数据块中的数据,而不是操作系统块。
当数据库请求数据块时,操作系统会将此操作转换为对永久存储中的数据的请求。数据块与操作系统块的逻辑分离具有以下含义:
应用程序不需要确定磁盘上数据的物理地址。
数据库数据可以在多个物理磁盘上进行条带化或镜像。
DB_BLOCK_SIZE初始化参数设置数据库创建时的数据块大小,是由SYSTEM和SYSAUX表空间设置的,并且是所有其他表空间的默认值。如果未设置DB_BLOCK_SIZE,则默认数据块大小是特定于操作系统的。数据库的标准数据块大小为4 KB或8 KB。如果数据块和操作系统块的大小不同,则数据块大小必须是操作系统块大小的倍数。
可以创建块大小与DB_BLOCK_SIZE设置不同的单个表空间。
每个数据块都有一个格式或内部结构,使数据库能够跟踪块中的数据和可用空间。无论数据块包含表、索引还是表集群数据,此格式都是相似的。未压缩数据块的格式:
Oracle数据库使用块开销来管理块本身。块开销不可用于存储用户数据。
块的行数据部分包含实际数据,例如表行或索引键条目。正如每个数据块都有内部格式一样,每一行都有一种行格式, 如“数据块格式”所示,块开销包括以下部分:
块头:包含有关块的一般信息,包括磁盘地址和段类型。对于交易管理的区块,区块头包含活动和历史交易信息。每个更新区块的交易都需要一个交易条目,Oracle最初在块头中为事务条目保留空间,大多数操作系统中的事务条目大约需要 23 个字节。;
表目录:对于堆组织的表,此目录包含有关其行存储在此块中的表的元数据。在表集群中,多个表可以在同一块中存储行;
行目录:对于堆组织的表,此目录描述块的数据部分中行的位置。数据库可以在块底部的任何位置放置一行。行地址记录在行目录向量的一个插槽中。
块开销的某些部分的大小是固定的,但总大小是可变的。平均而言,块开销总计为 84 到 107 字节。
块的行数据部分包含实际数据,例如表行或索引键条目。正如每个数据块都有内部格式一样,每一行都有一种行格式,使数据库能够跟踪行中的数据。
Oracle 数据库将行存储为可变长度记录。行包含在一个或多个部分中。每个部分称为一个行段。每个行段都有一个行标题和列数据。
下图显示了行的格式。
Oracle 数据库使用行标题来管理存储在块中的行段。一个块中完全包含的行至少具有 3 个字节的行标头。
在行标题之后,列数据部分存储行中的实际数据。行块通常按CREATE TABLE语句中列出的顺序存储列,但不保证此顺序。例如,LONG类型的列最后创建。
Oracle 使用 rowid 来唯一标识行。在内部,rowid 是一个结构,用于保存数据库访问行所需的信息。rowid 不是物理存储在数据库中,而是从存储数据的文件和块推断出来的。
扩展的 rowid 以四件式格式显示,格式分为以下组件:
OOOOOOFFFBBBBBBRRR
OOOOOO
数据对象编号标识段(示例查询中的数据对象AAAPec)。数据对象编号被分配给每个数据库段。同一段中的架构对象(如表簇)具有相同的数据对象编号。
FFF
表空间相对数据文件编号标识包含行的数据文件(示例
AAF
查询中的文件)。
BBBBBB
数据块号标识包含行的块(示例查询中的块AAAABS)。数据块编号是相对于其数据文件的,而不是相对于其数据块的。因此,具有相同块号的两行可以驻留在同一块的不同数据文件中。
RRR
行号标识块中的行(示例查询中的行
AAA
)。
将 rowid 分配给行段后,rowid 可以在特殊情况下更改。例如,如果启用了行移动,则 rowid 可能会因为分区键更新、闪回表操作、收缩表操作等而更改。如果禁用了行移动,则在使用 Oracle 数据库实用程序导出和导入行时,rowid 可能会更改。
数据库可以使用表压缩来消除数据块中的重复值。使用基本表和高级行压缩的数据块的格式与未压缩块基本相同。不同之处在于块开头的符号表存储行和列的重复值。数据库将这些值的出现替换为对符号表的简短引用。
当数据库自下而上填充数据块时,行数据和块头之间的可用空间量会减少。
PCTFREE SQL参数设置为更新现有行而保留的数据块的最小可用空间百分比。PCTFREE对于防止行迁移和避免浪费空间非常重要。
某些DML 语句可以增加数据块中的可用空间,DELETE、UPDATE将现有值更新为较小值或增加现有值并强制迁移行的语句、INSERT使用高级行压缩的表上的语句。
通过合并碎片空间进行优化
释放的空间可能与数据块中可用空间的主区域相邻或不相邻,非连续自由空间称为碎片空间。当insert、update语句需要足够大的空间来包含新的段,并且当前最大自由空间放不下的情况,Oracle自动、透明地合并数据块的可用空间。
Oracle仅在上述情况下执行合并,否则性能会因为数据块中可用空间的连续合并而降低。
Oracle使用链接和迁移来管理太大而无法放入单个块的行。
在行链中,Oracle将行的数据存储在为段保留的一个或多个数据块链中;
在行迁移中,Oracle会将整行移动到新的数据块,前提是该行可以放入新块中;
Oracle只能在一行中存储 255 列。
13描述了在数据块中插入大行的过程。该行对于左侧块来说太大,因此数据库通过将第一行段放在左块中,将第二行段放在右块中来链接行。
14左侧块包含一行,该行已更新,因此该行现在对于该块来说太大。数据库将整行移动到右侧块,并在左侧块中保留指向迁移行的指针。
链接或迁移行时,检索数据所需的 I/O 会增加,Oracle必须扫描多个块才能检索行的信息。
索引块是一种特殊类型的数据块,其管理空间的方式与表块不同。Oracle使用索引块来管理索引中的逻辑存储空间。
索引包含根块、分支块和叶块。
块类型定义如下:
根块:此块标识索引的入口点。
分支块:数据库在搜索索引键时在分支块中导航。
叶块:这些块包含指向关联行的索引键值 rowid。叶块按排序顺序存储键值,以便数据库可以有效地搜索键值范围内的所有行。
索引条目存储在索引块中的方式与数据块中的表行相同,块部分中的索引条目不按二进制顺序存储,而是存储在堆中。行目录中条目的排序提高了索引扫描的效率。在范围扫描中,数据库必须读取范围中指定的所有索引键。数据库遍历分支块以标识包含第一个键的叶块。
数据库可以重用索引块中的空间。索引块通常比堆组织的表块有更多的行,在单个索引块中存储很多的行使数据库更容易维护索引,因为它避免了频繁拆分块以存储新数据。
索引合并将现有索引数据压缩到位,如果重组释放块,则在索引结构中保留空闲块。因此,合并不会释放索引块用于其他用途,也不会导致索引重新分配块。
15 显示了合并索引之前的列索引,前三个叶块仅部分已满,如灰色填充线所示。
16 显示了合并索引后的的索引,前两个叶块现在已满,第三个叶块已释放。
扩展数据块是由逻辑上连续的数据块组成的数据库存储单元。由于RAID条带化和文件系统的实现,数据块可以在物理上分散在磁盘上。
默认情况下,数据库会在创建数据段时为其分配初始范围。范围始终包含在一个数据文件中。
如果初始扩展数据块已满,并且需要更多空间,则数据库会自动为此段分配增量扩展数据块。增量范围是为线段创建的后续范围。
分配算法取决于表空间是本地管理的还是字典管理的。在本地管理的情况下,数据库在数据文件的位图中搜索相邻的空闲块。如果数据文件空间不足,则数据库将在另一个数据文件中查找。段的扩展数据块始终位于同一表空间中,但可能位于不同的数据文件中。
每个分段都由以扩展数据块表示的存储参数定义,这些参数控制 Oracle如何为段分配可用空间。存储设置按以下优先级顺序确定,列表中较高的设置将覆盖列表较低的设置:
段存储子句、表空间存储子句、Oracle数据库默认值。
本地管理的表空间可以具有统一的扩展数据块大小,也可以具有由系统自动确定的可变扩展数据块大小。对于本地管理的表空间,无法在表空间级别指定某些存储参数。
段是一组扩展数据块,其中包含表空间中逻辑存储结构的所有数据。Oracle分配一个或多个扩展数据块以形成表的数据段或者表上索引的索引段,Oracle自动或手动管理段空间。
数据库中的单个数据段存储一个用户对象的数据。用户细分的示例包括:
表、表分区或表集群
LOB 或 LOB 分区
索引或索引分区
默认情况下,数据库使用延迟段创建在创建表、索引和分区时仅更新数据库元数据。
当用户将第一行插入表或分区时,数据库将为表或分区、其 LOB 列及其索引创建段。延迟段创建可避免不必要地使用数据库资源。
延迟区段创建已禁用,创建用户段,多个段:
对象的存储参数确定如何分配每个段的扩展数据块,这些参数会影响与对象关联的数据段的数据检索和存储效率。
处理查询时,Oracle通常需要临时工作区来执行 SQL 语句的中间阶段。
在创建索引时,Oracle还会将索引段放入临时段中,然后在索引完成后将其转换为永久段。如果可以在内存中执行操作,Oracle不会创建临时段,如果不可以,则会自动在磁盘上分配一个临时段。
由于临时段的分配和释放经常发生,因此最好为临时段创建至少一个特殊表空间。数据库跨磁盘分布I/O,并避免使用临时段对SYSTEM和其他表空间进行分段。
Oracle可以为临时表及其索引分配临时段,临时表保存仅在事务或会话期间存在的数据。每个会话仅访问为其自身分配的盘区,而无法访问为其他会话分配的盘区。
Oracle 维护事务操作的记录,统称为撤消数据,Oracle使用撤消数据执行以下操作:
Oracle将撤消数据存储在数据库内,而不是外部日志中。撤消数据存储在与数据块一样更新的块中,对这些块的更改会生成重做记录。
永久对象的撤消数据存储在撤消表空间中。Oracle提供了一种完全自动化的机制(称为自动撤消管理模式),用于管理撤消表空间中的撤消段和空间。
当事务启动时,数据库将事务绑定(分配)到当前撤消表空间中的撤消段,从而绑定(分配)到事务表。多个活动事务可以同时写入同一撤消段或不同的段。
从概念上讲,撤消段中的范围形成一个环。事务写入一个撤消范围,然后写入环中的下一个范围,依此类推。在任何给定时间,事务仅按顺序写入撤消段中的一个扩展数据块,称为事务的当前扩展数据块。多个活动事务可以同时写入相同或者不同的数据块。
发出语句时,数据库使用撤消记录回滚未提交的事务对数据库所做的更改。
临时撤消段是仅用于临时撤消数据的可选空间管理容器。
为了管理空间,Oracle 数据库会跟踪分段中块的状态。高水位线 (HWM) 是段中的点,超过该点的数据块未格式化且从未使用过。低高水位线(低 HWM)标记已知所有块都已格式化的点,因为它们包含数据或以前包含的数据。
表空间是段的逻辑存储容器。段是占用存储空间的数据库对象,例如表和索引。在物理级别,表空间将数据存储在一个或多个数据文件或临时文件中。
数据库必须具有SYSTEM和SYSAUX表空间。
永久表空间对持久模式对象进行分组。表空间中对象的段以物理方式存储在数据文件中。
每个数据库用户都被分配了一个默认的永久权限,一个非常小的数据库可能只需要默认的SYSTEM和SYSAUX表空间。表空间的作用:
制数据库数据的磁盘空间分配
为数据库用户分配配额(空间限额或限制)
使单个表空间联机或脱机,而不会影响整个数据库的可用性
执行单个表空间的备份和恢复
使用 Oracle 数据泵实用程序导入或导出应用程序数据
创建一个可传输的表空间,您可以将该表空间从一个数据库复制或移动到另一个数据库,甚至可以跨平台
通过传输表空间来移动数据可能比导出/导入或卸载/加载相同数据快几个数量级,因为传输表空间仅涉及复制数据文件和集成表空间元数据。传输表空间时,还可以移动索引数据。
默认情况下,Oracle将所有新创建的用户表空间设置为本地管理。但是,如果您手动执行语句并接受默认值,则表空间将受到字典管理。
注:建议使用(DBCA)创建新数据库,以便默认情况下本地管理所有表空间,包括SYSTEM。
SYSAUX接口是SYSTEM接口的辅助接口。由于SYSAUX是许多以前的Oracle功能和产品的默认配置文件,因此它减少了数据库所需的表空间数量,它还减少了系统负载。
数据库创建或升级会自动创建SYSAUX对象。在正常的数据库操作过程中,数据库不允许删除或重命名SYSAUX对象。如果SYSAUX表空间变得不可用,则核心数据库功能仍然可以运行,但使用SYSAUX的数据库功能可能会失败,或者功能有限。
撤消表空间是为系统管理的撤消数据保留的本地管理的表空间。
与其他永久表空间一样,撤消表空间包含数据文件。这些文件中的撤消块按范围分组。
自动撤消管理模式
撤消表空间要求数据库处于默认的自动撤消模式。
自动模式消除了手动管理撤消段的复杂性。数据库会自动调整自身,以提供撤消数据的最佳保留,从而满足可能需要此数据的长时间运行的查询。
新安装的 Oracle会自动创建撤消表空间。 Oracle11g 或更高版本时,可以启用自动撤消管理模式并创建撤消表空间。Oracle数据库包含一个Undo Advisor,它提供有关撤消环境的建议并帮助实现撤消环境的自动化。
一个数据库可以包含多个撤消表空间,但一次只能使用一个。当实例尝试打开数据库时,Oracle会自动选择第一个可用的撤消表空间,如果没有,则实例将在没有撤消表空间的情况启动,并将撤消数据存储在SYSTEM中。不建议在SYSTEM中存储撤消数据。
影子表空间是用于影子丢失写保护的大文件表空间。
阴影丢失写保护提供快速检测和对丢失写的即时响应。
当 I/O 子系统确认块写入完成(即使写入未发生)或块的先前映像覆盖当前映像时,会发生数据块丢失写入。
未检测到的丢失写入可能会导致数据损坏,因为不正确的数据可用于其他 DML 事务。例如,事务可以从一个表中读取旧的和不正确的数据,然后基于此数据更新数百个其他表。这样,数据损坏可以蔓延到整个数据库。
卷影丢失写保护具有以下优点:
它会在标准 DML、SQL*加载程序常规路径加载、直接路径加载和 RMAN 备份使用丢失的写入之前检测到丢失的写入。
不需要备用数据库,如 Oracle 数据库 11g 中引入的丢失写保护。
您可以为特定表空间和数据文件启用卷影丢失写保护。您不需要跟踪所有数据。
您可以将一个影子表空间替换为另一个影子表空间以更改其配置或位置。
您可以暂停和恢复表空间或数据文件的卷影丢失写保护。
您可以使用单个语句
ALTER DATABASE ... LOST WRITE TRACKING
PROP$
为整个非 CDB 或 PDB 启用或禁用它。请注意,该表指示是否为 PDB 启用跟踪。
失去写保护需要两个表空间:影子表空间和被跟踪的非影子表空间。下图提供了一个场景示例。表空间TBS1和TBS2中的数据文件都由影子表空间跟踪,只跟踪表空间TBS3中的数据文件DBF6。
临时表空间包含仅在会话期间保留的瞬态数据,任何永久模式对象都不能驻留在临时表空间中,临时文件存储临时表空间数据。临时表空间可以提高内存中不适合的多个排序操作的并发性。这些表空间还提高了排序期间空间管理操作的效率。
临时表空间可以是共享的,也可以是本地的。共享临时表空间将临时文件存储在共享磁盘上,以便数据库实例都可以访问临时空间。相反,本地临时表空间为每个数据库实例存储单独的非共享临时文件。本地临时表空间是12c新加的,提到临时表空间一般指共享。
如果用户分配了临时表空间,则数据库首先访问它;否则,数据库将访问默认临时表空间。数据库访问查询的临时表空间后,不会切换到其他表空间。
用户可以为只读实例分配一个默认本地临时表空间,并为读/写实例分配另一个默认本地临时表空间。对于读/写实例,数据库为共享临时表空间提供更高的优先级。对于只读实例,数据库会为本地临时表空间提供更高的优先级。
访问读写实例的临时表空间:共享、本地、默认;
访问只读实例的临时表空间:本地、默认、共享。
表空间模式决定了表空间的可访问性。
每个表空间都处于写入模式,该模式指定是否可以写入。
互斥模式如下:
读/写模式
用户可以读取和写入表空间。所有表空间最初都创建为读/写。
SYSTEM
和SYSAUX
表空间和临时表空间是永久读/写的,这意味着它们不能设置为只读。只读模式
阻止对表空间中的数据文件执行写入操作。只读表空间可以驻留在只读介质(如 DVD 或 WORM 驱动器)上。
只读表空间消除了对数据库的大型静态部分执行备份和恢复的需要。只读表空间不会更改,因此不需要重复备份。如果在介质故障后恢复数据库,则不需要恢复只读表空间。
只要数据库处于打开状态,表空间就可以处于联机(可访问)或脱机(不可访问)。
表空间通常是在线的,以便用户可以使用其数据。SYSTEM
表空间和临时表空间不能脱机。
表空间可以自动或手动脱机。例如,您可以使表空间脱机以进行维护或备份和恢复。当遇到某些错误时,数据库会自动使表空间脱机,例如当数据库编写器 (DBW) 进程多次尝试写入数据文件时失败时。尝试访问脱机表空间中的表的用户会收到错误。
当表空间脱机时,数据库将执行以下操作:
数据库不允许后续 DML 语句引用脱机表空间中的对象。脱机表空间不能由 Oracle以外的任何实用程序读取或编辑。
具有引用该表空间中的数据的已完成语句的活动事务在事务级别不受影响。
数据库将与这些已完成语句对应的撤消数据保存在
SYSTEM
表空间的延迟撤消段中。当表空间联机时,数据库会根据需要将撤消数据应用于表空间。
表空间可以是大文件表空间或小文件表空间。这些表空间在执行未显式引用数据文件或临时文件的 SQL 语句方面无法区分。
区别如下:
小文件表空间可以包含多个数据文件或临时文件,但这些文件不能像大文件表空间中一样大。这是默认表空间类型。
大文件表空间包含一个非常大的数据文件或临时文件。这种类型的表空间可以执行以下操作:
增加数据库的存储容量
数据库中数据文件的最大数量是有限的,因此增加每个数据文件的大小会增加总体存储。
减轻管理许多数据文件和临时文件的负担
大文件表空间通过 Oracle 托管文件和自动存储管理 (Oracle ASM) 简化了文件管理,无需添加新文件和处理多个文件。
对表空间而不是单个文件执行操作
大文件表空间使表空间成为磁盘空间管理、备份和恢复等的主要单元。
大文件表空间仅支持具有 ASSM 的本地管理的表空间。但是,本地管理的撤消和临时表空间可以是大文件表空间,即使手动管理段也是如此。
数据库实例是一组管理数据库文件的内存结构。在物理级别,CDB(Container Database)是由语句创建的磁盘上的一组文件,CDB 包含一个或多个用户创建的 PDB(Pluggable Database),PDB 是 整个CDB 的数据文件集中己的一组数据文件。
每个正在运行的 CDB 都至少与一个 Oracle实例相关联。因为实例存在于内存中,而数据库(在最狭义的意义上)是磁盘上的一组文件,所以实例可以在没有数据库的情况下存在,数据库可以在没有实例的情况下存在。
启动实例时,Oracle会分配一个称为系统全局区域 (SGA) 的内存区域,并启动一个或多个后台进程。SGA有多种用途,包括:
维护许多进程和线程同时访问的内部数据结构
缓存从磁盘读取的数据块
在将重做数据写入联机重做日志文件之前缓冲重做数据
存储 SQL 执行计划
在单台计算机上运行的 Oracle 进程共享 SGA。Oracle 进程与 SGA 关联的方式因操作系统而异。
数据库实例包括后台进程。服务器进程以及在这些进程中分配的进程内存也存在于实例中。当服务器进程终止时,实例将继续运行。
在单实例配置中,数据库和数据库实例之间存在一对一关系。在 Oracle RAC 中,数据库和数据库实例之间存在一对多关系。无论是在单实例还是 Oracle RAC 配置中,数据库实例一次只与一个数据库关联。
12c以后数据库实例可以存在只读实例,以前都是读写实例。
数据库实例在使用STARTUP命令创建时开始,在终止时结束。
Oracle 最佳灵活架构 (OFA) 规则是一组配置准则,旨在确保 Oracle 安装井井有条。
Oracle基目录存储Oracle产品的二进制文件:u01/app/oracle。
Oracle 主目录是 Oracle的软件位置/u01/app/oracle/product/12.1.0/dbhome_1。
系统标识符 (SID) 是特定主机上 Oracle 数据库实例的唯一名称。Oracle使用 SID 和 Oracle 主值来创建共享内存的密钥。
数据库实例提供对数据库的用户访问权限。实例和数据库可以处于各种状态。
手动启动实例,然后挂载并打开数据库,使其可供用户使用。
当 Oracle 数据库启动实例时,它会通过各个阶段进行。
阶段如下:
挂载:实例挂载数据库以将数据库与此实例关联。在装入的数据库中,数据库是关闭的,只有数据库管理员才能访问。管理员可以在完成特定维护操作时保持数据库关闭。但是,数据库不可用于正常操作。
打开数据库时,Oracle 数据库将执行以下操作:
打开撤消表空间以外的表空间中的联机数据文件
如果表空间在先前关闭数据库时处于脱机状态,则当数据库重新打开时,表空间及其相应的数据文件将处于脱机状态。
获取撤消表空间
如果存在多个撤消表空间,则初始化参数
UNDO_TABLESPACE
指定要使用的撤消表空间。如果未设置此参数,则选择第一个可用的撤消表空间。打开联机重做日志文件
SHUTDOWN ABORT
此模式适用于紧急情况,例如没有其他形式的关机成功时。这种关机模式是最快的。但是,后续打开此数据库可能需要更长的时间,因为必须执行实例恢复才能使数据文件保持一致。
由于
SHUTDOWN
ABORT
不对打开的数据文件执行检查点操作,因此必须先进行实例恢复,然后才能重新打开数据库。其他关闭模式不需要在数据库重新打开之前恢复实例。
SHUTDOWN IMMEDIATE
此模式通常是仅次于
SHUTDOWN
ABORT
的最快模式。Oracle 数据库会终止任何正在执行的 SQL 语句并断开用户的连接。活动事务将终止,未提交的更改将回滚。
SHUTDOWN TRANSACTIONAL
此模式阻止用户启动新事务,但在关闭之前等待所有当前事务完成。此模式可能需要大量时间,具体取决于当前事务的性质。
SHUTDOWN NORMAL
这是关机的默认模式。数据库在关闭之前等待所有连接的用户断开连接
数据库关闭操作隐式在数据库关闭中,操作的性质取决于数据库关闭是正常还是异常。
正常关闭:Oracle将 SGA 中的数据写入数据文件和联机重做日志文件,数据库关闭联机数据文件和联机重做日志文件。离线表空间的所有脱机数据文件都已关闭,当数据库重新打开时,任何脱机的表空间都将保持脱机状态。
异常关闭abort:打开的数据库实例将立即关闭和关闭数据库,Oracle不会将 SGA 缓冲区中的数据写入数据文件并重做日志文件。随后重新打开数据库需要实例恢复,Oracle会自动执行实例恢复。
卸载数据库:关闭数据库后,Oracle将卸载数据库以将其与实例解除关联。卸载数据库后,Oracle会关闭数据库的控制文件。此时,数据库实例仍保留在内存中。
数据库关闭的最后一步是关闭实例。当数据库实例关闭时,SGA 将停止占用内存,并且后台进程将终止。
检查点通常是一致数据库关闭、实例恢复和 Oracle操作中的关键机制。
该术语具有以下相关含义:
检查点进程 (CKPT) 负责将检查点写入数据文件头和控制文件。检查点在各种情况下都会发生:线程检查点、表空间和数据文件检查点、增量检查点。
实例恢复是将联机重做日志中的记录应用于数据文件,以重建在最近检查点之后所做的更改的过程。
实例恢复可确保数据库在实例故障后处于一致状态,重做线程是实例生成的所有更改的记录。提交事务时,日志编写器进程 LGWR 会将内存中剩余的重做条目和事务 SCN 写入联机重做日志。但是,数据库编写器 DBW 进程会在最有效的时间将修改后的数据块写入数据文件。因此,数据文件中可能暂时存在未提交的更改,而数据文件中尚不存在已提交的更改。
是否需要实例恢复取决于重做线程的状态,Oracle 在以下情况下会自动执行实例恢复:
在单实例数据库或 Oracle RAC 数据库的所有实例发生故障后,数据库将首次打开。这种形式的实例恢复也称为崩溃恢复。Oracle 数据库一起恢复已终止实例的联机重做线程。
Oracle RAC 数据库的某些实例(但不是全部)会失败。实例恢复由配置中幸存的实例自动执行。
实例恢复使用检查点来确定必须对数据文件应用哪些更改。检查点位置保证 SCN 低于检查点 SCN 的每个已提交更改都保存到数据文件中。
在实例恢复期间,数据库必须应用在检查点位置和重做线程结束之间发生的更改。
实例恢复的第一阶段称为缓存恢复或前滚,将在线重做日志中记录的所有更改重新应用到数据文件。由于联机重做日志包含撤消数据,因此前滚也会重新生成相应的撤消段
前滚后,必须撤消任何未提交的更改。Oracle使用检查点位置,这保证SCN低于检查点SCN的每个已提交更改都保存在磁盘上。Oracle应用撤消块来回滚数据块中未提交的更改,这些更改是在发生故障之前写入的或在缓存恢复期间引入的。此阶段称为回滚或事务恢复。
要启动数据库实例,Oracle必须读取服务器参数文件或文本初始化参数文件,这些文件包含配置参数的列表。
初始化参数是影响实例基本操作的配置参数。实例在启动时从文件中读取初始化参数。
初始化参数分为两组:基本和高级。
文本初始化参数文件是包含初始化参数列表的文本文件。
Oracle提供了许多初始化参数,以优化其在各种环境中的操作。
Oracle包括故障诊断能力基础设施,用于预防、检测、诊断和解决数据库问题
可以通过调整初始化参数来修改数据库,参数有是静态的还是动态的。
Oracle有故障诊断能力基础设施,用于预防、检测、诊断和解决数据库问题。问题包括严重错误,例如代码错误、元数据损坏和客户数据损坏。
多租户容器数据库 (CDB) 和非 CDB 具有体系结构差异。
自动诊断存储库 (ADR) 是基于文件的存储库,用于存储数据库诊断数据,例如跟踪文件、警报日志、DDL 日志和运行状况监视器报告。ADR的主要特征包括:
统一目录结构
一致的诊断数据格式
统一的工具集
ADR 主动跟踪问题,即数据库中的严重错误。ADR 基础是 ADR 根目录。ADR 基可以包含多个 ADR 主目录,其中每个 ADR 主目录是 Oracle 产品或组件实例的所有诊断数据(跟踪、转储、警报日志等)的根目录。
每个数据库都有一个警报日志,这是一个 XML 文件,其中包含按时间顺序排列的数据库消息和错误的日志。
DDL日志与警报日志具有相同的格式和基本行为,但仅包含DDL语句和详细信息。DDL 日志存储在 ADR 主目录的子目录中log/ddl。
跟踪文件是包含用于调查问题的诊断数据的文件。此外,跟踪文件还可以为优化应用程序或实例提供指导。
诊断转储文件是一种特殊类型的跟踪文件,其中包含有关状态或结构的详细时间点信息。大多数转储都是由于事件而发生的。
Oracle 数据库包括多个内存区域,每个内存区域包含多个子组件。
与 Oracle 数据库相关的基本内存结构包括:
系统全局区域 (SGA)
SGA 是一组共享内存结构,称为 SGA 组件,其中包含一个 Oracle 数据库实例的数据和控制信息。所有服务器和后台进程共享 SGA。SGA 中存储的数据示例包括缓存数据块和共享 SQL 区域。
计划全球区域 (PGA)
PGA 是一个非共享内存区域,其中包含专门供 Oracle 进程使用的数据和控制信息。Oracle 数据库在 Oracle 进程启动时创建 PGA。
每个服务器进程和后台进程都存在一个 PGA。单个 PGA 的集合是总实例 PGA 或实例 PGA。数据库初始化参数设置实例 PGA 的大小,而不是单个 PGA 的大小。
用户全局区域 (UGA)
UGA 是与用户会话关联的内存。
软件代码区
软件代码区是内存的一部分,用于存储正在运行或可以运行的代码。Oracle 数据库代码存储在软件区域中,该区域通常与用户程序位于不同的位置,即更独占或受保护的位置。
UGA是会话内存,是在用户连接到 Oracle时分配给每个用户的一块内存区域,用于存储与用户连接相关的会话信息和上下文数据。UGA 在用户会话期间保持存在,在会话结束时释放。本质上,UGA 存储会话状态,UGA包括:
- 用户标识(USER ID):UGA 维护了用户连接到数据库时所用的用户名。
- 会话上下文(Session Context):UGA 存储了与用户连接相关的上下文信息,如当前模式(Schema)、当前服务名(Service Name)、当前会话 ID 等。
- 授权和权限信息(Authorization and Privileges):UGA 记录用户的授权和权限信息,包括用户拥有的角色、系统特权和数据库对象的权限等。
- SQL 语句状态(SQL Statement State):UGA 维护了当前用户正在执行或最近执行的 SQL 语句的状态,如 SQL 语句文本、绑定变量值、执行计划等。
- 会话连接信息(Session Connection Information):UGA 存储了与用户连接相关的连接信息,如 IP 地址、网络连接参数、终端机信息等。
- 会话状态(Session State):UGA 记录了用户会话的状态信息,如当前事务状态、隔离级别、游标状态等。
UGA必须在会话的生存期内可用于数据库会话。因此,使用共享服务器连接时,无法将 UGA 存储在 PGA 中,因为 PGA 特定于单个进程。
通过 UGA,Oracle能够跟踪和维护每个用户连接的相关信息,并提供了一个隔离的环境,确保用户之间的数据和上下文分离。UGA 可以用于执行权限验证、资源控制、SQL 语句执行和上下文切换等功能。
SGA和 PGA是 Oracle 数据库中的两个重要概念,用于管理和分配数据库内存。
PGA是每个用户进程或服务器进程(后台进程)私有的内存区域,用于存储会话相关的数据和执行查询的临时数据。每个进程都有自己的PGA,用于处理连接到数据库的客户端的请求。PGA 的大小和使用由具体的进程和会话决定,动态分配和管理。
PGA 中包括了:
1. SQL 执行统计信息:保存 SQL 查询执行的统计信息,如 CPU 时间、逻辑读等。
2. 会话变量和临时变量:存储当前会话或查询中的临时数据。
3. 排序区域(Sort Area):用于执行排序操作的临时存储区域,如 ORDER BY、GROUP BY 等。
4. Hash 区域(Hash Area):用于执行哈希操作的临时存储区域。连接操作和哈希聚合.
5. PGA 连接池(PGA Connection Pool):存储数据库连接的状态和会话信息。
专用SQL区域保存有关已解析的 SQL 语句的信息和其他特定于会话的信息以进行处理。
工作区是PGA内存的私有分配,用于内存密集型操作。工作区是用于内存密集型操作的 PGA 内存的专用分配。
SGA 是一个读/写内存区域,它与 Oracle 后台进程一起构成一个数据库实例。
SGA 是一个共享的内存区域,由 Oracle实例使用来存储全局的数据和管理结构。SGA 中包含了多个组件,如缓冲池、共享池、重做日志缓冲区、数据库缓存等。这些组件用于提高数据库的性能和并发访问能力。SGA 的大小在数据库启动时配置,并在运行时动态调整。
常见的 SGA 组件包括:
数据库缓冲池用于存储磁盘数据块的副本,减少读取磁盘的次数,提高数据的访问速度。优化物理 I/O、将经常访问的块保留在缓冲区缓存中,不经常访问的块写入磁盘。
数据库使用内部算法来管理缓存中的缓冲区。
缓冲区可以处于以下任何互斥状态:
闲置
缓冲区可供使用,因为它从未使用过或当前未使用。这种类型的缓冲区是数据库最容易使用的。
干净
此缓冲区之前使用过,现在包含截至某个时间点的块的读取一致性版本。该块包含数据,但“干净”,因此不需要检查点。数据库可以固定块并重复使用它。
脏
缓冲区包含尚未写入磁盘的已修改数据。数据库在重用块之前必须对块执行检查点操作。
逻辑 I/O(也称为缓冲区 I/O)是指缓冲区缓存中缓冲区的读取和写入。
当在内存中找不到请求的缓冲区时,数据库将执行物理 I/O 以将缓冲区从闪存缓存或磁盘复制到内存中。然后,数据库执行逻辑 I/O 来读取缓存的缓冲区。
数据库编写器 (DBW) 进程定期将冷、脏的缓冲区写入磁盘。
DBW 在以下情况下写入缓冲区:
服务器进程找不到用于将新块读入数据库缓冲区高速缓存的干净缓冲区;
数据库必须推进检查点,检查点是重做线程中必须从实例恢复开始的位置;
表空间将更改为只读状态或脱机。
当未使用的缓冲区数较少时,数据库必须从缓冲区缓存中删除缓冲区。
算法取决于是否启用了闪存缓存:
闪存缓存已禁用
数据库根据需要重用每个干净缓冲区,覆盖它。如果以后需要覆盖的缓冲区,则数据库必须从磁盘读取它。
已启用闪存缓存
DBW 可以将干净缓冲区的主体写入闪存缓存,从而可以重用其内存中缓冲区。数据库将缓冲区标头保存在主存储器的 LRU 列表中,以跟踪缓冲区正文在闪存缓存中的状态和位置。如果以后需要此缓冲区,则数据库可以从闪存缓存而不是从磁盘读取它。
缓冲池是缓冲区的集合。数据库缓冲区高速缓存分为一个或多个缓冲池,它们以大致相同的方式管理块。池对于老化或缓存块没有完全不同的算法。
共享池(Shared Pool):存储共享 SQL 语句、存储过程、会话信息等共享的数据库对象,减少解析和共享 SQL 语句的开销。有:库缓存、数据字典缓存、服务器结果缓存、预留池
Library cache库缓存是一种共享池内存结构,用于存储可执行的 SQL 和 PL/SQL 代码。
共享 SQL 区域在共享 SQL 区域和专用 SQL 区域中运行的每个 SQL 语句。
库缓存包含PL / SQL程序和Java类的可执行形式。这些项目统称为程序单元。
数据字典是数据库表和视图的集合,其中包含有关数据库、其结构及其用户的引用信息。
服务器结果缓存是共享池中的内存池。与缓冲池不同,服务器结果缓存保存结果集而不是数据块。
PL/SQL 函数结果缓存是存储函数结果集的服务器结果缓存的子集。
预留池是共享池中的一个内存区域,Oracle可以使用该区域来分配大型连续内存块。
重做日志缓冲区:存储待写入重做日志文件的数据,用于数据库恢复和故障恢复。
重做日志缓冲区是 SGA 中的一个循环缓冲区,用于存储描述对数据库所做的更改的重做条目。数据库处理将重做条目从用户内存空间复制到 SGA 中的重做日志缓冲区。
LGWR 按顺序将数据块写入磁盘,而 DBW 将数据块分散写入磁盘。分散写入往往比顺序写入慢得多。由于 LGWR 使用户能够避免等待 DBW 完成其缓慢写入,因此数据库提供了更好的性能。
用于存储较大的共享内存区域,如排序操作和 I/O 操作的临时存储区域。
大型池管理内存的方式与共享池不同,共享池使用 LRU 列表,以便部分内存可能会老化。
5. Java 池(Java Pool):用于存储 Java 对象和 Java 会话的内存区域。
6. 其他内存区域,如 PGA 连接池、字典缓冲区等。
SGA 是一个读/写内存区域,它与 Oracle 后台进程一起构成一个数据库实例。
软件代码区是内存的一部分,用于存储正在运行或可以运行的代码。Oracle 数据库代码存储在软件区域中,该区域通常比用户程序的位置更具排他性和保护性。
进程是操作系统中的一种机制,可以运行一系列步骤。
多进程 Oracle(也称为多用户 Oracle)使用多个进程来运行 Oracle代码的不同部分,并为用户运行其他 Oracle 进程 — 每个连接的用户一个进程或多个用户共享的一个或多个进程。
在以线程模式运行的数据库中,PMON 和 DBW 可能作为操作系统进程运行,而 LGWR 和 CMON 可能作为单个进程中的线程运行。两个前台进程和一个并行执行 (PX) 服务器进程可能在第二个操作系统进程中作为线程运行。第三个操作系统进程可能包含多个前台线程。
数据库连接是客户端进程和数据实例之间的物理通信路径。数据库会话是数据库实例内存中的一个逻辑实体,表示当前用户登录到数据库的状态。单个数据库用户可以同时存在多个会话。如下图所示,用户可以有多个数据库连接。
在数据库监视的上下文中,数据库操作是两个时间点之间的会话活动,由最终用户或应用程序代码定义。
Oracle 创建服务器进程来处理连接到实例的客户端进程的请求,客户端进程始终通过单独的服务器进程与数据库通信。
在专用服务器连接中,客户端连接与一个且仅与一个服务器进程相关联。每个客户端进程直接与其服务器进程通信。此服务器进程在会话期间专用于其客户端进程。服务器进程将特定于进程的信息和 UGA 存储在其 PGA 中。
在共享服务器连接中,客户端应用程序通过网络连接到调度程序进程,而不是服务器进程。与专用服务器进程一样,共享服务器进程也有自己的 PGA。但是,会话的 UGA 位于 SGA 中,以便任何共享服务器都可以访问会话数据。
数据库以各种方式创建服务器进程,具体取决于连接方法。
连接方式如下:
Bequeath遗赠
SQL*Plus、OCI 客户端或其他客户端应用程序直接生成服务器进程。
Oracle网络侦听器
客户端应用程序通过侦听器连接到数据库。
专属经纪人
这是一个创建前台进程的数据库进程。与侦听器不同,代理驻留在数据库实例中。使用专用代理时,客户端连接到侦听器,然后侦听器将连接移交给专用代理。
当连接不使用遗赠时,数据库将按如下方式创建服务器进程:
客户端应用程序从侦听器或代理请求新连接。
侦听器或代理启动新进程或线程的创建。
操作系统创建新的进程或线程。
Oracle 数据库初始化各种组件和通知。
数据库移交连接和特定于连接的代码。
后台进程是多进程 Oracle使用的其他进程。后台进程执行操作数据库所需的维护任务,并最大限度地提高多个用户的性能。分为强制后台进程、可选后台进程、从进程。
PMON 组包括 PMON、清理主进程 (CLMN) 和清理帮助程序进程 (CLnn),这些进程负责监视和清理其他进程。
进程监视器(PMON)检测其他后台进程的终止。如果服务器或调度程序进程异常终止,则PMON组负责执行进程恢复。
PMON 将清理工作委派给清理主进程(CLMN),检测异常终止的任务仍由PMON完成。
CLMN 会定期清理已终止的进程、已终止的会话、事务、网络连接、空闲会话、分离的事务和已超过其空闲超时的分离网络连接。
CLMN 将清理工作委托给 CLnn 帮助程序进程,CLnn 进程有助于清理已终止的进程和会话。
如果进程或会话终止,则 PMON 组会将保留的资源释放到数据库。
进程管理器 (PMAN) 监督多个后台进程,包括共享服务器、池服务器和作业队列进程。
PMAN 监视、生成和停止以下类型的进程:
调度程序和共享服务器进程
数据库驻留连接池的连接代理和共用服务器进程
作业队列进程
可重新启动的后台进程
侦听器注册过程 LREG向 Oracle 网络侦听器注册有关数据库实例和调度程序进程的信息。
系统监视器进程 (SMON) 负责各种系统级清理职责。
数据库编写器进程 (DBW) 将数据库缓冲区的内容写入数据文件。DBW 进程将数据库缓冲区缓存中修改的缓冲区写入磁盘。
日志编写器进程 (LGWR) 管理联机重做日志缓冲区。LGWR 将缓冲区的一部分写入联机重做日志。通过将修改数据库缓冲区、将脏缓冲区分散写入磁盘和执行快速顺序重做写入磁盘的任务分开,数据库提高了性能。
Oracle使用快速提交机制来提高已提交事务的性能。当用户发出语句时,将为事务分配一个系统更改编号 (SCN)。
检查点进程CKPT 使用检查点信息更新控制文件和数据文件头,并向 DBW 发出信号以将块写入磁盘。检查点信息包括检查点位置、SCN 和联机重做日志中用于开始恢复的位置。
可管理性监视器进程 (MMON) 执行许多与自动工作负载存储库 (AWR) 相关的任务。
可管理性监视器精简版进程 (MMNL) 将统计信息从 SGA 中的活动会话历史记录 (ASH) 缓冲区写入磁盘。当 ASH 缓冲区已满时,MMNL 将写入磁盘。
在分布式数据库中,恢复程序进程 (RECO) 会自动解决分布式事务中的故障。
可选后台进程是未定义为必需的任何后台进程。
存档程序进程 (ARCn) 在发生重做日志切换后将联机重做日志文件复制到脱机存储。
队列进程通常以批处理模式运行用户作业。作业是计划运行一次或多次的用户定义任务。
闪回数据存档过程 (FBDA) 将跟踪表的历史行存档到闪回数据存档中。
SMCO 流程协调各种空间管理相关任务的执行。
从进程是代表其他进程执行工作的后台进程。
I/O 从进程 (Innn) 模拟不支持它的系统和设备的异步 I/O。
在并行执行PX中,多个进程同时协同工作以运行单个 SQL 语句。
并行执行服务器分为生产者和使用者,生产者负责处理他们的数据,然后将其分发给需要它的消费者。数据库可以使用各种技术执行分发。两种常见的技术是广播和哈希。在广播中,每个生产者将行发送给所有使用者。在哈希中,数据库在一组键上计算哈希函数,并使每个使用者负责哈希值的子集。
在并行执行中,表动态划分为荷载单元。每个单元称为颗粒,是访问数据时的最小工作单元。
应用程序体系结构是指数据库应用程序连接到 Oracle的计算环境
在Oracle中,数据库应用程序和数据库被分离到一个客户端/服务器体系结构中。
使用多个主机处理单个任务称为分布式处理, 前端和后端处理发生在不同的计算机上。
分布式处理环境中的 Oracle 数据库客户端/服务器架构具有许多优势。
数据库可以在传统的多层或面向服务的体系结构 (SOA) 环境中充当 Web 服务提供程序。
在 Oracle中,网格计算是一种计算架构,可有效地将大量服务器和存储汇集到灵活的按需计算资源中。
Oracle 网络服务是一套网络组件,可在分布式异构计算环境中提供企业级连接解决方案。
Oracle 网络侦听器(侦听器)是一个服务器端进程,用于侦听传入的客户端连接请求并管理到数据库的流量。
Oracle协议接受来自 Oracle 应用程序接口的 SQL 语句,然后打包它们以传输到 Oracle。
服务名称是用于客户端连接的服务的逻辑表示形式。
在 Oracle Net 中,服务注册是 LREG 进程向侦听器动态注册实例信息的功能。
在专用服务器体系结构中,代表每个客户端进程创建的服务器进程称为专用服务器进程(或影子进程)。
调度程序进程使客户端进程能够共享有限数量的服务器进程。
在共享服务器体系结构中,调度程序将多个传入的网络会话请求定向到共享服务器进程池.
程序接口是数据库应用程序和Oracle数据库之间的软件层。
数据库安全涉及用户身份验证、加密、访问控制和监控
每个 Oracle都有一个有效数据库用户的列表,数据库包含多个默认帐户,包括默认管理帐户。
用户特权是运行特定 SQL 语句的权限:系统权限create、对象极限(查询)。
角色是一组命名的相关权限,用户可以将其授予其他用户或角色。角色有助于管理数据库应用程序或用户组的权限。
权限分析机制根据指定条件捕获数据库的权限使用情况。
在系统资源的上下文中,用户配置文件是一组命名的资源限制和密码参数,用于限制用户的数据库使用情况和数据库实例资源。配置文件可以限制用户的并发会话数、每个会话可用的 CPU 处理时间以及可用的逻辑 I/O 量。
在 Oracle中,数据库身份验证是用户向数据库提供凭据的过程,通过该过程验证凭据并允许访问数据库。
Oracle 加密是使用密钥和加密算法将数据转换为不可读格式的过程。
在客户端和服务器之间通过网络传输数据时对其进行加密称为网络加密。
Oracle 高级安全透明数据加密使您能够加密单个表列或表空间。
Oracle提供了许多技术来控制对数据的访问。
Oracle 数据库保管库限制用户对应用数据的特权访问。
Oracle 虚拟专用数据库 (VPD) 使您能够在行和列级别实施安全性。
数据库审计是对所选用户数据库操作的监视和记录。
Oracle 标签安全 (OLS) 使您能够使用安全标签分配数据分类和控制访问。
Oracle 数据库提供了多种工具和技术来监控用户活动,审核是监视数据访问的主要机制。数据库审计是对所选用户数据库操作的监视和记录。
可用性是应用程序、服务或功能按需可用的程度。
当事件导致应用程序的全部或大部分停止处理或速度降低到不可用的服务级别时,就会发生站点故障。防止站点故障的最简单形式是使用 RMAN 创建数据库备份并将其存储在异地。您可以将数据库还原到另一台主机。
当保存部分或全部数据库内容的存储因已关闭或不再可访问而变得不可用时,会发生存储故障中断。存储故障的示例包括磁盘驱动器或存储阵列的故障。
当硬件、软件或网络组件导致读取或写入损坏的数据时,就会发生数据损坏。
除了 Data Guard 和 Recovery Manager 之外,Oracle 数据库还支持以下形式的数据损坏防护:
丢失写入问题的解决方案:使用备用数据库的写保护丢失、使用影子表空间的写保护丢失;
数据块损坏检测
数据恢复顾问
事务保护和应用程序连续性
当提交导致数据库中的数据在逻辑上损坏或不可用的无意或恶意操作,会发生人为错误中断。
数据仓库是用于查询和分析而不是事务处理的关系数据库。
Oracle 在线分析处理 (OLAP) 在跨多个维度分析数据时提供本机多维存储和快速响应时间。OLAP 使分析人员能够在交互式会话期间快速获得复杂迭代查询的答案。
Oracle OLAP 具有以下主要特征:
Oracle OLAP 集成在数据库中,因此您可以使用标准的 SQL 管理、查询和报告工具。
OLAP 引擎在 Oracle 数据库的内核中运行。
维度对象以其本机多维格式存储在 Oracle 数据库中。
多维数据集和其他维度对象是 Oracle 数据字典中表示的第一类数据对象。
通过向 Oracle 数据库用户和角色授予和撤销权限,以标准方式管理数据安全性。
从源系统提取数据并将其引入仓库的过程通常称为 ETL:提取、转换和加载。
数据库链接是两个物理数据库之间的连接,使客户端能够将它们作为一个逻辑数据库进行访问。
高级队列(AQ)是一个与 Oracle集成的强大且功能丰富的消息队列系统。
Oracle DBA 负责了解 Oracle 数据库架构以及数据库的工作原理。DBA 可以期望执行以下任务:
安装、升级和修补 Oracle 数据库软件
设计数据库,包括确定需求、创建逻辑设计(概念模型)和物理数据库设计
创建甲骨文数据库
开发和测试备份和恢复战略,定期备份 Oracle 数据库,并在发生故障时恢复它们
配置网络环境以使客户端能够连接到数据库
启动和关闭数据库
管理数据库的存储
管理用户和安全性
管理数据库对象,如表、索引和视图
监视和调整数据库性能
调查、收集数据并向 Oracle 支持服务报告任何关键数据库错误
评估和测试新的数据库功能
备份和恢复是一组概念、过程和策略,用于保护数据库免受介质故障或用户错误导致的数据丢失。
可以使用恢复管理器或用户管理的技术来备份、还原和恢复 Oracle 数据库。
这两种方法的主要区别如下:
RMAN 是一个 Oracle 数据库实用程序,它与 Oracle 数据库集成以执行备份和恢复活动,包括在备份的每个数据库的控制文件中维护历史备份元数据的存储库。RMAN 还可以在不同的数据库中维护一个称为恢复目录的集中式备份存储库。RMAN 是 Oracle 数据库的一项功能,不需要单独安装。
RMAN 与 Oracle 安全备份集成,后者提供可靠、集中的磁带备份管理,保护文件系统数据和 Oracle 数据库文件。Oracle 安全备份 SBT 界面使您能够使用 RMAN 在磁带和基于 Internet 的 Web 服务(如 Amazon S3)之间备份和还原数据库文件。Oracle 安全备份支持 SAN 和 SCSI 环境中的几乎所有磁带驱动器和磁带库。
用户管理技术
作为恢复的替代方法,您可以使用操作系统命令,如Linux dd来备份和恢复文件,使用SQL*Plus RECOVER命令来恢复介质。Oracle完全支持用户管理的备份和恢复,但建议使用RMAN,因为它与Oracle数据库集成并简化了管理。
下图显示了一个示例 RMAN 体系结构。RMAN 客户机可通过云控制访问,它使用目标数据库上的服务器会话将数据备份到磁盘或磁带。RMAN 可以使用备份元数据更新外部恢复目录。
数据库备份可以是物理备份,也可以是逻辑备份。
物理备份是备份和恢复策略中的主要关注点,是物理数据库文件的副本。您可以使用 RMAN 或操作系统实用程序进行物理备份。
相反,逻辑备份包含表、存储过程和其他逻辑数据。您可以使用 Oracle 数据库实用程序(如数据泵导出)提取逻辑数据,并将其存储在二进制文件中。逻辑备份可以补充物理备份。
物理备份粒度大,可传输性有限,但速度非常快。逻辑备份具有精细粒度和完整的可传输性,但比物理备份慢。
整个数据库备份是数据库中每个数据文件以及控制文件的备份。整个数据库备份是最常见的备份类型。整个数据库备份要么是一致的,要么是不一致的。
虽然有几个问题会停止数据库的正常运行或影响 I/O 操作,但只有一些问题需要 DBA 干预和数据修复。在以下情况下通常需要数据修复:
介质故障
当数据库外部的问题阻止数据库读取或写入文件时,会发生介质故障。典型的介质故障包括物理故障(如磁盘磁头崩溃)以及覆盖、删除或损坏数据库文件。介质故障不如用户或应用程序错误常见,但必须为这些错误做好合理的备份和恢复策略。
用户错误
用户或应用程序可能会对数据库进行不需要的更改,例如错误更新、删除表的内容或删除数据库对象。良好的备份和恢复策略使您能够将数据库返回到所需状态,同时将对数据库可用性的影响降至最低,并且 DBA 工作量最小。
数据库提供了一组称为 Oracle 闪回技术的功能,支持查看过去的数据状态,以及及时来回缠绕数据,而无需恢复备份。
使用数据恢复顾问诊断数据故障,为您的环境提供最佳修复选项,以及执行和验证修复。
块介质恢复是一种在数据文件联机时恢复和恢复损坏的数据块的技术。
内存管理涉及在数据库需求更改时维护 Oracle 实例内存结构的最佳大小。初始化参数设置确定如何管理 SGA 和实例 PGA 内存。
在自动内存管理中,Oracle(建议)完全自动管理 SGA 和实例 PGA 内存。
下图显示了一个数据库,该数据库有时处理联机用户提交的作业,有时处理批处理作业。使用自动内存管理,数据库会根据正在运行的作业类型自动调整大型池和数据库缓冲区高速缓存的大小。请注意,该图形未描述 IM 列存储或内存优化区域。
Oracle 数据库提供的工具可帮助您管理资源和安排任务以减少对用户的影响。
Oracle 调度程序(Scheduler)使数据库管理员和应用开发人员能够控制在数据库环境中执行各种任务的时间和位置。
作为 DBA,您负责 Oracle 数据库的性能。通常,性能问题是由不可接受的响应时间(即完成指定工作负载的时间)或吞吐量(可在指定时间内完成的工作量)引起的。典型的问题包括:
中央处理器瓶颈
内存结构过小
I/O 容量问题
低效或高负载的 SQL 语句
调整 SQL 语句后出现意外的性能回归
并发和争用问题
数据库配置问题
自我监控在数据库执行其常规操作时进行,确保数据库在出现问题时知道问题。Oracle 数据库可以发送服务器生成的警报,以通知您即将发生的问题。
自动工作负载存储库 (AWR) 是历史性能数据的存储库,其中包括系统、会话、单个 SQL 语句、分段和服务的累积统计信息。AWR 基线是通常在系统在峰值负载下运行良好的时间段内采用的统计速率的集合。
使用在 AWR(自动工作负载存储库)中捕获的统计信息,ADDM 会自动主动诊断数据库性能,并确定如何解决已识别的问题。您也可以手动运行 ADDM,自动数据库诊断监视器 (ADDM) 是内置于 Oracle 数据库中的自我顾问。
活动会话历史记录 (ASH) 每秒对活动数据库会话进行采样,将数据写入内存和持久存储。ASH 是数据库自我管理框架的一个组成部分,可用于诊断性能问题。
Oracle完全自动化了 SQL 调优过程。语句等工具使您能够查看优化程序选择的执行计划EXPLAIN PLAN。优化器统计信息顾问是一种诊断软件,用于分析当前收集统计信息的方式、现有统计信息收集作业的有效性以及收集的统计信息的质量。
自动 SQL 优化的接口是 SQL 优化顾问,它在系统维护时段内作为维护任务自动运行。
使用 SQL 访问顾问可帮助您分析 SQL 查询,并确定优化架构对象或优化查询的方法。
通过使用 SQL 计划管理仅执行经过测试和验证的计划来管理 SQL 执行计划。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。