实例及数据库

数据库实例简单介绍
数据库实例时一组用于管理数据文件的内存结构。数据是一组由create database语句在磁盘上创建的物理文件。由实例管理其关联的数据,
并为数据库用户提供服务。
每个正在运行的ORACLE数据库至少与一个ORACLE数据库实例相关联。因为实例存在于内存中,而数据库存在于磁盘上,所以实例可以在没有
数据库时而存在,数据库也可以在没有实例时存在。
ORACLE实例结构:
当实例启动时,oracle数据库分配一个叫SGA的内存区域,并启动一个或多个后台进程。SGA用于以下几个目的:
维护由很多进程和线程同时访问的内存数据结构;
缓存从磁盘中读取的数据块;
缓冲重做数据,然后再将其写入联机重做日志文件;
存储SQL执行计划;
SGA由运行在一台单一计算机上的多个ORACLE进程共享,包括服务器进程和后台进程。oracle进程与SGA相关联的方式会因不同的操作系统而
有所不同。
无论是单实例还是RAC,一个数据库实例再同一时刻只与一个数据库相关联。可以启动一个实例,并装载一个数据库,但不能同时将两个数据
库装载到同一个实例。
实例再使用startup命令创建时开始,在终止时结束。这期间,实例能且只能与一个数据库相关联。此外,该实例只能装载数据库一次,关闭
数据库一次,打开数据库一次。在数据库已关闭后,必须启动一个不同实例来装载并打开此数据库。
SQL> STARTUP==>创建一个实例,它会装载并打开数据库
ORACLE instance started.
Total System Global Area 553729856 bytes
Fixed Size 1343556 bytes
Variable Size 434403660 bytes
Database Buffers 16737216 bytes
Redo Buffers 12315474 bytes
Database mounted.
Database opened.
SQL> SELECT TO_CHAR(STARTUP_TIME,'MON-DD-RR HH24:MI:SS') FROM V$INSTANCE;==>实例启动时间
TO_CHAR(STARTUP
------------------
JUN-24-14 13:14:48
SQL> ALTER DATABASE CLOSE;==>实例关闭数据库,将其置于已装载状态。实例可以读写控制文件,但不能读写数据文件
Database altered.
SQL> ALTER DATABASE OPEN;==>该实例尝试重新打开之前已关闭的数据库。Oracle 数据库发出一个错误,因为同一实例不能打开数据库两次
ALTER DATABASE OPEN
ERROR at line 1:
ORA-16196: database has been
previously opened and closed
SQL> SHUTDOWN IMMEDIATE==>在这一阶段,唯一选择的是关闭实例,结束此实例的生命周期。
SQL> SELECT TO_CHAR(STARTUP_TIME,'MON-DD-RR HH24:MI:SS')FROM V$INSTANCE;==>此查询显示当前实例的启动时间。不同的
TO_CHAR(STARTUP                                              开始时间显示此实例不同于之前已关闭数据库的那个实例。
------------------
JUN-24-14 13:17:48

SID:系统标识符是特定主机上的某个ORACLE数据库实例的唯一名称。在unix及linux上,oracle数据库使用sid和oracle home的值来创建一个
指向共享内存的键。此外,sid在默认的情况下用于定位参数文件,并使用参数文件来进一步定位其它相关文件,如数据库控制文件等。

实例和数据的启动是怎么样的?其三个阶段都做了什么action?
实例如何启动:
当oracle数据库启动一个实例时,会执行一些如下操作,
1、在特定平台的默认位置搜索服务器参数文件,如果未找到,则搜索一个初始化参数文本文件,可以手工指定spfile或者pfile来覆盖默认文件
2、读取参数文件,以确定初始化参数值
3、基于初始化参数设置,分配SGA
4、启动ORACLE后台进程
5、打开alert日志和跟踪文件,并以有效的参数语法将所有显示参数设置写入alert日志中
这个阶段还没有数据库与该实例相关联。需要nomount状态的场景包括创建数据库和某些备份与恢复操作。
数据库是如何装载:
由实例装载数据库,以将数据库与实例关联起来。为装载数据库,该实例获取由controlf_files初始化参数指定的数据库controlfile,并打开文件。
oracle数据库读取控制文件,以查找数据文件和联机重做日志文件的名称,当打开数据库时,它会尝试访问这些文件。
在一个已装载的数据库中,该数据库是关系的,且只有数据库管理员可以访问。
如果oracle数据库允许许多实例同时装载同一数据库,则cluster_database初始化参数设置可以使数据库用于多实例。
如果装入数据库的第一个实例的CLUSTER_DATABASE 为 false (默认),则仅此实例可以装入数据库。
如果第一个实例的 CLUSTER_DATABASE 为true,则其他实例在其CLUSTER_DATABASE 参数也设置为 true时可以装载数据库。可以装载数据库的实例数
量决定于在创建数据库时指定的预定最大值。
数据库是如何打开:
打开一个已装载的数据库,使其可用于常规的数据库操作。任何有效的用户可以连接到打开的数据库,并访问其信息。通常,由数据库管理员打开数
据库,使其可用于一般用途。
1)、打开除undo表空间之外的其他的表空间中的联机数据文件;如果在之前数据库关闭时,某个表空间是脱机的,则该表空间及其相应的数据文件,在重新
打开数据库时,仍将处于脱机状态。
2)、获取一个undo表空间;如果存在多个撤消表空间,则由 UNDO_TABLESPACE 初始化参数指定要使用的undo表空间。如果尚未设置此参数,则会选择第一个
可用的undo表空间。
3)、打开连接重做日志文件。
只读模式干嘛啦?
11g中,物理备库是以只读模式打开。限制数据库访问只能为只读事务,也就无法写入到数据文件或onlne redo log。
数据库能执行恢复,或更改数据库状态但不生成重做操作。
数据文件可以被脱机和联机。但是,你不能将永久表空间脱机。
脱机的数据文件和表空间是可以恢复的
控制文件仍然可用,以更新有关数据库的状态
使用create temporary tablespace 语句创建的临时表空间是可读写的
可以继续往操作系统写入aud文件、trc文件、alert日志等。

既然知道了数据库实例启动流程,那么数据实例的关闭流程是什么样?
1、首先是数据库关闭,数据库仍然处于装载状态,但是数据文件和online redo log已被关闭
正常下:
当数据库利用除abort外的关闭操作,ORACLE数据库将SGA中的数据写入数据文件和联机重做日志文件。然后数据库关闭联机数据文件和
联机重做日志文件。脱机表空间中的任何脱机数据文件时本来就是已关闭的。当重新打开数据库时,原先脱机的状态不变
非正常下:
如果执行了shutdown abort,或异常终止,则打开数据库的实例会关闭,并在瞬间将数据库停机。oracle数据库不会将SGA缓冲区中的数
据写入数据文件和重做日志中。随后重新打开数据库需要实例恢复,自动执行
2、数据库卸载,实例仍然处于启动状态,但已不再与数据库的控制文件相关联
3、数据库实例关闭,数据库实例不在处于启动状态,sga从内存中移除,并将后台进程终止
在异常情况下,实例可能并未干净地关闭。内存结构可能未从内存中删除,或某个后台进程可能未被终止。当之前的实例存在残留物时,
后续的实例启动可能会失败。在这样的情况下,为强制启动一个新实例,您可以通过删除之前实例的残留物并启动一个新实例、或通过在
SQL*Plus中发出SHUTDOWN ABORT语。
4、abort时,数据库不会经历上面的步骤,而是直接关闭

关闭模式
数据库行为                             abort   immediate  transaction normal
允许新用户连接                         否       否            否       否
等待,当前会话结束                     否       否            否       是  
等待,当前事务结束                     否       否            是       是
执行一个检查点,关闭打开的数据文件     否       是            是       是

shutdown abort:如果其他形式的关闭方式都未能关闭成功,并且真的很急,也找不到紧急方案;但是,在开启数据库时出现什么问题
就不得而知了。因为此操作不对数据文件做检查点操作,所在在重新打开数据库之前,必须进行实例恢复。
shutdown immediate:这种模式通常是除了abort之外最快的关闭模式。oracle数据库终止任何正在执行的sql语句,并断开用户连接。
所有活动事务将终止,并回滚所有未提交的更改。
shutdown transactional:这种模式可以防止用户启动新事务,但在关闭之前会等待所有的当前事务完成。花费时间很长
shutdown normal:默认模式,在关闭之前数据库会等待所有连接的用户断开

前面说到很多关于实例恢复,那么什么是实例恢复,到底在做什么?
实例恢复是将online redo中记录应用到数据文件,以重建最近检查点之后所做更改的过程。当管理员尝试打开一个之前以不一致方式关闭
数据库,会由smon进程自动做实例恢复。
目的:
实例恢复可确保数据库在一个实例失败后仍能回到一个一致的状态。由于oracle数据库对数据文件更改的管理方式所致,数据库的文件可以
处于不一致的状态。
redo thread是对实例生成的所有更改的记录。单实例数据库拥有一个redo thread,而RAC中有多个。
当事务提交时,LGWR会将内存中的重做条目和事务SCN同时写入联机重做日志。但是,DBWn只在最有利的时机将已修改的数据块写入数据文件
由于这个原因,未提交的更改可能会暂时存在于数据文件中,而已提交的更改也可能还不在数据文件中。
如果某个打开的数据库的实例失败,或者由于abort或异常终止,则可能会导致下列情况
1)、由某事务已提交的数据块更新还未写入数据文件,而仅写入联机重做日志中。这些更改必须重新应用到数据库
2)、数据文件包含实例失败时尚未提交的更改。这些更改必须回滚,以确保事务一致性。
实例恢复只使用联机重做日志文件和当前在线的数据文件,以同步数据文件,并确保他们一致

何时执行实例恢复?
是否需要实例恢复取决于重做线程的状态。在数据库实例被打开为读写模式时,重做线程在控制文件中被标记为打开,而当实例被一致关闭时,
重做线程被标记为关闭。如果重做线程在控制文件中被标记为打开,但没有活动的实例持有对于这些线程的线程队列,则数据库将需要实例恢复。
1)、单实例数据库或oracle RAC数据库的所有实例失败后第一次打开数据库。这种形式的实例恢复也称为崩溃恢复。oracle数据库一起恢复所有
已终止实例的联机重做线程
2)、只是oracle RAC数据库中的某些、但不是所有实例失败。实例恢复将由配置中的某个存活实例自动进行。

实例恢复阶段:
实例恢复的第一阶段称为缓存恢复或前滚,这涉及将联机重做日志记录的所有更改重新应用到数据文件。因为回滚数据记录在联机重做日志中,前滚
也会重新生成相应的undo段。
前滚会遍历各个必要的联机重做日志,以将数据库推进到一个更前的一致时间点。前滚之后,数据块包含记录在联机重做日志文件中的所有已提交更
改。这些文件可能还包含未提交的更改,要么是在实例失败前保存到数据文件中的,或者是在缓存恢复过程中引入的。
前滚之后,任何未提交的更改必须被撤消。Oracle 数据库使用检查点位置,保证每个低于其SCN的已提交更改都已保存到磁盘。Oracle 数据库应
用撤消块,以回滚数据块中在实例失败前写入的或缓存恢复过程中引入的未提交更改。这一阶段称为回滚或事务恢复。
Oracle 数据库可以根据需要同时回滚多个事务。实例失败时的所有活动事务被标记为终止。新事务可以自己回滚个别块以获取所需的数据,而不必等
待SMON进程来回滚这些已终止的事务。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值