Oracle学习甲骨论笔记

目录

计算机的工作机制

swap的工作机制

计算机缓存技术及工作原理

存储及raid技术

Oracle体系架构

体系结构

Sql语句执行过程剖析

shared pool内存组成

SQL共享,绑定变量

解决4031问题

buffer cache

内存组织

Oracle日志原理

PGA

Oracle存储结构

文件结构

表空间、段、区、块

检查点

实例崩溃恢复

SCN

事务

Undo表空间

图解一个事务的操作流程

Oracle IMU机制​编辑

redo日志和undo日志

读一致性(ORA-01555)

字符集

锁的基本原理

行级锁

锁的相关视图

Oracle网络

Oracle参数文件启动关闭


视频链接:0_Oracle学习路线分析(Oracle学习必读)_哔哩哔哩_bilibili

计算机的工作机制

计算机的三个核心部件:Cpu、内存、硬盘。

程序如何运行:首先程序和数据都在硬盘上,当CPU执行程序时,程序和数据会被调用到内存中,成为进程。

CPU:CPU把自己的时间分为很多个时间片,cpu每个时间片处理不同的进程。当CPU数量小于进程数量,CPU会有处理调度,就是把一个进程冻结执行另一个进程的过度(上下文切换),这个过程也会花费CPU的时间。

操作系统进程如果长时间不工作,操作系统就会设置成sleep就不会轮巡,会减少上下文切换时间。进程获得Cpu,获得一个时间片,时间片到了或者突然sleep的时候进程会从cpu被置换出来。

内存:临时工作空间,缓存

硬盘:数据文件等都在硬盘,数据从硬盘到内存叫IO(主要问题)

swap的工作机制

硬盘空间大于内存,硬盘上划一块空间叫swap,和内存关联,有些进程数据长时间不用,计算机就把这些数据置换出来放在swap

内存快,硬盘慢,有了swap,就减少了因为内存耗尽,导致系统挂了;即使用了swap,尽量不用swap,通过优化;如果用了,in、out都很频繁说明内存不够用,out多in少说明数据确实很少用。

计算机缓存技术及工作原理

内存为啥出现:Cpu处理速度很快,但是从磁盘取出速度很慢,所以加上了内存。

处理特点:Cpu处理同一块数据的概率很大,前面数据处理完再处理接下来的数据几率很大。

物理IO,从磁盘中读取到内存,再从内存读取到CPU;逻辑IO,直接从内存读取到CPU。

缓存的命中率是:逻辑IO次数/IO总次数

缓存就是内存(计算机内最大的缓存)技术很重要,可以大大减少物理IO次数。

缓存命中率高的可能性:种可能是正常的,另一种是物理IO大,但是逻辑IO更大。注:命中率低肯定有问题,但是高不一定没有问题。

缓存最快的是寄存器、一级缓存(几百k)、二级缓存(几十m),缓存特点:数据易丢失,数据在硬盘上永久存储的。

缓存只在读上有效果,只需要直接从内存上读取,写却要写到内存后再写入磁盘(物理写)。

能够缓存写的2个地方:
1、oracle内存(一旦启用会在内存里划一块专门给oracle使用),如果cpu要修改oracle数据,只需要再内存就可以,不需要立刻写入磁盘,如果突然掉线,可能会丢失,有一种机制避免;
2、存储的缓存cash可以缓存写,在存储里加个电池,持续供电,即使掉线了也不会丢失,存储的电池就一个作用持续供电,不可能把数据传递到硬盘中。如果电池坏了就会把存储的缓存的缓存写功能给关闭了,导致存储的IO的写功能大幅度下降。

存储及raid技术

常见的硬件环境:2个服务器交叉连接2个光纤交换机再交叉连接2个存储。2个服务器上分别装了linux和oracle数据库软件,Oracle数据库建立在2个存储上。Oracle数据库软件坏了,重装就行,到处都是冗余,防止一个坏了都不管用了(高可用),(负载均衡)。

Raid就是很多硬盘,提供冗余、提高访问速度(raid0、raid1、raid5、raid6、raid10、raid01)。

Raid0:文件被均匀分配在(2-6)两个硬盘。可以实现并行的写和读,可以提高访问磁盘的速度。其中某一块硬盘坏了,所有数据全都损坏没有冗余,只提高速度没有冗余。

Raid1:文件在多个硬盘中写(镜像)。提供冗余,读性能有所提高,但是浪费了至少百分之50的空间。

Raid5:文件写入,前3块各写入三分之一,第四个是前三个的校验。可以通过任意3个恢复第四个,只允许坏一个硬盘。读性能比较高,写性能比较差因为第四个的原因,浪费1/3。一旦坏了一块效率急剧下降。

Raid6:也实现了冗余,而且有2个校验,可以同时坏2个硬盘。坏了两块性能急剧下降。

Raid01:先做raid0,再这基础上做raid1。读写性能都可以,冗余1/2,空间浪费50%。

Raid10:先做raid1,再这基础上做raid0。读写性能都可以,冗余1/2,空间浪费50%。

Oracle体系架构

体系结构

Oracle数据库由三类文件组成:ctl、log、dbf。控制、日志、数据

Oracle启动会在内存里划出一块空间(oracle内存)并且运行一些oracle进程,统称oracle实例。Oracle数据库会产生一个oracle’实例,数据库和实例可以1比1,也可以1比多,也就是Oracle的rac技术。可以提高并发性。

Oracle 实例关联的基本内存结构包括:
系统全局区(SGA):由所有服务器进程和后台进程共享
程序全局区(PGA):专用于每一个服务器进程或后台进程。每一个进程使用一个 PGA
SGA 是包含实例的数据和控制信息的内存区,由六块组成,主要的是SGA主要由共享池(Shared Pool)、数据高速缓冲区(Database Buffer Cache)、重做日志缓冲区(Redo Log Cache

Oracle会实现一堆进程,有前台进程(服务器进程)、后台进程。
SGA:Oracle所有进程可以访问SGA所有空间共享
PGA:对于进程来说,还有一部分自己的空间,这空间就来至于PGA,私有

控制文件:整个数据库的物理结构(有什么文件放在哪里),数据库运行的当前状态,比较小

数据文件:Oracle所有数据,比较大

重做日志文件:记录着数据文件的变化过程。

Ckpt(检查点):周期性工作;smon(系统监视器):对数据库实例内部清理和维护;

pmon(进程监视器):对数据库实例外部清理维护,清理server process进程等;

Sql语句执行过程剖析

sql语句执行3个阶段:parse解析(解析成执行计划),exec执行,fetch返回数据

用户连接进来,实例会给这个连接一个服务器进程(server process), 客户端输入sql语句,sql语句到达数据库实例,server process接受sql语句。

Sql语句进入数据库后:首先是语法语义解析,然后Server process在library cache找有没有他的执行计划,有缓存就直接软解析,没有就去磁盘的dbf去找,找到后解析成执行计划并进行硬解析,再选择出最优的执行计划执行

sql修改,server process首先在内存修改,修改会生成日志保存至Redo Log中,此时dbwr会将server process在内存修改的值写到硬盘中,而lgwr会把修改日志保存在Redo Log中。

为了更快的和用户的交互,所以将其它工作交给其它进程,server process只和用户交互。

oracle有多组日志,循环使用,可能会被覆盖,每组满了通过一个进程将日志归档到其他地方,这就在归档的地方保留了所有日志。

内存数据和硬盘数据一样就是干净;
内存修改了还没有写到磁盘叫脏;
service process对内存读写的瞬间是已连接或者是ping。

当从磁盘读取数据,优先使用空闲然后干净的缓存。

shared pool内存组成

共享池shared pool:free、library cache库缓存、row cache数据字典
library cache库缓存:用于存储可执行的 SQL 和 PL/SQL 代码;
row cache数据字典:包含有关数据库、其结构及其用户的引用信息。

三种解析:硬解析、软解析、软软解析。

free上有很多碎片,挂载在chain上,保存在Chunk上,chain作用:把功能类似的内存块串起来、可以遍历Oracle内存最大的特征就是使用了大量的chain,用锁latch来保护chain

出现ora-4031:太多硬解析、硬解析太多导致碎片化又出现大sql语句。

Library cache也有很多chain,挂着碎片。将sql语句字母转化成ascall码值,对这堆数据运算后得到编号,放在不同的chain链上。

SQL共享,绑定变量

Sql语句解析先转换成ascall码,通过hash运算得到值再运算,确定sql语句应该在哪个chain上,再通过hash值比较。

要想sql共享,必须完全一样包括字母大小写、空格、数值、回车等。不一样就硬解析。

  1. 统一书写风格;
  2. 绑定变量,占位符;

软解析命中率要解决百分之99以上

解决4031问题

出现ora-4031:太多硬解析、硬解析太多导致碎片化又出现大sql语句。

1、alter system flush shared pool:暂时解决4031,清空所有内存但是后面会出现大量硬解析;

2、共享sql,alter system set cursor_sharing 'force‘;可以解决字面值绑定变量的问题;

3、对大的对象进行keep;

4、保留区设的足够大,大的对象就会直接去保留区去;show parameter shared 

5、增加shared pool空间。

buffer cache

缓冲池(Buffer Cache)是用于缓存磁盘上的数据块,以提高数据库的读取性能。当需要读取数据块时,首先会在缓冲池中查找,如果数据块已经在内存中,就可以直接读取,避免了频繁的磁盘访问。

Oracle的dbf文件由一个个块(2、4、8、16、32k)组成,block块是数据库 I/O 的最小单位

可以认为一个表(普通)就是一个段,建段后会为这个段分配一个区区(extend)物理上连续的多个块,当区上数据插入满了,Oracle就会再为段分配一个区,区是oracle给段分配空间的最小单位。正常来说,一个块有多个行(行链接、行迁移例外)。

buffer cache的意义:缓存数据文件减少逻辑IO,构造CR块。

内存组织

有多个chain串在Chunk上,进行遍历。

CBC:Oracle 8i 及以前版本中采用的一种 Buffer 缓存分配方式,其主要作用在于实现了 Buffer 构成的链表结构,使得 Buffer 的定位和追寻更加高效,但是也容易出现 Buffer 等待锁的问题。

LRU:Oracle 缓存块的一种淘汰策略,也是应用最为广泛的一种算法。LRU算法根据缓存块的使用时间,通过维护一个链表,把最近使用过的缓存块放在链表的尾部,而最久未使用的缓存块则放在链表的头部。当需要淘汰缓存块时,就从链表的头部开始淘汰,这样能够保留最近使用过的缓存块,提高缓存命中率。

MRU:与 LRU 相反的算法,即优先淘汰最近使用的缓存块,留下最久未使用的缓存块。通常不用于 Oracle 缓存池的淘汰策略,因为它可能会淘汰掉新近使用过的缓存块,影响性能。

LRUW:在 Oracle 9i 中引入的一种淘汰策略,综合了 LRU 和 Write Policy,用于解决存储 I/O 操作中的性能瓶颈问题。当缓存池需要被替换的 Buffer 存在脏块(Dirty Block)时,则优先淘汰最久未使用的缓存块,以减少写入脏块后出现的延迟。

查看sga各部分大小:

SELECT component,current_size,min_size FROM v$sga_dynamic_components;

sql语句:热快查询

Oracle日志原理

记录方式:记录数据块地址、时间、数据块修改了什么。

如何确定不会丢失:commit的时候保证事务所有修改的日志写到redo log,日志总是先写入磁盘。

PGA

PGA主要部分是会话的sql的工作区(sort、hash、会话),还有SQL 执行统计信息、PGA 连接池。

最好使用自动管理模式。

Oracle存储结构

文件结构

控制文件是一些数据库的信息,状态信息等。通过复用方式,来防止文件丢失损坏,查看:

select name,value from v$parameter where name like '%control%';

数据文件包括永久数据文件,临时数据文件。数据文件=备份文件+最新日志文件。

控制文件、数据文件、日志文件一般放在存储上,都是联机文件。

参数文件,Oracle会在启动的时候使用一次。

备份文件:控制文件、参数文件(不一定每次备份),数据文件、归档日志文件(主要每次)。备份文件不可以放在存储上,一般放在离线上(带库)。

归档日志文件是离线文件,可能已经被拷走了,也不能放在存储上。

口令文件,可以临时生成。

预警和跟踪日志:显示报错。bdump是后台进程的问题,udump是service process的问题

表空间、段、区、块

表空间由一个或多个dbf数据文件组成,表空间是一个逻辑概念。查看表空间

select * from dba_tablespaces;
  • 段存在于表空间中。
  • 段由区的集合构成。
  • 区是数据块的集合。
  • 数据块将映射到磁盘块中。

表空间有一个或者多个dbf文件;

段可以跨dbf文件,但是不能跨表空间;

检查点

LRU争对可用干净的块,LRUW争对脏的块

检查点队列的chain:脏块、按照脏块第一次脏的顺序排列(lrba),将不经常使用的脏块写入磁盘。

rba:日志快的地址。

lrba:脏块的第早一次脏的日志地址。

hrba:脏块的最近一次脏的日志地址。

ckpt:1、完全检查点,触发dbwr,把所有脏块写到磁盘上;(关闭数据库时)

2、增量检查点,将检查点队列第一个日志地址(lrba)记录在控制文件中。(正常运行时)

增量检查点还会再IO不忙的时候而检查队列很长时,缩短队列,触发 dbwr将上面的写入磁盘。

实例崩溃恢复

Oracle突然崩溃,脏块没有写入磁盘,导致数据丢失。

目标:未提交的事务可以丢失,已提交的事务不可丢失。

redo log日志保存的是已提交,buffer log日志是未未提交。

使用redolog把脏块恢复构造出来,终点是redolog最后一条,在控制文件中找起点。

注:oracle可能把没有提交的构造出来,然后回滚。

恢复过程:

1、Oracle发现非正常关闭需要恢复;

2、oracle在控制文件找到检查点队的lrba地址,确定日志起点,终点是redolog最后一条;

3、oracle可能把没有提交的构造出来,然后回滚。

检查队列作用:确定起点。

SCN

SCN是一个基于时间点变化的唯一标识符。

scn的目的:为了保证文件的一致性。

假设有多个数据文件,控制文件有一个系统SCN,针对每个数据文件有一个文件SCN,还有结束SCN,每个数据文件开头有个起始SCN。

数据库打开:系统SCN、各文件SCN、文件头部的起始SCN都是一样的。结束SCN为空。

数据库关闭:Oracle把buffercache所有缓存写到磁盘上,同时结束SCN设置成和文件SCN一样。

非正常关闭:结束SCN没有设置为空,重启时就知道需要实例恢复(控制文件的lrba)。

日志文件:first、next scn。

跑日志:更新scn,防止scn太久了。数据库有scn号、日志有scn号,所以实例恢复的时候,日志多了就会空跑(比数据块scn更老的直接跳过)。

事务

Oracle数据库崩了,先整体前滚,再对未提交的事务回滚。

出现回滚:使用rollback;数据库嘎了恢复的时候;

ddl删除表会自动加上commit所以删了就回滚不了,所以执行ddl就相当于对前面所有语句提前。

隐式回滚:不同环境正常退出和异常退出可能提交回滚不一样。最好都是显示回滚。

Undo表空间

在Oracle数据库中,Undo表空间是用于存储回滚段数据的区域,用于支持数据库的事务和并发控制。当一条SQL语句执行时,Oracle会先将修改或删除原数据记录的所有操作写入 Undo 表空间,以便在发生回滚或恢复操作时,可以将数据还原到之前的状态。

undo表空间是自动管理的(段、区、块),undo表空间的作用:

  1. 回滚操作:Undo 表空间中存储了事务对数据库所做的修改操作的回滚信息。当发生事务回滚或撤销操作时,通过 Undo 表空间中的回滚数据,可以将数据库恢复到之前的状态,确保数据的完整性和一致性。

  2. 并发控制:多个会话(用户)在并发访问数据库时,可能会涉及到事务的读取和修改操作。Undo 表空间允许并行事务在数据修改时维护数据的一致性,通过读取最新的有效数据和检验每个事务的一致性来确保并发执行的事务之间没有冲突。

  3. MVCC 实现:MVCC是一种并发控制机制,基于 Undo 表空间中的回滚数据实现。MVCC 可以在读操作期间提供一致性快照版的数据,而不受正在执行写操作的其他事务的干扰。

  4. 闪回查询:Undo 表空间存储了过去事务对数据库所做的修改操作,在进行闪回查询(Flashback Query)时,可以使用 Undo 表空间中的数据来获取某个时间点之前的数据状态,而不需要恢复整个数据库。

  5. 数据库恢复:当发生严重故障或数据损坏时,可以利用 Undo 表空间中存储的回滚数据来还原数据库到之前的状态,进行数据库级别的恢复操作。

Undo 表空间中主要存储以下类型的信息:

  1. 回滚数据:每个事务在提交之前都会将修改或删除原始数据的操作写入 Undo 表空间。这些操作包括回滚段中的undo记录,主要是在事务发生变化时顺序的记录下每个数据块的状态,从而在事务发生回滚或恢复操作时,可以将数据还原到之前的状态。

  2. 回滚段头信息:在回滚段头中存放了回滚段的元数据信息,如回滚段状态、回滚段 ID、回滚段所属事务的 ID 和状态等。

  3. 统计信息:Oracle 数据库会在 Undo 表空间中存储一些与未提交事务有关的统计信息,如未提交事务的数量、占用的空间大小等。

  4. 表空间和段头信息:Undo 表空间还存储了一些表空间和段头信息,用于记录 Undo 表空间的使用情况,如表空间大小、空间限制、增长率等。

在 Oracle 中,回滚段存在几种状态:ACTIVE(活跃)、EXPIRED(已过期)、UNEXPIRED(未过期) 和 KILLED(已终止) 等。其中,ACTIVE 状态表示当前回滚段正在使用中,EXPIRED 状态表示这个回滚段已经不再使用,但是仍然保留在 Undo 表空间中,以便进行回滚操作。UNEXPIRED 状态表示这个回滚段已经过期但是不可用,KILLED状态表示这个回滚段已被终止并被撤销。

课件:刚开始事务没有使用free、事务开始使用段未提交时active、事务提交段时inactive、事务使用的区保留一段时间就可以被覆盖了expired。

图解一个事务的操作流程

1、 事务开始后,会分配一个事务ID(xid)。在undo表空间里分配一个undo段,在undo段(回滚段)的段头块的事务表中将自己的事务信息写入,同时在这个undo段里给这个事务分配一个undo块(回滚块),并将回滚快的地址写到事务表的事务槽里。

注:还有会在数据块事务槽里记录事务的信息。一个undo段最多有47个活跃事务。

2、获取事务开始修改数据块时,在数据块的头部获取一个事务槽,记录事务id(xid)。将修改前的数据记录到回滚快,同时将回滚快地址记录到事务槽,接下来就修改实际行,依次修改数据块。所有修改的数据块会串起来,如上图蓝色部分所示。

3、事务开始,修改了4个方面:回滚段的段头块的事务表、回滚段的回滚块、数据块的事务槽、数据块的数据行。这4方面都产生了redo,记录下了变化。

Oracle IMU机制

在12c中引入,用于优化数据库的撤销(Undo)管理,提高数据库性能和扩展性。

在传统的 Oracle中,Undo 段是通过物理磁盘上的数据文件来存储的,每次事务回滚或撤销时,需要从磁盘读取 Undo 段中的数据,这会影响数据库的性能和响应速度。为了优化数据库的性能,OracleIMU 采用了将 Undo 数据存储在内存中的方式,避免了频繁的磁盘 I/O 操作,提高了事务的响应速度和数据库的吞吐量。

OracleIMU 机制的工作原理如下:

  1. 在事务开始时,Oracle 数据库会为该事务分配一个(shared pool、buffer cache)内存缓存空间作为 Undo 数据的存储区域。

  2. 在执行事务操作时,生成的 Undo 记录将以内存缓存的形式被存储。这些记录在事务提交前不会写入磁盘,而是存储在内存中,以减少磁盘 I/O 操作。

  3. 当事务需要回滚时,将以内存的形式获取 Undo 记录进行撤销操作,避免了磁盘的读取操作。

  4. 在内存缓存区域使用到达极限时,OracleIMU 机制会使用 LRU(Least Recently Used)算法,将最近最少使用的 Undo 记录冷却并写入磁盘,以释放内存空间。

需要注意的是,OracleIMU 机制适用于数据库中频繁进行大量小数据量的写入或更新操作的场景。它可以极大地提升事务的响应速度和数据库的吞吐量,但是由于内存资源的限制,可能会增加系统的运维和调优的难度。

redo日志和undo日志

在 Oracle 数据库中,Redo 日志和 Undo 日志是两个重要的机制,用于确保数据的一致性、持久性和恢复性。它们有不同的功能和作用:

  1. Redo 日志:

    • 功能:Redo 日志记录了对数据库所做的所有修改操作,包括插入、更新和删除。它用于恢复数据库到故障发生前的状态。
    • 作用:当事务提交时,Redo 日志会被写入磁盘,以保证事务的持久性。在发生故障或数据库崩溃时,数据库可以通过重新执行 Redo 日志中的操作,将数据库恢复到故障前的状态。
  2. Undo 日志:

    • 功能:Undo 日志记录了对数据库所做的所有修改操作的回滚信息。它用于回滚事务、提供读一致性和支持并发控制。
    • 作用:
      • 回滚事务:当事务回滚时,Undo 日志中的回滚信息被使用来撤销事务的修改操作,将数据库恢复到事务开始之前的状态。
      • 读一致性:当一个事务正在进行时,其他事务可能同时读取与该事务相同的数据。为了保证读取的数据是一致的,数据库使用 Undo 日志来提供读一致性,即读取未提交事务之前的数据版本。
      • 并发控制:数据库使用 Undo 日志来跟踪正在进行的事务的状态,并确保事务之间的并发执行不产生冲突。通过读取最新有效的数据和检验事务的一致性,Undo 日志保证了事务的并发执行之间的一致性和隔离性。

区别:

  • 功能不同:Redo 日志记录了对数据库的修改操作,用于恢复数据库;Undo 日志记录了对数据库的修改操作的回滚信息,用于回滚事务、提供读一致性和并发控制。
  • 存储位置不同:Redo 日志存储在磁盘上的 Redo 日志文件中,用于恢复数据库;Undo 日志存储在内存中的 Undo 表空间中,用于回滚和提供读一致性。
  • 写入时机不同:Redo 日志在事务提交时才会被写入磁盘;Undo 日志在事务执行过程中就会生成,并在事务结束时被写入磁盘。
  • 恢复方式不同:Redo 日志通过重新执行事务操作来恢复数据库;Undo 日志通过撤销事务操作来恢复数据库。

Redo 日志和 Undo 日志是数据库的基本机制,它们相互配合,保证了数据库的一致性、持久性、读一致性和并发控制。它们的设计和使用是为了提供高可用性、可靠性和性能的数据库系统

读一致性(ORA-01555)

ORA-01555 错误是 Oracle 数据库中常见的错误之一,表示发生了读一致性的失败。

产生原因:
ORA-01555 错误通常是由以下原因之一引起的:
1. 长时间运行的查询:如果查询使用了较旧的 SCN(系统变更号),而它所需要的 Undo 数据已经被覆盖,就会导致 ORA-01555 错误。
2. 不足的 UNDO 表空间大小:如果 UNDO 表空间的大小不足以容纳查询所需的 Undo 数据,也会触发 ORA-01555 错误。
3. Undo 数据被清理:在高负载或低内存条件下,Oracle 数据库可能会主动清理 Undo 数据,以释放空间。但是,如果正在进行的查询所需的 Undo 数据被清理,就会导致 ORA-01555 错误。

内部具体结构:
ORA-01555 错误的产生涉及到数据库的读一致性和 Undo 日志。在 Oracle 数据库中,每个事务执行期间的修改操作都会生成 Undo 记录,用于回滚事务和提供读一致性。当查询需要读取某个 SCNs 之后的数据时,Oracle 首先会查找该 SCN 的 Undo 数据,并根据需要回滚到该 SCN 之前的数据版本。然而,如果查询所需的 Undo 数据已经被覆盖或清理,就会导致 ORA-01555 错误。

解决方法:
1. 增大 UNDO 表空间:增加 UNDO 表空间的大小可以提供更多的空间来保存 Undo 数据,减少 ORA-01555 错误的发生机会。
2. 调整查询的时间范围:如果查询涉及较长的时间范围,可以尝试减少查询的时间范围,以减少对 Undo 数据的需求。
3. 提高数据库的性能:通过调整数据库的配置、优化查询语句、增加硬件资源等方式,提高数据库的性能可以缩短事务执行的时间,减少 ORA-01555 错误的可能性。
4. 使用 flashback 查询或恢复:如果数据并非必须是准确的最新版本,可以考虑使用 flashback 查询或恢复功能,而不是依赖读取一致性。
5. 根据具体情况升级数据库版本:某些 Oracle 数据库版本对 ORA-01555 错误的处理方式可能有所改善,因此可能需要根据具体情况升级数据库版本。

需要注意的是,解决 ORA-01555 错误需要综合考虑数据库的配置、查询的特性和要求等因素,选择合适的解决方法。

字符集

锁的基本原理

锁的存在是用于管理并发访问数据库对象以维护数据的一致性和完整性。 

基本原理涉及以下几个方面:

  1. 锁粒度:Oracle 锁的基本单位是数据块(Block)。当对数据进行读取或写入时,Oracle 通常会在数据块级别上设置锁。如果多个事务需要访问同一数据块,其中一个事务可能会持有锁,而其他事务就需要等待。

  2. 锁类型:Oracle 提供了多种类型的锁,包括共享锁(Shared Lock)和排他锁(Exclusive Lock)等。共享锁允许多个事务同时读取数据,但不允许在数据上进行写操作。排他锁则是独占锁,它只允许一个事务进行读取和写入操作。

  3. 锁管理:Oracle 使用了多种技术来管理锁,确保数据的一致性和并发性。其中包括锁模式、锁队列、死锁检测和超时处理等机制。锁模式定义了锁的类型和级别,锁队列用于维护等待锁的事务队列。死锁检测机制会自动检测并解决因事务之间循环等待锁资源而导致的死锁问题。超时处理机制可确保在一定时间内获取不到所需的锁时,事务能够适当地终止或重试。

  4. 并发控制:Oracle 采用了多版本并发控制(Multi-Version Concurrency Control,MVCC)技术来支持高度并发的数据库访问。MVCC 在每个数据块上维护了多个版本的数据,使得多个事务可以同时读取不同版本的数据,从而避免了读取冲突。当一个事务对数据进行更新时,Oracle 会为新版本的数据分配空间,并在需要时进行数据版本的回滚或清理。

行级锁

行级锁是一种数据库锁,用于保护数据库中的单个行或记录,以实现并发事务的隔离和并发控制。它可以用于控制对特定行的读取和写入操作,以防止并发事务之间的数据冲突。

行级锁的工作原理如下:

  1. 并发事务请求锁:当一个事务需要对某行执行读取或写入操作时,它会向数据库系统请求获取一个行级锁。这个锁可以是共享锁(Shared Lock)也可以是排他锁(Exclusive Lock)。

  2. 共享锁(Shared Lock):当一个事务请求共享锁时,它可以读取行的内容,而其他事务也可以同时请求并获得共享锁。不同事务之间的共享锁不会互相阻塞,因为读操作不会对数据产生破坏性影响。

  3. 排他锁(Exclusive Lock):当一个事务请求排他锁时,它将获得对行的独占访问权限。在一个事务持有排他锁期间,其他事务无法获得共享锁或排他锁。这是为了防止其他事务读取或修改该行的数据,确保数据的一致性和完整性。

  4. 锁冲突检测:当一个事务请求行级锁时,在获取锁之前,数据库系统会检查该行是否已被其他事务锁定。如果发生锁冲突,数据库系统根据锁的类型(共享锁或排他锁)和数据库隔离级别来处理冲突。

TM 锁可以分为以下几种类型:

  1. TX 锁(Transaction Lock):TX 锁是在事务级别上对整个表进行获取的锁。它被用于控制事务的并发访问和修改。TX 锁可以是共享锁或排他锁。

  2. TM RX 锁(Transaction Management Read-Exclusive Lock):TM RX 锁是一种共享锁。它允许多个事务在读取时获取锁,但当有事务要对表进行写入操作时,它就会阻止其他事务获取排他锁。

  3. TM RS 锁(Transaction Management Row-Share Lock):TM RS 锁也是一种共享锁。它允许多个事务在读取时对行进行共享锁定,但会阻止其他事务获取排他锁或对相同行进行写入操作。

  4. TM S 锁(Transaction Management Share Lock):TM S 锁是一种共享锁,允许多个事务在读取时获取锁,但会阻止其他事务获取排他锁。

  5. TM X 锁(Transaction Management Exclusive Lock):TM X 锁是一种排他锁。它允许事务在读取和写入时获得锁,但会阻止其他事务获取任何锁。

共享行级排它锁(Shared Row-Level Exclusive Lock)是一种特定类型的锁,用于控制对数据库表中行的并发访问。

锁的相关视图

Oracle网络

Oracle网络没有负载

NetCA 是 Oracle 数据库软件中的一个实用工具,它用于配置和管理 Oracle 数据库网络环境。NetCA 是 Oracle Net Services Configuration Assistant 的缩写。

NetCA 提供了一个图形化界面,帮助用户轻松配置和管理 Oracle 数据库的网络参数,包括监听器、服务名、网络协议等。通过 NetCA,用户可以完成以下操作:

1. 配置监听器:监听器是 Oracle 数据库的网络接口,负责接收和处理客户端应用程序的连接请求。通过 NetCA,可以方便地配置监听器的监听地址、监听端口和监听协议等参数。

2. 管理服务名:服务名是数据库的标识符,客户端应用程序使用服务名来连接到数据库。NetCA 允许用户添加、修改和删除服务名,以便灵活管理数据库的连接。

3. 配置网络协议:Oracle 数据库支持多种网络协议,如 TCP/IP、IPC(Inter-Process Communication)和 SPX/IPX。NetCA 允许用户选择所需的网络协议,并进行相应的配置。

4. 测试连接:通过 NetCA,用户可以测试数据库与客户端应用程序之间的连接,确保网络配置正确并能够正常通信。

NetCA 提供了一个用户友好的界面,简化了复杂的网络配置过程。它是 Oracle 数据库安装后的常用工具之一,旨在提供方便和可视化的方式来管理和配置数据库的网络环境。

Oracle参数文件启动关闭

Oracle 数据库启动分为三个主要的阶段:nomount、mount、open

1. 实例启动(Instance Startup):在这个阶段,Oracle 数据库的实例会被启动。实例是一个内存结构和后台进程的集合,它负责管理数据库的内存和进程。在实例启动阶段,Oracle 数据库会完成以下关键任务:
   - 分配和初始化 SGA(System Global Area):SGA 是 Oracle 数据库的共享内存区域,用于存储数据缓冲区、共享池、重做日志缓冲区等关键数据结构。
   - 启动后台进程:Oracle 数据库会启动多个后台进程,如 PMON、SMON、DBWn、LGWR 等。这些进程负责管理数据库的各个方面,如进程监控、数据库恢复、数据写入和重做日志生成等。
   - 加载参数文件和控制文件:Oracle 数据库会加载配置文件,如 SPFILE(Server Parameter File)和控制文件,以获取数据库的参数设置和元数据信息。
   - 执行数据库恢复:如果数据库在上一次关闭过程中发生故障或异常终止,Oracle 数据库会执行必要的恢复操作,以恢复到一致的状态。

2. 数据库打开(Database Open):在实例启动后,需要进一步打开数据库。数据库打开阶段主要完成以下任务:
   - 通过检查控制文件验证数据库的完整性和一致性。
   - 打开和恢复数据文件:Oracle 数据库会打开需要访问的数据文件,并进行必要的数据块恢复。
   - 执行 REDO 日志重做:Oracle 数据库会将未提交的事务和修改的数据从重做日志中重新应用到数据库中,以确保数据库的一致性。

3. 用户服务启动(User Service Startup):在数据库打开后,Oracle 数据库会开始接受用户的连接请求,并提供数据库的服务。这个阶段包括以下任务:
   - 监听客户端连接请求:Oracle 数据库会启动监听器(Listener),负责监听客户端连接请求,并将其分发给适当的数据库后台进程。
   - 用户连接和会话启动:一旦监听器接受了客户端连接请求,Oracle 数据库会创建用户会话,并为用户提供数据库服务。

这三个阶段一起完成了 Oracle 数据库的启动过程,使其能够正常运行,接受用户的连接和请求,并提供数据库服务。

当 Oracle 数据库启动实例时,它会通过各个阶段进行。阶段如下:

  1. 在特定于平台的默认位置搜索服务器参数文件,如果未找到,则搜索文本初始化参数文件(使用SPFILE或PFILE参数指定STARTUP将覆盖默认行为)
  2. 读取参数文件以确定初始化参数的值
  3. 根据初始化参数设置分配 SGA
  4. 启动Oracle后台进程
  5. 打开警报日志和跟踪文件,并以有效的参数语法将所有显式参数设置写入警报日志

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值