注:翻译自concept,每天翻译一点点~
oracle 数据库实例简介(Introduction to the Oracle Database Instance
数据库实例是管理数据文件的一组内存结构。数据库是由CREATE DATABASE创建的一组存放在磁盘上的物理文件。实例管理相关的数据,为数据库的用户提供服务。
每个运行中的数据库至少与一个数据库实例关联。因为实例存在于内存,数据库存放在磁盘上,实例或数据库都可以单独存在。
数据库实例体系(Database Instance Structure )
当实例启动,Oracle分配一个内存区域称作SGA(system global area),启动一组后台进程。SGA有很多用途,如下所示:
* 管理被许多进程和线程并发访问的内部数据结构
* 缓存从磁盘读取的数据块
* 在写入在线日志前缓存redo数据
* 存储sql执行计划
SGA被运行在一台机器上的Oracle进程共享,包括服务进程和后台进程。Oracle进程和SGA关联的方式因操作系统而异。
数据库实例包含后台进程。服务进程以及为这些进程分配的内存同样存在于实例中。服务进程终止后实例也能继续工作。
下图展示了Oracle数据库实例的主要组件:
Database Instance
数据库实例配置(Database Instance Configurations )
你能在以下任意环境中运行oracle数据库:
* 单实例配置
数据库和实例是一对一的关系
* RAC环境
数据库和实例是多对多的关系
shows possible database instance configurations
不管是在单实例还是在RAC配置中,一个实例同一时间只能与一个数据库关联。你能启动一个实例并挂载一个数据库,但是同一时间一个实例不能挂载两个数据库。
不同的实例可以并行地运行在同一机器上,每一个访问它自己的的数据库。例如,一台机器可以有两个数据库:prod1和prod2。一个实例管理prod1,另一个不同的实例管理prod2。
实例的生命周期(Duration of an Instance )
一个实例由STARTUP命令开始,被终止时结束。在这个过程中,一个实例只能跟一个数据库关联。而且,一个实例只能挂载一次数据库,只能关闭一次数据库,只能打开一次数据库。一个数据库关闭后,你必须启动一个不同的实例去挂载、打开这个数据库。
SID( Oracle System Identifier )
SID是oracle在一台特定主机上的唯一名。在unix和linux上,oracle使用SID和Oracle home生成一个指向共享内存的值。同时,默认情况下SID被用来定位参数文件,参数文件是用来定位相关文件的,比如控制文件。
在大多数平台上,ORACLE_SID用来设置SID,ORACLE_HOME用来设置Oracle home。当连接到实例,客户端可以在oracle连接串中确定SID,或是使用网络服务名(net service name)。oracle将服务名转换为ORACLE_HOME和ORACLE_SID。
实例启停概览(Overview of Instance Startup and Shutdown)
用户通过实例访问数据库。本节介绍实例和数据库的可能状态。
数据库从关闭到启动经历了以下步骤:
1.实例启动,未挂载数据库
实例已启动,未关联数据库。
2.数据库挂载
实例已启动,通过读取控制文件与一个数据库相关联。数据库对用户来讲是关闭的。
3.数据库打开
实例已打开,与一个打开的数据库相关联。已授权用户可以访问数据文件中的内容。
以管理员权限连接( Connection with Administrator Privileges )
数据库的启动和关闭是级别很高的管理功能,只有管理员才能做。普通用户不能管理数据库的状态。
根据不同的操作系统,符合以下条件之一,用户可以具有管理员权限:
*具有操作系统权限的用户可以使用管理员权限
*用户被授予SYSDBA或SYSOPER权限,数据库使用密码文件对通过网络访问的用户进行管理员认证
SYSDBA和SYSOPER是很特殊的系统权限,在数据库没有打开的情况下用户也能连接。这些权限控制在数据库本身以外。当使用SYSDBA权限连接,进入的是SYS方案,当使用SYSOPER连接,进入的事public方案。SYSOPER的权限是SYSDBA权限的一个子集。
如何启动数据库(How an Instance Is Started)
当oracle启动实例,执行以下基本步骤:
1.在平台默认的位置查找spfile,如果没找到,查找文本参数文件pfile(在STARTUP启动的时候可以用SPFILE或PFILE指定参数文件)
2.读取参数文件,确定初始化参数大小
3.根据参数设置分配SGA
4.启动oracle后台进程
5.打开alert日志和trace文件,将显式参数写入alert日志
在这个阶段,没有数据库和实例关联。有些场景需要启动到nomount阶段,比如说创建数据库和一些特定的备份恢复操作。
如何挂载数据库(How a Database Is Mounted)
实例挂载数据库用来和此数据库相关联。为了挂载数据库,实例从CONTROL_FILES参数指定的控制文件中获得数据库的名称,并打开控制文件。oracle通过读取控制文件找到数据文件和在线日志文件的名称,这些文件在打开数据库后可以进行访问。在一个已挂载的数据库(mounted database)中,数据库是关闭的,只有数据库管理员可以访问。管理员可以在完成特定维护操作的时候保持数据库的关闭状态。然而,对一些常规操作数据库是不可访问的。
如果oracle允许多个实例同时挂载同一个数据库,那么初始化参数CLUSTER_DATABASE能使数据库对多个实例是可访问的。数据库行为依赖于以下设置:
*如果CLUSTER_DATABASE对第一个挂载数据库的实例是false(默认),那么只有这个实例可以挂载这个数据库。
*如果CLUSTER_DATABASE对第一个实例是true,那么如果别的实例CLUSTER_DATABASE参数是true的话也可以挂载数据库。能够挂载数据的最大实例数目在创建数据库的时候由预先定义的最大值决定。
如何打开数据库(How a Database Is Opened)
将一个已挂载的数据库打开后可以进行一些常规操作。任何有效的用户都可以连接到打开的数据库并访问它的数据。通常情况下,数据库管理员将数据库打开,打开后数据库对普通用户就是可用的了。
打开数据库要执行以下步骤:
* 打开表空间的在线数据文件,除了undo表空间
如果数据库关闭前表空间是offline的,那么数据库重新打开后表空间和对应的数据文件将是offline的。
* 获得undo表空间
如果存在多个undo表空间,由UNDO_TABLESPACE参数指定要使用的undo表空间。如果这个参数没设置,选择第一个可用的undo表空间。
* 打开在线日志文件
只读模式(Read-Only Mode)
默认情况下,数据库以读写模式打开。在这种模式下,用户可以修改数据,生成redo日志到在线日志文件。另外,你也可以用只读模式打开数据库防止数据被用户事务修改。
只读模式只允许只读事务访问数据库,不能写入数据文件或在线日志文件。然而,数据库可以执行恢复操作,或者不生成redo日志的改变数据库状态的操作。例如,在只读模式下:
* 数据文件可以被置为online或offline。然而,不能将永久表空间置为offline。
* 可以恢复处于offline状态的数据文件和表空间。
* 对于更改数据库的状态,控制文件一直是可用的。
* 用CREATE TEMPORARY TABLESPACE创建的临时表空间是可读写的。
* 可以继续写操作系统审计文件,跟踪文件(trace files)和alert日志。
数据文件检查(Database File Checks)
当实例试图打开数据库的时候,如果任何一个数据文件或redo文件不存在,或者存在但一致性检查失败,那么数据库将会返回一个错误。需要介质恢复。
数据库和实例关闭简介(Overview of Database and Instance Shutdown)
典型的使用情况,手动关闭数据库,当执行维护或其他管理操作时使数据库对用户不可访问。你可以使用sql*plus的shutdown命令或是使用EM(Enterprise Manager)去执行这些步骤。
下图介绍了将打开的数据库进行一致性关闭的步骤:
数据库一致性关闭的时候会自动执行以下步骤:
1.数据库关闭
数据库是挂载的(mounted),但是在线数据文件和在线重做日志文件是关闭的。
2.数据库卸载
实例是启动的(started),但是不在和数据库中的控制文件相关联。
3.实例关闭
数据库实例关闭。
oralce数据库在遇到实例故障或是shutdown abort的时候会直接结束实例,不再按之前的步骤关闭。
关闭模式(Shutdown Modes)
拥有sysdba或sysoper权限的管理员能使用sql*plus中的shutdown命令或是EM关闭数据库。shutdown命令有不同的选项决定关闭的方式。
下图总结了不同关闭模式的行为:
Shutdown Modes
可选的shutdown语句:
* shutdown abort
这种模式适用于紧急情况,比如当别的关闭方式都不能将数据库关闭。这种关闭方式是最快的。然而,随后打开数据库可能要花费很长的时间,
因为必须进行实例恢复使数据文件一致。
注意:因为shutdown abort没有对打开的数据文件触发检查点,再次打开数据库的时候必须进行实例恢复。其它的关闭模式再重新打开数据库的时候不需要实例恢复。
* shutdown immediate
这种模式的速度仅次于shutdown abort。oracle将结束所有正在运行的sql,断开用户连接。终止活跃事务,回滚未提交的更改。
* shutdown transactional
这种模式阻止用户开始新的事务,但关闭前会等待当前事务完成。根据当前事务的特性这种模式可能会花费很长时间。
* shutdown normal
这是默认的关闭模式。关闭前数据库会等待所有已连接用户断开连接。
如果使用shutdown abort或是非正常关闭,那么实例和数据库将瞬间关闭。oracle不会将SGA中的数据写到数据文件和在线重做日志文件。重新打开数据库的时候oracle会自动进行实例恢复。
数据库如何卸载(How a Database Is Unmounted)
数据库关闭后,oralce卸载数据库,和实例断开联系。数据库卸载后,oracle关闭数据库的控制文件。
实例如何关闭(How an Instance Is Shut Down)
数据库关闭的最后一步是关闭实例。实例关闭后,从内存中移除SGA,后台进程被关闭。特殊情况下,实例可能不能够完全关闭。内存结构可能没有从内存中移除,有的后台进程可能未终止。如果之前的实例有残余,实例再次打开可能会失败。在这种情况下,你可以强制移除之前实例的残余部分,重新开始一个新的实例,或者在sql*plus或EM中执行一下shutdown abort。
检查点概览(Overview of Checkpoints)
检查点在一致性关闭数据库、实例恢复、数据库常规操作是非常重要的机制。“检查点”这个词有以下相关含义:
* 一个指明检查点位置的数据结构,实例恢复开始的SCN号
检查点位置由buffer cache中最旧的数据脏块决定。检查点位置作为指针指向redo流,存储在控制文件和每个数据文件的文件头。
* 将数据库buffer cache中已修改的内容写到磁盘
检查点的目的(Purpose of Checkpoints)
oracle使用检查点完成以下目的:
* 减少实例恢复或介质恢复的时间
* 保证buffer cache中的脏块定期写到磁盘
* 保证已提交数据在一致性关闭的时候写到磁盘
oracle何时触发检查点 (When Oracle Database Initiates Checkpoints)
CKPT进程负责将检查点信息写到数据文件头和控制文件。检查点在不同的场景下都会发生。例如,oracle会使用以下类型的检查点:
* 进程检查点
数据库在一个确定的目标之前将redo进程修改的缓存数据写到磁盘。数据库中所有实例的进程检查点的集合是一个数据库检查点(database checkpoint)。
线程检查点在以下情况出现:
@ 一致性关闭数据库
@ alter system checkpoint
@ 在线日志切换
@ alter database begin backup
* 表空间和数据文件检查点
在一个特定目标之前数据库将被redo修改的缓存写到磁盘。表空间检查点是数据文件检查点的集合,表空间的每个数据文件都触发一次检查点。这些检查点会在很多情况下发生,包括将表空间置为read-only或offline,或对数据文件进行shrink,或执行alter tablespace begin backup。
* 增量检查点
增量检查点是进程检查点的一部分,目的是避免在日志切换的时候写大量的数据块。DBWn进程至少每三秒判断一下是否要写数据。当DBWn写脏块的时候,它将触发一次检查点,使CKPT进程将检查点位置写到控制文件,但是不写到数据文件头。
其它类型的检查点包括实例或介质恢复检查点,drop或truncate对象时候的检查点。
实例恢复简介(Overview of Instance Recovery)
实例恢复是对数据文件应用在线重做日志来重建最近一次检查点所做修改的过程。如果上一次数据库未一致性关闭,当管理员打开数据库的时候会自动进行实例恢复。
实例恢复的目的(Purpose of Instance Recovery)
实例恢复保证在实例崩溃后数据库也是一致的。因为数据库管理数据文件的变化,数据文件可能存在不一致的状态。一个redo线程是实例生成的所有变化的集合。单实例有一个redo线程,RAC有多个redo线程,每个实例有一个。
当事务提交的时候,LGWR将内村中剩余的redo条目事务SCN写到在线重做日志。然而,DBWn进程会在合适的时候将修改过的数据写到数据文件。因为这个原因,未提交的数据可能暂时写入数据文件,而已提交的数据可能未写入数据文件。
如果已打开数据库的实例出故障了,可能因为shutdown abort或者别的非正常关闭,那么就会导致:
* 已提交的事务没写入数据文件,仅写入在线重做日志。这些变化必须对数据库重做一遍。
* 数据文件包含当实例故障时未提交的数据。这时这些变化必须回滚以保证事务的一致性。
实例恢复仅使用在线重做日志和当前在线的数据文件来同步数据文件以保证他们的一致性。
检查点对实例恢复的重要性(Importance of Checkpoints for Instance Recovery)
实例恢复使用检查点来确定哪些变化要对数据文件进行应用。检查点位置保证每一个提交的变更,如果它的SCN低于检查点的SCN,那么这个变化肯定记录到数据文件。
实例恢复期间,数据库必须应用位于检查点位置和redo进程之间的变更(重做)。如上图所示,有些变更可能已经写入数据文件了。然而,只有SCN比检查点位置低的变更保证写入磁盘。
oracle 数据库实例简介(Introduction to the Oracle Database Instance
)
数据库实例是管理数据文件的一组内存结构。数据库是由CREATE DATABASE创建的一组存放在磁盘上的物理文件。实例管理相关的数据,为数据库的用户提供服务。
每个运行中的数据库至少与一个数据库实例关联。因为实例存在于内存,数据库存放在磁盘上,实例或数据库都可以单独存在。
数据库实例体系(Database Instance Structure )
当实例启动,Oracle分配一个内存区域称作SGA(system global area),启动一组后台进程。SGA有很多用途,如下所示:
* 管理被许多进程和线程并发访问的内部数据结构
* 缓存从磁盘读取的数据块
* 在写入在线日志前缓存redo数据
* 存储sql执行计划
SGA被运行在一台机器上的Oracle进程共享,包括服务进程和后台进程。Oracle进程和SGA关联的方式因操作系统而异。
数据库实例包含后台进程。服务进程以及为这些进程分配的内存同样存在于实例中。服务进程终止后实例也能继续工作。
下图展示了Oracle数据库实例的主要组件:
Database Instance
数据库实例配置(Database Instance Configurations )
你能在以下任意环境中运行oracle数据库:
* 单实例配置
数据库和实例是一对一的关系
* RAC环境
数据库和实例是多对多的关系
shows possible database instance configurations
不管是在单实例还是在RAC配置中,一个实例同一时间只能与一个数据库关联。你能启动一个实例并挂载一个数据库,但是同一时间一个实例不能挂载两个数据库。
不同的实例可以并行地运行在同一机器上,每一个访问它自己的的数据库。例如,一台机器可以有两个数据库:prod1和prod2。一个实例管理prod1,另一个不同的实例管理prod2。
实例的生命周期(Duration of an Instance )
一个实例由STARTUP命令开始,被终止时结束。在这个过程中,一个实例只能跟一个数据库关联。而且,一个实例只能挂载一次数据库,只能关闭一次数据库,只能打开一次数据库。一个数据库关闭后,你必须启动一个不同的实例去挂载、打开这个数据库。
Duration of an Instance
SID( Oracle System Identifier )
SID是oracle在一台特定主机上的唯一名。在unix和linux上,oracle使用SID和Oracle home生成一个指向共享内存的值。同时,默认情况下SID被用来定位参数文件,参数文件是用来定位相关文件的,比如控制文件。
在大多数平台上,ORACLE_SID用来设置SID,ORACLE_HOME用来设置Oracle home。当连接到实例,客户端可以在oracle连接串中确定SID,或是使用网络服务名(net service name)。oracle将服务名转换为ORACLE_HOME和ORACLE_SID。
实例启停概览(Overview of Instance Startup and Shutdown)
用户通过实例访问数据库。本节介绍实例和数据库的可能状态。
Instance and Database Startup Sequence
数据库从关闭到启动经历了以下步骤:
1.实例启动,未挂载数据库
实例已启动,未关联数据库。
2.数据库挂载
实例已启动,通过读取控制文件与一个数据库相关联。数据库对用户来讲是关闭的。
3.数据库打开
实例已打开,与一个打开的数据库相关联。已授权用户可以访问数据文件中的内容。
以管理员权限连接( Connection with Administrator Privileges )
数据库的启动和关闭是级别很高的管理功能,只有管理员才能做。普通用户不能管理数据库的状态。
根据不同的操作系统,符合以下条件之一,用户可以具有管理员权限:
*具有操作系统权限的用户可以使用管理员权限
*用户被授予SYSDBA或SYSOPER权限,数据库使用密码文件对通过网络访问的用户进行管理员认证
SYSDBA和SYSOPER是很特殊的系统权限,在数据库没有打开的情况下用户也能连接。这些权限控制在数据库本身以外。当使用SYSDBA权限连接,进入的是SYS方案,当使用SYSOPER连接,进入的事public方案。SYSOPER的权限是SYSDBA权限的一个子集。
如何启动数据库(How an Instance Is Started)
当oracle启动实例,执行以下基本步骤:
1.在平台默认的位置查找spfile,如果没找到,查找文本参数文件pfile(在STARTUP启动的时候可以用SPFILE或PFILE指定参数文件)
2.读取参数文件,确定初始化参数大小
3.根据参数设置分配SGA
4.启动oracle后台进程
5.打开alert日志和trace文件,将显式参数写入alert日志
在这个阶段,没有数据库和实例关联。有些场景需要启动到nomount阶段,比如说创建数据库和一些特定的备份恢复操作。
如何挂载数据库(How a Database Is Mounted)
实例挂载数据库用来和此数据库相关联。为了挂载数据库,实例从CONTROL_FILES参数指定的控制文件中获得数据库的名称,并打开控制文件。oracle通过读取控制文件找到数据文件和在线日志文件的名称,这些文件在打开数据库后可以进行访问。在一个已挂载的数据库(mounted database)中,数据库是关闭的,只有数据库管理员可以访问。管理员可以在完成特定维护操作的时候保持数据库的关闭状态。然而,对一些常规操作数据库是不可访问的。
如果oracle允许多个实例同时挂载同一个数据库,那么初始化参数CLUSTER_DATABASE能使数据库对多个实例是可访问的。数据库行为依赖于以下设置:
*如果CLUSTER_DATABASE对第一个挂载数据库的实例是false(默认),那么只有这个实例可以挂载这个数据库。
*如果CLUSTER_DATABASE对第一个实例是true,那么如果别的实例CLUSTER_DATABASE参数是true的话也可以挂载数据库。能够挂载数据的最大实例数目在创建数据库的时候由预先定义的最大值决定。
如何打开数据库(How a Database Is Opened)
将一个已挂载的数据库打开后可以进行一些常规操作。任何有效的用户都可以连接到打开的数据库并访问它的数据。通常情况下,数据库管理员将数据库打开,打开后数据库对普通用户就是可用的了。
打开数据库要执行以下步骤:
* 打开表空间的在线数据文件,除了undo表空间
如果数据库关闭前表空间是offline的,那么数据库重新打开后表空间和对应的数据文件将是offline的。
* 获得undo表空间
如果存在多个undo表空间,由UNDO_TABLESPACE参数指定要使用的undo表空间。如果这个参数没设置,选择第一个可用的undo表空间。
* 打开在线日志文件
只读模式(Read-Only Mode)
默认情况下,数据库以读写模式打开。在这种模式下,用户可以修改数据,生成redo日志到在线日志文件。另外,你也可以用只读模式打开数据库防止数据被用户事务修改。
只读模式只允许只读事务访问数据库,不能写入数据文件或在线日志文件。然而,数据库可以执行恢复操作,或者不生成redo日志的改变数据库状态的操作。例如,在只读模式下:
* 数据文件可以被置为online或offline。然而,不能将永久表空间置为offline。
* 可以恢复处于offline状态的数据文件和表空间。
* 对于更改数据库的状态,控制文件一直是可用的。
* 用CREATE TEMPORARY TABLESPACE创建的临时表空间是可读写的。
* 可以继续写操作系统审计文件,跟踪文件(trace files)和alert日志。
数据文件检查(Database File Checks)
当实例试图打开数据库的时候,如果任何一个数据文件或redo文件不存在,或者存在但一致性检查失败,那么数据库将会返回一个错误。需要介质恢复。
数据库和实例关闭简介(Overview of Database and Instance Shutdown)
典型的使用情况,手动关闭数据库,当执行维护或其他管理操作时使数据库对用户不可访问。你可以使用sql*plus的shutdown命令或是使用EM(Enterprise Manager)去执行这些步骤。
下图介绍了将打开的数据库进行一致性关闭的步骤:
Instance and Database Shutdown Sequence
数据库一致性关闭的时候会自动执行以下步骤:
1.数据库关闭
数据库是挂载的(mounted),但是在线数据文件和在线重做日志文件是关闭的。
2.数据库卸载
实例是启动的(started),但是不在和数据库中的控制文件相关联。
3.实例关闭
数据库实例关闭。
oralce数据库在遇到实例故障或是shutdown abort的时候会直接结束实例,不再按之前的步骤关闭。
关闭模式(Shutdown Modes)
拥有sysdba或sysoper权限的管理员能使用sql*plus中的shutdown命令或是EM关闭数据库。shutdown命令有不同的选项决定关闭的方式。
下图总结了不同关闭模式的行为:
Shutdown Modes
可选的shutdown语句:
* shutdown abort
这种模式适用于紧急情况,比如当别的关闭方式都不能将数据库关闭。这种关闭方式是最快的。然而,随后打开数据库可能要花费很长的时间,
因为必须进行实例恢复使数据文件一致。
注意:因为shutdown abort没有对打开的数据文件触发检查点,再次打开数据库的时候必须进行实例恢复。其它的关闭模式再重新打开数据库的时候不需要实例恢复。
* shutdown immediate
这种模式的速度仅次于shutdown abort。oracle将结束所有正在运行的sql,断开用户连接。终止活跃事务,回滚未提交的更改。
* shutdown transactional
这种模式阻止用户开始新的事务,但关闭前会等待当前事务完成。根据当前事务的特性这种模式可能会花费很长时间。
* shutdown normal
这是默认的关闭模式。关闭前数据库会等待所有已连接用户断开连接。
怎样关闭数据库(How a Database Is Closed)
关闭的特性取决于数据库是正常关闭还是非正常关闭。
数据库怎样以normal方式关闭(How a Database Is Closed During Normal Shutdown)
当用shutdown关闭数据库时,除了abort方式,oracle都会将SGA中的数据写到数据文件和在线重做日志文件。然后,数据库关闭在线数据文件和在线重做日志文件。表空间里已经离线的数据文件已经被关闭了。当数据库重新打开的时候,所有离线的表空间仍然保持离线。
在这个阶段,数据库是关闭的,普通操作不可访问。数据库关闭后控制文件仍然是打开的。
数据库怎样非正常关闭(How a Database Is Closed During Abnormal Shutdown)
关闭的特性取决于数据库是正常关闭还是非正常关闭。
数据库怎样以normal方式关闭(How a Database Is Closed During Normal Shutdown)
当用shutdown关闭数据库时,除了abort方式,oracle都会将SGA中的数据写到数据文件和在线重做日志文件。然后,数据库关闭在线数据文件和在线重做日志文件。表空间里已经离线的数据文件已经被关闭了。当数据库重新打开的时候,所有离线的表空间仍然保持离线。
在这个阶段,数据库是关闭的,普通操作不可访问。数据库关闭后控制文件仍然是打开的。
如果使用shutdown abort或是非正常关闭,那么实例和数据库将瞬间关闭。oracle不会将SGA中的数据写到数据文件和在线重做日志文件。重新打开数据库的时候oracle会自动进行实例恢复。
数据库如何卸载(How a Database Is Unmounted)
数据库关闭后,oralce卸载数据库,和实例断开联系。数据库卸载后,oracle关闭数据库的控制文件。
实例如何关闭(How an Instance Is Shut Down)
数据库关闭的最后一步是关闭实例。实例关闭后,从内存中移除SGA,后台进程被关闭。特殊情况下,实例可能不能够完全关闭。内存结构可能没有从内存中移除,有的后台进程可能未终止。如果之前的实例有残余,实例再次打开可能会失败。在这种情况下,你可以强制移除之前实例的残余部分,重新开始一个新的实例,或者在sql*plus或EM中执行一下shutdown abort。
检查点概览(Overview of Checkpoints)
检查点在一致性关闭数据库、实例恢复、数据库常规操作是非常重要的机制。“检查点”这个词有以下相关含义:
* 一个指明检查点位置的数据结构,实例恢复开始的SCN号
检查点位置由buffer cache中最旧的数据脏块决定。检查点位置作为指针指向redo流,存储在控制文件和每个数据文件的文件头。
* 将数据库buffer cache中已修改的内容写到磁盘
检查点的目的(Purpose of Checkpoints)
oracle使用检查点完成以下目的:
* 减少实例恢复或介质恢复的时间
* 保证buffer cache中的脏块定期写到磁盘
* 保证已提交数据在一致性关闭的时候写到磁盘
oracle何时触发检查点 (When Oracle Database Initiates Checkpoints)
CKPT进程负责将检查点信息写到数据文件头和控制文件。检查点在不同的场景下都会发生。例如,oracle会使用以下类型的检查点:
* 进程检查点
数据库在一个确定的目标之前将redo进程修改的缓存数据写到磁盘。数据库中所有实例的进程检查点的集合是一个数据库检查点(database checkpoint)。
线程检查点在以下情况出现:
@ 一致性关闭数据库
@ alter system checkpoint
@ 在线日志切换
@ alter database begin backup
* 表空间和数据文件检查点
在一个特定目标之前数据库将被redo修改的缓存写到磁盘。表空间检查点是数据文件检查点的集合,表空间的每个数据文件都触发一次检查点。这些检查点会在很多情况下发生,包括将表空间置为read-only或offline,或对数据文件进行shrink,或执行alter tablespace begin backup。
* 增量检查点
增量检查点是进程检查点的一部分,目的是避免在日志切换的时候写大量的数据块。DBWn进程至少每三秒判断一下是否要写数据。当DBWn写脏块的时候,它将触发一次检查点,使CKPT进程将检查点位置写到控制文件,但是不写到数据文件头。
其它类型的检查点包括实例或介质恢复检查点,drop或truncate对象时候的检查点。
实例恢复简介(Overview of Instance Recovery)
实例恢复是对数据文件应用在线重做日志来重建最近一次检查点所做修改的过程。如果上一次数据库未一致性关闭,当管理员打开数据库的时候会自动进行实例恢复。
实例恢复的目的(Purpose of Instance Recovery)
实例恢复保证在实例崩溃后数据库也是一致的。因为数据库管理数据文件的变化,数据文件可能存在不一致的状态。一个redo线程是实例生成的所有变化的集合。单实例有一个redo线程,RAC有多个redo线程,每个实例有一个。
当事务提交的时候,LGWR将内村中剩余的redo条目事务SCN写到在线重做日志。然而,DBWn进程会在合适的时候将修改过的数据写到数据文件。因为这个原因,未提交的数据可能暂时写入数据文件,而已提交的数据可能未写入数据文件。
如果已打开数据库的实例出故障了,可能因为shutdown abort或者别的非正常关闭,那么就会导致:
* 已提交的事务没写入数据文件,仅写入在线重做日志。这些变化必须对数据库重做一遍。
* 数据文件包含当实例故障时未提交的数据。这时这些变化必须回滚以保证事务的一致性。
实例恢复仅使用在线重做日志和当前在线的数据文件来同步数据文件以保证他们的一致性。
检查点对实例恢复的重要性(Importance of Checkpoints for Instance Recovery)
实例恢复使用检查点来确定哪些变化要对数据文件进行应用。检查点位置保证每一个提交的变更,如果它的SCN低于检查点的SCN,那么这个变化肯定记录到数据文件。
Checkpoint Position in Online Redo Log
实例恢复期间,数据库必须应用位于检查点位置和redo进程之间的变更(重做)。如上图所示,有些变更可能已经写入数据文件了。然而,只有SCN比检查点位置低的变更保证写入磁盘。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28675539/viewspace-1307603/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28675539/viewspace-1307603/