ORACLE 体系结构

Oracle体系结构及备份——目录 Oracle体系结构及备份(一)——了解体系结构、Oracle体系结构及备份(二)——执行select语句的过程分析、Oracle体系结构及备份(三)——user-process、Oracle体系结构及备份(四)——server-process、Oracle体系结构及备份(五)——sga…… 阅读详情

-------------------------------------------------------------------------------- 
时间:2003-7-5 15:32:49 来源:花落无声 作者:杂霸书生 
--------------------------------------------------------------------------------
    
前言
        很多人大楷都是从SQL Server转过来的,可能是受MS的影响太深,老想着用SQL Server的方法来解决ORACLE的问题,这就是一个极大的失误,比如有人就老喜欢用那个OEM,那个我一直认为是ORACLE的糟粕的一个代表,ORACLE的精髓是代码的管理,任何管理、备份、恢复都可以通过代码或脚本实现。比如还有的人就喜欢SQL Server过程中能直接写select语句,认为ORACLE必须要能做,有人认为SQL SERVER的过程能执行DDL语句,那ORACLE也必须要这样……诚然,我不是承认不可以,但是很多的很多的这一切,就是你实现了,却是ORACLE强烈反对的,因为它们对ORACLE的性能可能有很大的影响。
        我想,要学好ORACLE,就必须脚踏实地,一步一步来,你可以拿两个数据库来比较,但是不要想着关系型数据库都是一样的,它们是有差别的,或多或少,一个简单的例子,在SQL Server中,一个表的修改是以页面级来锁定的,对表的修改是阻塞读操作的(如Select),所以SQL Server的锁是非常昂贵的,如果不是特别指定,一个语句就是一个事务。在ORACLE中,这一切都变了,ORACLE可以提供最小的行级锁,所有对表的锁定不影响Select查询,在ORACLE中,锁的资源占用是非常小的,所以ORACLE默认开启事务,直到你提交或回滚。
        我学ORACLE也就两年时间,到现在专职做ORACLE管理和ORACLE数据仓库,也是自己慢慢走过来的,我其实也没有得到高人指点,就是自己慢慢啃书,慢慢查资料。论坛可以用来交流,但是想让它让你有很大进步,可能性不大,毕竟,论坛上面系统性的东西太少。要想做一个好的DBA,是不容易的,有人总结了DBA 10点该做的和不该做的。
 
> #1 - Do Maintain your Expertise 
> #2 - Do Use the DBMS_STATS Package to Collect Statistics 
> #3 - Do Use Bind Variables 
> #4 - Do Put your Production Database in ARCHIVELOG Mode 
> #5 - Do Use Locally Managed Tablespaces 
> #6 - Do Monitor Your Database 
> #7 - Do Practice Recoveries 
> #8 - Do Get Involved with User Groups and Other Resources 
> #9 - Do Establish Standards and Change Control Processes 
> #10 - Do Think Ahead 
 
> Oracle Database Top 10 Don"ts 
> #1 - Don"t Waste Time Re-Organizing Your Databases 
> #2 - Don"t Use .Log or Other Common Extensions For Your Database File Names 
> #3 - Don"t Leave Your Database Open To Attack 
> #4 - Don"t Decide Against Hot Backups 
> #5 - Don"t Use ASSM 
> #6 - Don"t Forget the 80/20 Rule 
> #7 - Don"t Stack Views 
> #8 - Don"t Be a Normalization Bigot 
> #9 - Don"t Forget to Document Everything 
> #10 - Do Not Use Products You are Not Licensed For. 
        
 
        优快云上的专职从事数据库管理的可能很少,也就导致了这里很多人的问题都是在开发上面,当然,我不是要求大家学管理,就是开发,也需要对数据库理解,半懂不懂的搞开发,最可能的后果,可能就是项目的失败,而这是一个程序员的耻辱。
正因为优快云的这种特殊情况,很多高手都不愿意来这里,我问其原因,回答很简单,优快云只能让我退步,我去干什么,大家也都清楚,现在是一个信息化的时代,不是不进则退了,是进步慢也是退步的时代了。
今天就写这么多,下面开始转入正文,因为时间仓促,多少可能有些笔误或错误,也就希望大家指正,在以后的时间里,我会定期的写这么一些文章,希望大家有所收获,我的下一篇文章计划是“ORACLE的备份策应”。
此文不经许可,不可转载,如有必要,也需要注明出处!
-------------------------------------------------------------------------
 
概要
在本章里你可以了解以下内容
1、 ORACLE 实例——包括内存结构与后台进程
2、 ORACLE 数据库——物理操作系统文件的集合
3、 了解内存结构的组成
4、 了解后台进程的作用
5、 了解数据库的物理文件
6、 解释各种逻辑结构
 
一、ORACLE事例
1、ORACLE 实例
System Global Area(SGA) 和 Background Process 被成为数据库的实例。
2、ORACLE 数据库
一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)
3、系统全局共享区System Global Area(SGA) 
System Global Area 是一块巨大的共享内存区域,他被看做是Oracle 数据库的一个大缓冲池,这里的数据可以被ORACLE的各个进程共用。其大小可以通过如下语句查看:
SQL> select * from v$sga;
NAME VALUE
-------------------- ---------
Fixed Size 39816
Variable Size 259812784
Database Buffers 1.049E+09
Redo Buffers 327680
更详细的信息可以参考V$sgastat、V$buffer_pool
主要包括以下几个部分:
a、 共享池(Shared pool)
共享池是SGA中最关键的内存片段,特别是在性能和可伸缩性上。一个太小的共享池会扼杀性能,使系统停止,太大的共享池也会有同样的效果,将会消耗大量的CPU来管理这个共享池。不正确的使用共享池只会带来灾难。共享池主要又可以分为以下两个部分:
·SQL语句缓冲(Library Cache)
当一个用户提交一个SQL语句,Oracle会将这句SQL进行分析(parse),这个过程类似于编译,会耗费相对较多的时间。在分析完这个SQL,Oracle会把他的分析结果给保存在Shared pool的Library Cache中,当数据库第二次执行该SQL时,Oracle自动跳过这个分析过程,从而减少了系统运行的时间。这也是为什么第一次运行的SQL 比第二次运行的SQL要慢一点的原因。
下面举例说明parse的时间
SQL> select count(*) fromscpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.08
这是在Share_pool 和Data buffer 都没有数据缓冲区的情况下所用的时间
SQL> alter system flush SHARED_POOL;
System altered.
清空Share_pool,保留Data buffer
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.02
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.00
从两句SQL 的时间差上可以看出该SQL 的Parse 时间约为00:00:00.02
对于保存在共享池中的SQL语句,可以从V$Sqltext、v$Sqlarea中查询到,对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间。一个设计的差的应用程序可以毁掉整个数据库的Share pool,提高SQL语句的重用率必须先养成良好的变成习惯,尽量使用Bind变量。
·数据字典缓冲区(Data Dictionary Cache)
显而易见,数据字典缓冲区是ORACLE特地为数据字典准备的一块缓冲池,供ORACLE内部使用,没有什么可以说的。
b、块缓冲区高速缓存(Database Buffer Cache)
这些缓冲是对应所有数据文件中的一些被使用到的数据块。让他们能够在内存中进行操作。在这个级别里没有系统文件,,户数据文件,临时数据文件,回滚段文件之分。也就是任何文件的数据块都有可能被缓冲。数据库的任何修改都在该缓冲里完成,并由DBWR进程将修改后的数据写入磁盘。
这个缓冲区的块基本上在两个不同的列表中管理。一个是块的“脏”表(Dirty List),需要用数据库块的书写器(DBWR)来写入,另外一个是不脏的块的列表(Free List),一般的情况下,是使用最近最少使用(Least Recently Used,LRU)算法来管理。
块缓冲区高速缓存又可以细分为以下三个部分(Default pool,Keep pool,Recycle pool)。如果不是人为设置初始化参数(Init.ora),ORACLE将默认为Default pool。
由于操作系统寻址能力的限制,不通过特殊设置,在32位的系统上,块缓冲区高速缓存最大可以达到1.7G,在64位系统上,块缓冲区高速缓存最大可以达到10G。
c、重做日志缓冲区(Redo log buffer)
重做日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句,如(Insert,Update,Delete),或DDL语句,如(Create,Alter,Drop等)。
重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小,大于3M之后的重作日志缓冲区已经没有太大的实际意义。
d、Java程序缓冲区(Java Pool)
Java 的程序区,Oracle 8I 以后,Oracle 在内核中加入了对Java的支持。该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小。
e、大池(Large Pool)
大池的得名不是因为大,而是因为它用来分配大块的内存,处理比共享池更大的内存,在8.0开始引入。
下面对象使用大池:
·MTS——在SGA的Large Pool中分配UGA
·语句的并行查询(Parallel Executeion of Statements)——允许进程间消息缓冲区的分配,用来协调并行查询服务器
·备份(Backup)——用于RMAN磁盘I/O缓存
4、后台进程(Background process)
后台进程是Oracle的程序,用来管理数据库的读写,恢复和监视等工作。Server Process主要是通过他和user process进行联系和沟通,并由他和user process进行数据的交换。在Unix机器上,Oracle后台进程相对于操作系统进程,也就是说,一个Oracle后台进程将启动一个操作系统进程;在Windows机器上,Oracle后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个ORACLE.EXE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。
在Unix上可以通过如下方法查看后台进程:
ps –ef | grep ora_
# ps -ef | grep ora_ | grep XCLUAT
oracle 29431 1 0 Sep 02 ? 2:02 ora_dbwr_SID
oracle 29444 1 0 Sep 02 ? 0:03 ora_ckpt_SID
oracle 29448 1 0 Sep 02 ? 2:42 ora_smon_SID
oracle 29442 1 0 Sep 02 ? 3:25 ora_lgwr_SID
oracle 29427 1 0 Sep 02 ? 0:01 ora_pmon_SID
a、Oracle系统有5 个基本进程他们是
DBWR(数据文件写入进程)
LGWR(日志文件写入进程)
SMON(系统监护进程)
PMON(用户进程监护进程)
CKPT(检查点进程,同步数据文件, 日志文件,控制文件)
b、DBWR
将修改过的数据缓冲区的数据写入对应数据文件
维护系统内的空缓冲区
这里指出几个容易错误的概念:
·当一个更新提交后,DBWR把数据写到磁盘并返回给用户提交完成.
·DBWR会触发CKPT 后台进程
·DBWR不会触发LGWR 进程
上面的概念都是错误的.
DBWR是一个很底层的工作进程,他批量的把缓冲区的数据写入磁盘。和任何前台用户的进程几乎没有什么关系,也不受他们的控制。至于DBWR会不会触发LGWR和CKPT进程,我们将在下面几节里讨论。
DBWR工作的主要条件如下
·DBWR 超时
·系统中没有多的空缓冲区用来存放数据
·CKPT 进程触发DBWR 等
c、LGWR
将重做日志缓冲区的数据写入重做日志文件,LGWR是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志并记录在重做日志缓冲区内。这个重做日志可以类似的认为是以下的一个结构:
SCN=000000001000
数据块ID
对象ID=0801
数据行=02
修改后的数据=0011
提交的时候,LGWR必须将被修改的数据的重做日志缓冲区内数据写入日志数据文件,然后再通知前台进程提交成功,并由前台进程通知用户。从这点可以看出LGWR承担了维护系统数据完整性的任务。
LGWR 工作的主要条件如下
·用户提交
·有1/3 重做日志缓冲区未被写入磁盘
·有大于1M 重做日志缓冲区未被写入磁盘
·超时
·DBWR需要写入的数据的SCN号大于LGWR 记录的SCN号,DBWR 触发LGWR写入
d、SMON
工作主要包含
·清除临时空间
·在系统启动时,完成系统实例恢复
·聚结空闲空间
·从不可用的文件中恢复事务的活动
·OPS中失败节点的实例恢复
·清除OBJ$表
·缩减回滚段
·使回滚段脱机
e、PMON
主要用于清除失效的用户进程,释放用户进程所用的资源。如PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源。
f、CKPT
同步数据文件,日志文件和控制文件,由于DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一至,这就需要CKPT进程来同步。CKPT会更新数据文件/控制文件的头信息。
CKPT工作的主要条件如下
·在日志切换的时候
·数据库用immediate ,transaction , normal 选项shutdown 数据库的时候
·根据初始话文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的设置的数值来确定
·用户触发
以下进程的启动需要手工配置
g、ARCH
当数据库以归档方式运行的时候,Oracle会启动ARCH进程,当重做日志文件被写满时,日志文件进行切换,旧的重做日志文件就被ARCH进程复制到一个/多个特定的目录/远程机器。这些被复制的重做日志文件被叫做归档日志文件。
h、RECO
负责解决分布事物中的故障。Oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。RECO进程试图建立与远程服务器的通信,当故障消除后,RECO进程自动解决所有悬而未决的会话。
i、服务进程Server Process
服务进程的分类
·专用服务进程(Dedicated Server Process)
一个服务进程对应一个用户进程
·共享服务进程(MultiTreaded Server Process)
一个服务进程对应多个用户进程,轮流为用户进程服务。
PGA & UGA
PGA = Process Global Area
UGA = User Global Area
他保存了用户的变量、权限、堆栈、排序空间等用户信息,对于专用服务器进程,UGA在PGA中分配。对于多线程进程,UGA在Large pool中分配。
j、用户进程User Process
在客户端,将用户的SQL 语句传递给服务进程
5、一个贯穿数据库全局的概念----系统改变号SCN(System Change Number)
系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
a. 查询语句不会使SCN增加,就算是同时发生的更新,数据库内部对应的SCN也是不同的。这样一来就保证了数据恢复时候的顺序。
b. 维持数据的一致性,当一
 
二、ORACLE 数据库
 
ORACLE数据库的组成——物理操作系统文件的集合。主要包括以下几种。
1、控制文件(参数文件init.ora记录了控制文件的位置)
控制文件包括如下主要信息
·数据库的名字,检查点信息,数据库创建的时间戳
·所有的数据文件,联机日志文件,归档日志文件信息
·备份信息等
有了这些信息,Oracle就知道那些文件是数据文件,现在的重做日志文件是哪些,这些都是系统启动和运行的基本条件,所以他是Oracle运行的根本。如果没有控制文件系统是不可能启动的。控制文件是非常重要的,一般采用多个镜相复制来保护控制文件,或采用RAID来保护控制文件。控制文件的丢失,将使数据库的恢复变的很复杂。
控制文件信息可以从V$Controlfile中查询获得
 
2、数据文件(数据文件的详细信息记载在控制文件中)
可以通过如下方式查看数据文件
SQL> select name from v$datafile;
NAME
---------------------------------------------
/u05/dbf/PROD/system_01.dbf
/u06/dbf/PROD/temp_01.dbf
/u04/dbf/PROD/users_01.dbf
/u09/dbf/PROD/rbs_01.dbf
/u06/dbf/PROD/applsys_indx_01.dbf
/u05/dbf/PROD/applsys_data_01.dbf
从以上可以看出,数据文件大致可以分为以下几类:
i. 系统数据文件(system_01.dbf)
存放系统表和数据字典,一般不放用户的数据,但是用户脚本,如过程,函数,包等却是保存在数据字典中的。
名词解释:数据字典
数据字典是一些系统表或视图,他存放系统的信息,他包括数据库版本,数据文件信息,表与索引等段信息,系统的运行状态等各种和系统有关的信息和用户脚本信息。数据库管理员可以通过对数据字典的查询,就可以了解到Oracle的运行状态。
ii. 回滚段文件(rbs_01.dbf)
如果数据库进行对数据的修改,那么就必须使用回滚段,回滚段是用来临时存放修改前的数据(Before Image)。回滚段通常都放在一个单独的表空间上(回滚表空间),避免表空间碎片化,这个表空间包含的数据文件就是回滚数据文件。
iii. 临时数据文件(temp_01.dbf)
主要存放用户的排序等临时数据,与回滚段相似,临时段也容易引起表空间碎片化,而且没有办法在一个永久表空间上开辟临时段,所以就必须有一个临时表空间,它所包含的数据文件就是临时数据文件,主要用于不能在内存上进行的排序操作。我们必须为用户指定一个临时表空间。
iv. 用户数据文件(/applsys_data_01.dbf ,applsys_indx_01.dbf)
存放用户数据,这里列举了两类常见的用户型数据,一般数据和索引数据,一般来说,如果条件许可的话,可以考虑放在不同的磁盘上。
3、重做日志文件(联机重做日志)
用户对数据库进行的任何操作都会记录在重做日志文件。在了解重做日志之前必须了解重做日志的两个概念,重做日志组和重做日志组成员(Member),一个数据库中至少要有两个日志组文件,一组写完后再写另一组,即轮流写。每个日志组中至少有一个日志成员,一个日志组中的多个日志成员是镜相关系,有利于日志文件的保护,因为日志文件的损坏,特别是当前联机日志的损坏,对数据库的影响是巨大的。
联机日志组的交换过程叫做切换,需要特别注意的是,日志切换在一个优化效果不好的数据库中会引起临时的“挂起”。挂起大致有两种情况:
·在归档情况下,需要归档的日志来不及归档,而联机日志又需要被重新利用
·检查点事件还没有完成(日志切换引起检查点),而联机日志需要被重新利用
解决这种问题的常用手段是:
i.增加日志组
ii.增大日志文件成员大小
通过v$log可以查看日志组,v$logfile可以查看具体的成员文件。
4、归档日志文件
Oracle可以运行在两种模式之中,归档模式和不归档模式。如果不用归档模式,当然,你就不会有归档日志,但是,你的系统将不会是一个实用系统,特别是不能用于生产系统,因为你可能会丢失数据。但是在归档模式中,为了保存用户的所有修改,在重做日志文件切换后和被覆盖之间系统将他们另外保存成一组连续的文件系列,该文件系列就是归档日志文件。
有人或许会说,归档日志文件占领我大量的硬盘空间,其实,具体想一想,你是愿意浪费一点磁盘空间来保护你的数据,还是愿意丢失你的数据呢?显而义见,我们需要保证我们的数据的安全性。其实,归档并不是一直占领你的磁盘空间,你可以把她备份到磁带上,或则删除上一次完整备份前的所有日志文件。
5、初始化参数文件
initSID.ora或init.ora文件,因为版本的不一样,其位置也可能会不一样。在8i中,通常位于$ORACLE_HOME/admin//Pfile下
初始化文件记载了许多数据库的启动参数,如内存,控制文件,进程数等,在数据库启动的时候加载(Nomount时加载),初始化文件记录了很多重要参数,对数据库的性能影响很大,如果不是很了解,不要轻易乱改写,否则会引起数据库性能下降。
6、其他文件
i . 密码文件
用于Oracle 的具有sysdba权限用户的认证.
ii. 日志文件
·报警日志文件(alert.log或alrt.ora)
记录数据库启动,关闭和一些重要的出错信息。数据库管理员应该经常检查这个文件,并对出现的问题作出即使的反应。你可以通过以下SQL 找到他的路径select value from v$PARAMETER where name ="background_dump_dest";
·后台或用户跟踪文件
系统进程或用户进程出错前写入的信息,一般不可能读懂,可以通过ORACLE的TKPROF工具转化为可以读懂的格式。对于系统进程产生的跟踪文件与报警日志文件的路径一样,用户跟踪文件的路径,你可以通过以下SQL找到他的路径select value from v$PARAMETER where name ="user_dump_dest";
 
三、ORACLE逻辑结构
 
1、 表空间(tablespace)
表空间是数据库中的基本逻辑结构,一系列数据文件的集合。一个表空间可以包含多个数据文件,但是一个数据文件只能属于一个表空间。
2、 段(Segment)
段是对象在数据库中占用的空间,虽然段和数据库对象是一一对应的,但段是从数据库存储的角度来看的。一个段只能属于一个表空间,当然一个表空间可以有多个段。
表空间和数据文件是物理存储上的一对多的关系,表空间和段是逻辑存储上的一对多的关系,段不直接和数据文件发生关系。一个段可以属于多个数据文件,关于段可以指定扩展到哪个数据文件上面。
段基本可以分为以下四种
·数据段(Data Segment)
·索引段(Index Segment)
·回滚段(Rollback Segment)
·临时段(Temporary Segment)
3、区间(Extent)
关于Extent的翻译有多种解释,有的译作扩展,有的译作盘区,我这里通常译为区间。在一个段中可以存在多个区间,区间是为数据一次性预留的一个较大的存储空间,直到那个区间被用满,数据库会继续申请一个新的预留存储空间,即新的区间,一直到段的最大区间数(Max Extent)或没有可用的磁盘空间可以申请。
在ORACLE8i以上版本,理论上一个段可以无穷个区间,但是多个区间对ORACLE却是有性能影响的,ORACLE建议把数据分布在尽量少的区间上,以减少ORACLE的管理与磁头的移动。
4、Oracle数据块(Block)
ORACLE最基本的存储单位,他是OS数据块的整数倍。ORACLE的操作都是以块为基本单位,一个区间可以包含多个块(如果区间大小不是块大小的整数倍,ORACLE实际也扩展到块的整数倍)。
5、基本表空间介绍
a. 系统表空间
主要存放数据字典和内部系统表基表
查看数据数据字典的SQL
select * from dict
查看内部系统表的SQL
select * from v$fixed_view_definition
DBA对系统的系统表中的数据字典必须有一个很深刻的了解,他们必须准备一些基础的SQL语句,通过这些SQL可以立即了解系统的状况和数据库的状态,这些基本的SQL包括
系统的剩余空间
系统的SGA 
状态系统的等待
用户的权限
当前的用户锁
缓冲区的使用状况等
在成为DBA 的道路上我们不建议你过分的依赖于OEM/Quest 等优秀的数据库管理工具,因为他们不利于你对数据数据字典的理解,SQL语句可以完成几乎全部的数据库管理工作。
大量的读少量的写是该表空间的一个显著的特点。
b. 临时表空间.
临时表空间顾名思义是用来存放临时数据的,例如排序操作的临时空间,他的空间会在下次系统启动的时候全部被释放。
c. 回滚段表空间
i. 回滚段在系统中的作用
当数据库进行更新插入删除等操作的时候,新的数据被更新到原来的数据文件,而旧的数据(Before Image)就被放到回滚段中,如果数据需要回滚,那么可以从回滚段将数据再复制到数据文件中。来完成数据的回滚。在系统恢复的时候, 回滚段可以用来回滚没有被commit 的数据,解决系统的一至性。
回滚段在什么情况下都是大量的写,一般是少量读,因此建议把回滚段单独出来放在一个单独的设备(如单独的磁盘或RAID),以减少磁盘的IO争用。 
ii. 回滚段的工作方式
·一个回滚表空间可以被划分成多个回滚段.
·一个回滚段可以保存多个会话的数据.
·回滚段是一个圆形的数据模型
假设回滚段由4 个区间组成,他们的使用顺序就是区间1à区间2à区间3à区间4à区间1。也就是说,区间是可以循环使用的,当区间4到区间1的时候,区间1里面的会话还没有结束, 区间4用完后就不能再用区间1,这时系统必须分配区间5,来继续为其他会话服务服务。
我们分析一个Update 语句的完成
①. 用户提交一个Update 语句
②. Server Process 检查内存缓冲.
如果没有该数据块的缓冲,则从磁盘读入
i. 如果没有内存的有效空间,DBWR被启动将未写入磁盘的脏缓冲写入磁盘
ii. 如果有有效空间,则读入
③. 在缓冲内更新数据
i. 申请一个回滚段入口,将旧数据写如回滚段
ii. 加锁并更新数据
iii. 并在同时将修改记录在Redo log buffer中
④. 用户提交一个Commit 语句
i. SCN增加
ii. 将Redo log buffer 写入Redo log file
iii. 返回用户Commit 完成
 
四、ORACLE核心初探
 
1、LRU 算法和数据缓冲区
我们知道Oracle 数据库的文件大小远远大于Oracle 的所拥有的内存区域SGA,LRU就是一种尽可能将常用的数据保留在内存的算法。当数据库需要一个数据缓冲区,他会从数据库缓冲区的LRU队列的尾部找一个空闲的缓冲,将一个数据块读入,然后数据库会把这个缓冲区放到LRU 队列的中部,如果该缓冲被其他程序用到的话,那么他会往队列的头上移动,如果这个缓冲没有被其他程序用到,并且没有被修改过,那么他会慢慢的移动到LRU 队列的尾部,最终被认为是空缓冲区被其他数据块所覆盖。一旦这个缓冲区被修改过DBWR把他从LRU队列中移出,放到LRUW 队列(也叫赃缓冲区)中,等待DBWR把他们批量写入数据文件,然后再把他们的缓冲区连接到LRU队列的尾部,周而复始的工作。
理解HASH算法,为了提高速度Oracle在设计中采用了大量的HASH算法,这里我们讲一下HASH算法的理论知识,在以后的阅读中会对Oracle有更好的理解。HASH是一种以空间换取时间的做法。假如我有100万条数据,以队列的方式存储,如果我要从里面找一条数据,那么我要从头开始找,我所需要的空间是100万个存储单元,如果我用HASH的方法来存储,我把存储空间划分为1000*2000的数组,把100万个数据分别按照如下规则添入该数组:
1. 定义一个函数,使得每条数据对应一个0-999的值
2. 把该行记录存储在以函数返回值为下标的数组里
3. 我们称该函数为hash 函数f(row). hash 函数的返回值为hash 值.数组为
hash 数组HashArray[n][m].
即有下列公式
find a unused buffer in HashArray[f(row)][?]
HashArray[f(row)][?] = row;
这样,当我们需要一个行时候我们只需简单的计算该行的hash值,然后到下标为hash值的hash数组里找就可以了。即使用最简单的方法也可以很快的找到
For (I=1;I<=2000; I ++)
If (HashArray[f(row)][I.] == row ) return;
Next
当然HASH算法还是很复杂的,这里只是一个最最简单的例子。如果大家有兴趣可以看看有关数据结构的资料,这里就不具体展开了。
 
2、LATCH(Oracle内部锁)
有许多人问我Latch和Lock 的区别,其实很简单,Latch是Oracle内部的Lock,他负责更为细小的内部读写,比如Oracle要把用户更新的数据写入缓冲区,这时候Oracle就会在该缓冲区上加上latch,用来防止DBWR把他写出到磁盘,因为如果没有这个Latch,DBWR会把一半新一半老没有用的数据写到磁盘上。
 
五、常见问题
 
1、实例和SID的关系是什么?
经常有人问SID 是什么?在Oracle 系统中SID 是一个经常出现的变量,如环境变量ORACLE_SID, 初始化文件initSID.ora,那究竟什么是SID 呢?其实SID 就是Oracle 实例的标识,不同的SID 对应不同的内存缓冲(SGA)和不同的后台进程。这样一来我们就可以得当在一台物理的服务器上可以有多个SID 的数据库实例。
2、Oracle数据库和实例的关系是什么?
数据库是由物理文件和存取数据文件的实例组成,当存取数据文件的实例是一个的时候,数据库被称做单节点数据库。这是我们看到的最多的数据库形式。当然还有一种多节点数据库,就是一个以上的实例共同访问一个数据库(或者说共同访问一组数据文件), 更好的提供稳定性和并行处理能力。这在8i中被称为OPS(Oracle Parallel Server ),在Oracle9i 中被称为RAC(real application cluster)。在这种数据库中。两个/多个实例分别在不同服务器上,所有Oracle 数据文件在共享的磁盘阵列上,多个服务器上的实例可以同时工作,他们通过一个内部的网络进行通信。如果一台服务器不能提供服务的话,另一台会接管它的工作,特别是在关键的业务有很大的潜力。
3、在运行的数据库中数据文件中是不是可能存在没有被提交的数据?
这是可能存在的,因为用户数据文件的数据是由DBWR写入的,DBWR是一个很底层的后台进程,不负责与用户交互。用户的交互是由LGWR完成的。
4、在问题3中,如果存在没有写入的数据,那么机器突然断电,数据完整性会不会损坏?
不会的,因为数据库的完整性是LGWR来保证的,而且ORACLE保证了DBWR写入数据文件的任何修改已经被记录在重做日志文件中。当系统再次启动的时候,通过读取重做日志文件就可以知道那些数据没有被提交。这时候ORACLE 会自动回滚那些数据。所以说联机日志的损坏,特别是当前联机日志的损坏,对数据库的影响是巨大的,可能会导致数据库的不完整。
5、数据文件损坏会丢失数据吗?
可以这么说,如果你有备份和归档,就不会。因为所有对数据修改的记录都在重做日志中有记录,所以不会丢失数据,你只要恢复以前的备份再用归档日志文件恢复和当前的在线重做日志就可以恢复所有数据。
6、在线重做日志损坏会丢失数据吗?
以上说了,在线日志对数据库的损坏是极大的,所以不仅可能丢失数据,还可能引起数据库的不同步。在重做日志中的所有commit的记录都会丢失,这也是Oracle 为什么要对在线重做日志文件做镜像的原因。任何的数据丢失都是不允许的。
7、我在事务能不能指定不写回滚段?
不可以的,写回滚段是ORACLE保证一致性读和事务一致性的根本。回滚段是高写入段,建议把它放到单独的设备上来。
对于DDL语句,如DROP,TRUNCATE却可以不写回滚段(没有UNDO信息),所以对于整个表的删除,如果数据量比较大,建议用Truncate Table的方法。
不写联机日志也是不可能的,但可以在某些特定操作中,可以写很少的联机日志,如以NOLOGGING的方式通过Create table tablename as select创建表,或以Append的方式Insert数据到表,或直接载入等操作。
 
六、小结
 
这里,我们了解了实例和数据库的关系,一个数据库可以有多个实例,但是一个实例却不可能对应多个数据库,在一般的情况下,我们都是用的单节点数据库,即一个实例仅仅对应一个数据库。
我们了解了ORACLE实例的组成,包括内存和后台进程,进一步解释了SGA的组成与SGA的作用,并分析了语句重用的好处。在后台进程中,重要的阐述了DBWR与LGWR,其中DBWR是一个底层的由ORACLE控制的后台进程,而LGWR负责与用户交互.
在ORACLE数据库中,我们重要阐述了数据库的物理与逻辑结构,在物理结构中,需要注意四类以下文件:控制文件,联机日志,数据文件与参数文件。在逻辑结构中,需要清楚每个逻辑结构的关系,从大到小的顺序为:表空间à段à区间à块。
最后,简单的描叙了两个ORACLE的核心内容,LRU算法与LATCH,并初步阐述了HASH算法的相关内容。有关ORACLE更多的核心内容,可以参考相关资料。
 
参考文献:
http://www.happyit.net
ORACLE 联机文档
Expert One-on-one Oracle [美] Thomas Kyte 著 清华大学出版社
Oracle 8i Web开发指南 [美] Dan Hotka,et al. 著 清华大学出版社
Oracle 8i DBA Architecture & Administration and backup & Recovery Study Guide
[美] Dong Stuns Biju Thomas著 电子工业出版社
Oracle 数据库管理员技术指南 [美] Sumit Sarin著 机械工业出版社

Python气象雷达数据处理实战:用PyCINRAD从基数据到PPI图的完整流程 本文详细介绍了使用PyCINRAD库处理气象雷达基数据并生成PPI图的完整流程,涵盖环境配置、数据读取、反射率与速度数据提取、可视化优化等关键步骤。通过实战案例演示如何从原始雷达数据到专业级PPI图像生成,为气象研究和业务应用提供高效解决方案。 阅读详情

相关推荐

告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)

本文详细介绍了如何使用ArcGIS和GTB进行生态源地MSPA分析的全流程,包括软件安装、数据预处理、参数设置、结果可视化和常见问题排查。特别针对ArcGIS和GTB组合使用时的常见问题提供了避坑指南,帮助研究者高效完成生态规划任务。

weixin_30756499的博客 435

【原创】oracle中普通insert和直接装载的性能差别

这是以前做的一个测试,拿出来给大家作为参考吧 测试表:mqqtest 测试表原始数据量:0 插入数据量:1000w 分三种方法插入作为对比参数: 1.create table as select 方式 2.insert into方式 3.insert /*+append*/ into方式 第一种方法由于是一个ddl操作,不需写回滚段,因此耗时在dbwr 第二种方法是...

weixin_30485291的博客 136

光电振荡器(OEO):从原理到应用,解锁高频微波信号新纪元

本文深入解析了光电振荡器(OEO)的核心原理与前沿应用。OEO通过巧妙的光-电-光转换机制,利用光学谐振腔产生高频、高纯度、低相位噪声的微波信号,有效突破了传统电子电路的频率瓶颈。文章详细拆解了其工作流程,并探讨了在雷达系统、高速光通信及精密测量等领域的硬核应用价值。

weixin_29231027的博客 366

oracle ocp笔记(1)

第一课 第5章 触发器介绍创建数据库创建数据字典catproc.sql 用于创建oracle的内置过程ddl触发器举例:create or replace trigger log_logon after logon on database when (user='SYS' OR user like 'OPS$%')BEGIN insert into sys.event_log valu...

weixin_30780221的博客 261

缺陷检测-金属表面缺陷检测

1介绍 缺陷检测是工业视觉技术中最重要的组成部分。业务广泛,场景丰富,技术难点高、工作量大。针对不同的场景,选择不同的相机和

huneng1991的专栏 5250

vasp算表面吸附流程_VASP表面吸附计算实例分析

本文主要为了记录在学习Vasp计算过程中如何设置INCAR中的一些参数,并不着重讲解其含义,详见可自行到vasp官网查阅。其次关于建模部分也不做细致讨论,一般结构可从Materials Studio里自带的晶体数据库导出,或从三大数据库网站上下载:1、Materaials Project网址:https://materialsproject.org/(强烈推荐,邮箱注册即可使用)2、CCDC网址:...

weixin_39617669的博客 2240

如果用append插入1亿行,回滚的时候会发生什么问题?

走如果用append插入1亿行,回滚的时候会发生什么问题? 测试: (1)第一个会话下执行 CREATE TABLE t (a INTEGER); insert into t select a.object_id from dba_objects a,dba_objects b where rownum <1000000; (2)新开一个会话执行: create TABLE t_appe

Angelina7的博客 590

【AutoDL + Langchain-Chatchat】从零构建高效本地 RAG 知识库问答系统:实战保姆级教程(含避坑指南)

本文详细阐述如何在AutoDL云平台,如何利用Langchain-Chatchat构建高效的本地RAG知识库问答系统,并深入解析RAG架构。从环境搭建到实战部署,从问题排查到性能优化,提供一份全面实用的指南,助力开发者快速构建智能问答应用。

拾光夕拾的博客 1803

oracle的architecture,ORACLE 体系结构(Architecture of ORACLE)

一、ORACLE事例1、ORACLE实例System Global Area(SGA)和Background Process被成为数据库的实例。2、ORACLE数据库一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)3、系统全局共享区System Global Area(SGA)System Global Area是一块巨大的共享内存区域,他被看做是Ora...

weixin_31650287的博客 214

把 MCP Server 直接装进 SAP ABAP:用 Unlimited Display Tools 打通 Agentic SDK 与 SAP ECC / S/4HANA 的最后一公里

摘要:AI与SAP集成的MCP解决方案 企业在AI集成中面临工具链复杂、数据对接繁琐的挑战。Model Context Protocol (MCP)通过标准化工具与数据暴露方式,将集成复杂度从N×M降至N+M。在SAP生态中,MCP Server for SAP直接部署于ABAP层,利用DDIC/CDS视图对接各类Agent SDK,避免中间件风险。 MCP核心包含三类对象: Tools:带元数据的可执行动作 Resources:结构化上下文数据 Prompts:可参数化提示模板 ABAP层实现MCP Se

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 683

张力控制速度闭环控制算法

这个算法的核心思想是通过比较实际速度和期望速度的差异来调整控制信号,以达到稳定的速度控制。比例项用于直接根据误差调整输出,积分项用于积累误差并进行补偿,微分项用于预测误差的变化趋势并进行调整。张力控制是在许多工程和工业应用中非常重要的一个过程,它涉及到通过调节力的大小来实现稳定的工作状态。通过合理设置比例、积分和微分系数,并结合实际系统的特性进行调试和优化,可以实现准确稳定的张力控制。速度闭环控制算法通过比较实际速度和期望速度之间的差异,并根据差异调整系统的输出,以保持速度稳定。

LiJavascript的博客 1304

oracle的architecture,oracle architecture overview

oracle体系结构包括以下几个方面:oracle server、oracle instance、oracle databaseoracle server是数据库管理系统dbms,由instance和databse组成,提供开放、广泛、集成的信息管理oracle instance由memory和bg进程组成,是访问数据库的手段,memory主要包括SGA系统全局区oracle database主要...

weixin_30819373的博客 191

AUTOSAR EcuM模块介绍

AUTOSAR EcuM概述 AUTOSAR EcuM全称是Autosar ECU State Manager,位于Autosar BSW中System Service模块中,是一个独立于硬件的模块。 其主要作用是管理ECU上下电启动的状态,具体为: 初始化启动操作系统所需要的BSW(Basic Software)模块 为睡眠阶段和随后的唤醒完成微控制器的配置准备 管理ECU上的所有唤醒事件(EcuM通过唤醒验证协议验证已发生的唤醒,区分真实的唤醒事件,防止误唤醒) EcuM支持的特性列表 EcuM具有

酒无忧的博客 2996

详细说明oracle的体系结构,Oracle体系结构详细图解

首先声明一下,我的学习笔记参考书主要是官方教材,oracle9i database administration fundaments ed2.0我觉得学习是一个循序渐进的过程,从面到点,从宏观到微观,逐步渗透,各个击破,对于oracle,怎么样从宏观上来理解呢?先来看一个图,这个图取自于上面提到的教材,这个图对于从整体上理解ORACLE的体系结构组件,非常关键.下面来解释下这个图.对于一个数据库...

weixin_36056010的博客 261

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

oracle 体系结构

前几天面试的时候面试官才问过我ORACLE的体系结构,让我在一张白纸上画出来。回头想想当时答得还不错,大部分内容都描述出来了,呵呵,刚才在网上看到一篇讲解ORACLE体系结构的文章,觉得不错,转过来存着,将来可能会用到。 ================================================================================= 

朝着梦想 渐行前进 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ORACLE体系结构简述

ORACLE体系结构(短知识) SQL的解析开始的位置是PGA–>私有SQL区 PGA (PROGRAM GLOBAL AREA)程序全局区 数据库SESSION保存在UGA里面(USER GLOBAL AREA)用户全局区 SGA (SYSTEM GLOBAL AREA)系统全局区 PGA+SGA = 内存结构 PGA+SGA+进程结构区 = 实例(INSTANCE) SQL底层 == 执行计划树 执行计划树 != 执行计划 ORACLE的体系结构主要分三类 内存结构 进程结构 存储结构 为什么OR

m0_38036502的博客 330

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Oracle筑基篇-体系结构概览

Oracle筑基篇-体系结构概览

weixin_60783132的博客 1281

ORACLE数据库学习之体系结构

Oracle 体系结构 ORACLE数据库体系结构决定了oracle如何使用网络、磁盘和内存。包括实例(instance),文件(file)和进程(process不包括后台进程)三部分。 实例:每一个运行的ORACLE数据库与一个ORACLE实例(INSTANCE)相联系。每一次在数据库服务器上启动一数据库时,称为系统全局区(SYSTEMGLOBAL AREA)的一内

淡 1950

Oracle体系结构

Oracel体系结构(一)Oracel体系结构(一)oracle服务器(server)oracle实例oracle数据库Oracle其他关键文件共享池(shared pool)数据库高速缓冲区(database buffer cache)重做日志缓冲区(redo log buffer)大池(large pool)和Java池(java pool)内存缓冲区信息的获取-SGA_MAX_SIZE标题重...

nd_liuyazhen的专栏 331

oracle体系结构

•数据库:物理操作系统文件或磁盘的集合。 •实例:一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。 任何硬件平台或操作系统下的ORACLE体系结构都是相同的, 包括如下四个方面: •物理结构 数据文件,日志文件,控制文件,参数文件。 •逻辑结构 表空间、段、区间、数据块。 •内存结构 共享池,数据缓冲区,日

xiaojy的专栏 657

Oracle体系结构及备份(一)——了解体系结构

Oracle体系结构及备份开篇,了解体系结构。                 @Wentasy 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。原创博文如需转载请注明出处,谢谢 :) [优快云博客]

DBA@Robin 4843

oracle 体系结构认识,Oracle的体系结构(七)

天地初开,一切皆为混沌,是为无极;阴阳交合,阴阳二气生成万物是为太极;清者上升为天,浊者下沉为地,分为东,南,西,北四方,每方各有一神首镇守,东方青龙,西方白虎,南方朱雀,北方玄武,是为四象;智者伏羲,凭日月升降悟出乾坤之奥,从而创出八卦,分为乾,坤,艮,震,巽,坎,兑,离,由八卦图又衍生出八门,休,伤,生,杜,景,死,惊,开同时还有太极生两仪,这两仪,一说为阴阳,一说为天地,一说为奇偶,一说为刚...

weixin_39701735的博客 138

图文深入理解Oracle体系结构之体系结构概述篇

本文将以图文并茂的方式,由浅入深,教你一文读懂Oracle体系结构之体系结构概述

qq_45732829的博客 1126

oracle管理 体系结构,Oracle体系结构和用户管理

SQL> select name,bytes/1024/1024||‘MB‘ from v$sgainfo;// 查看共享池的大小。SQL> set timing on//启动时间。SQL> select * from scott.emp;//查询scott.emp表。SQL> show parameter db_cache_size;//查询缓冲区的大小。oracle进程...

weixin_35407400的博客 156

Oracle的体系结构

文章目录一、概述二、用户进程和服务进程1、用户进程2、服务进程三、系统全局区SGA四、后台进程五、存储结构1、逻辑存储结构2、物理存储结构六、版权声明 一、概述 Oracle的体系结构是数据库的组成、工作过程,以及数据库中数据的组织和管理机制,包含一系列组件(软件)、用户进程(User process)、服务进程(Server process、PGA)、SGA(共享池、数据缓存、日志缓冲区)、后台...

C语言实战技术 337

Oracle 体系结构

  一、Oracle 体系结构概述   Oracle 数据库体系结构主要用来分析数据库组成、工作过程与原理,Oracle数据库是一个逻辑概念,而不是物理概念上安装了Oracle数据库管理系统的服务器。   Oracle数据库管理系统有三个重要的概念需要理解:实例(instance)、数据库(database)、数据库服务器(database server)。Instance包括SGA...

a77687789的博客 179
上一篇: 自己动手用c#写控件
下一篇: 生病了......
devercn
博客等级 码龄23年 16粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值