启动
数据库的启动分为三个阶段:
nomount:启动数据库实例。(查找参数文件)
mount:启动数据库实例并加载数据文件。(查找控制文件)
open:启动数据库实例,打开数据文件
当然也可以直接通过startup来打开数据库
可选参数是:
startup (默认为open)
startup nomount
startup mount
startup force(实际上为shutdown abort + startup)
启动到nomount状态:
SQL> startup nomount
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 1174407280 bytes
Database Buffers 419430400 bytes
Redo Buffers 7360512 bytes
实际上就是查找参数文件,根据参数文件的内容(应用参数),创建了instance,并为其分配内存,启动相应的后台进程。
输入 show parameter spfile便可查询使用的是哪个spfile进行的启动
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/11.2.0
/db_1/dbs/spfileORCL.ora
其中ORCL是数据库的sid
若找不到spfile.ora文件,则将以spfile.ora文件启动数据库。
若找不到spfile.ora文件,则将以init.ora文件启动数据库。
若上述三者都不在,则oracle将无法启动。
在上述参数文件中,至少需要提供db_name才能启动instance。
其他几个参数值将会调用系统缺省值:
SQL> show parameter dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /u01/app/oracle/diag/rdbms/orc
l/ORCL/trace
core_dump_dest string /u01/app/oracle/diag/rdbms/orc
l/ORCL/cdump
user_dump_dest string /u01/app/oracle/diag/rdbms/orc
l/ORCL/trace
SQL>show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/app/oracle/oradata/ORCL/c
ontrol01.ctl, /u01/app/oracle/
flash_recovery_area/ORCL/contr
ol02.ctl
启动到mount状态:
SQL> alter database mount;
Database altered.
启动到mount这个过程中,oracle会从控制文件中获得数据文件的位置,这将判断数据文件是否存在。
如果不存在,后台进程将会在告警日志中记录文件缺失信息。
启动到open状态:
SQL> alter database open;
Database altered.
启动到open阶段时,oracle会根据控制文件记录的数据文件头块及日志文件信息,然后进行检查点及完整性检查。
假若不存在问题,则可以打开数据库。
反之,存在不一致性或文件丢失,则需要进行恢复。
在open的时候需要进行很多校验。
第一次检查数据文件头块中的checkpoint cnt,这将于控制文件中的checkpoint cnt做对比,看是否一致。用以确认数据文件是来自同一版本,而不是从备份中恢复而来。(checkpoint cnt会一直被修改)
第二次检查数据文件头块的开始scn和控制文件中记录的该文件的结束scn是否一致,如果控制文件中记录的结束scn等于数据文件头块开始的scn,则不需要对那个文件进行恢复。(如果此前异常宕机,则结束scn会变成无穷大,数据库必须执行实例恢复以确保一致性)
最后打开数据库,锁定数据文件,同时将每个数据文件的结束scn设置为无穷大。
如果无法锁定某数据文件,则会直接返回error,数据库将停止打开。
此时会将完整的错误信息和错误号写入告警日志中。
优先检查alert_.log,位置可以通过:
show parameter background_dumo_dest来查询。
关闭
数据库的关闭实际上是启动的逆操作,也可以分为三个阶段:
close(关闭数据库到mount)
dismount(卸载数据库到nomount)
shutdown(关闭实例)
在shutdown关闭数据库时,还有几个可选参数:
shutdown (默认为normal)
shutdown immediate
shutdown transactional
shutdown abort
normal:
拒绝任何新的会话连接,并等待所有会话断开。
此方法不常用,因为需要所有的用户连接断开才能关闭。
immediate:
拒绝任何新的会话连接,并将所有正在被处理的事务中断,未提交的事务回滚。
强行断开所有连接,执行检查点,将变更数据写入数据文件。
此方法常用,但在系统繁忙的时候,有大量事务或大事务执行时,关闭也需要大量时间。
transactional:
拒绝任何新的会话连接,等待未完成的事务完成,拒绝新的事务缠身。
待所有活动事务完成之后,关闭过程和immediate一致。
abort:
立刻终止所有用户连接、所有事务、立即关闭数据库。
后果:未完成的事务不会回滚,不执行检查点。
在下一次启动数据库时,数据库必须进行实例恢复,可能需要更大的等待时间。
其效果类似于服务器突然断电,可能会导致出现不一致的情况。
(摘自深入解析oracle)
以下场景需要使用abort来关闭:
数据库或应用异常,其他方式无法关闭数据库。
因为马上要到来的断电或其他维护情况,需要快速关闭数据库。
启动异常后需要重新尝试启动
当使用shutdown immediate无法关闭时
需要快速重新启动数据库
shutdown超时或异常
abort之后重启数据库需要进行恢复。
启动时间有时会很长,如果时间允许,可以在关闭之前执行一次:
alter system checkpoint
这样可以再下次启动恢复时,需要恢复的数据可以减少。
在通过其他三种方式关闭的过程中,如果等待时间超过1h,则会抛出:(可能因为个别事务或进程阻塞)
ORA-01013: user requested cancel of current operation
此外,在关闭过程中,用户发出ctrl+c则关闭也会被取消。
无论是ctrl+c或是等待超时,都会使数据库进入两种状态之一:
可能会正常,可以继续运行。
也可能会无法正常运行,进入未知状态。
abort、immediate、transactional、normal四种参数比较:


图摘自Eygle Gai
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px 'Helvetica Neue'}
作者公众号(持续更新)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29773961/viewspace-1417938/
,如需转载,请注明出处,否则将追究法律责任。