Oracle 数据库实例启动关闭过程

作者:CUUG    2017-10-13

 Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行装载。Oracle数据启动的过程被划分为

  几个不同的步骤,在不同的启动过程中,我们可以对其实现不同的操作,系统修复等等工作,因此了解Oracle数据启动、关闭是非常

  有必要的。下面详细了Oracle Database 10g 数据库启动及关闭的过程。

  一、数据库实例的启动

  启动命令:starup [force][restrict] [pfile=...] [nomount] [mount] [open]

  启动过程:nomount ---> mount ---> open (startup不带参数将逐步一一完成)

  1.nomount阶段(即实例的启动)

  实例的启动通常包含下列任务:

  a.按以下顺序在$ORACLE_HOME/dbs[win平台为database]目录下搜索下列文件,即如果第一个没找到,就找下一个

  spfile.ora ---> spfile.ora ---> init.ora

  b.分配SGA

  c.启动后台进程

  d.打开并修改告警.log文件及跟踪文件

  使用场景:

  多用于数据库创建、控制文件重建、特定的备份恢复等

  注意:

  此阶段不打开任何的控制文件及数据文件。

  2.mount阶段

  mount阶段完成的任务:

  a.启动实例并打开控制文件,将数据库与实例关联起来

  b.利用参数文件中的说明,打开并锁定控制文件

  c.读取控制文件以获取数据文件和重做日志文件的名字和状态信息,但不检查数据日志文件是否存在

  使用场景:

  a.重命名数据文件,移动数据文件位置等(数据库打开,表空间脱机的情况下也可以重命名数据文件)

  b.启用或关闭重做日志文件的归档及非归档模式

  c.实现数据库的完全恢复

  注意:

  这一步会读控制文件,如果这一步有一个控制文件损坏就无法启动

  3.open阶段

  mount阶段完成的任务:

  a.打开数据文件

  b.打开联机日志文件

  注意:

  a.在此期间,Oracle服务器将校验所偶的数据文件和联机日志文件能否打开并对数据库作一致性检查

  b.如果出现一致性错误,SMON进程将启动实例恢复

  c.如果任一数据文件或联机日志文件丢失,Oracle服务器将报错

  4.特殊的方式打开数据库

  只读模式:

  startup open read only;

  如果现在在mount

  alter database open read only;

  受限模式:

  有时进行数据库维护护,希望一般的用户不能登录。可以启动到该模式,这样只有用户具有

  restricted session 权限,才可登录到数据库。

  启动方法:

  startup restrict;

  取消受限:

  alter system disable restricted session;

  二、数据库实例的关闭

  关闭命令:shutdowm abort | immediate | transactional | normal (shutdown不带参数将缺省为normal)

  关闭选项:

  normal --->不准许新的连接,等待当前的session 结束,等待当前的事务结束,强制检查点并关闭文件

  transactional --->不准许新的连接,不等待当前的session结束,等待当前的事务结束,强制检查点并关闭文件。

  immediate --->不准许新的连接,不等待当前的session结束,不等待当前的事务结束,强制检查点并关闭文件。

  abort --->不准许新的连接,不等待当前的session结束,不等待当前的事务结束,不作强制检查点。

  三、几类诊断文件

  包含有重要意义时间的具体信息,用于解决问题,用于日常更好的管理数据库

  a.alterSID.log 告警文件

  记录了数据库启动、关闭时间和一些重要操作及错误警告信息,包含错误号ora-,由dba管理

  位置由background_dump_dest

  维护alertSID.log,定期转移,系统会自动产生新的alert_sid.log

  b.后台进程跟踪文件:

  记录了后台进程的一些重要信息和警告、错误等

  位置:$ORACLE_BASE/admin/vvorcl/bdump/vvorcl_lgwr_15135.trc

  c.用户跟踪文件:

  由用户进程产生也能由服务器进程产生,跟踪用户的SQL语句的统计信息,也包括错误信息

  文件位置由user_dump_dest

  用户跟踪:

  会话级:

  alter session set sql_trace=true;

  实例级:

  alter system set set sql_trace=true;

  跟踪文件的大小由max_dump_file_size参数决定。跟踪时最好要限制他的大小

  四、动态性能视图

  记录当前数据库的活动,并且不停的更新,故不能保证读取数据的一致性

  监控和调整数据库

  所有者sys

  以v$开头

  DICT和DICT_COLUMNS视图包含了动态性能视图描述及其列的描述

  v$FIXED_TALBE包含了所有视图的名字及相关信息

  五、演示 */

  [root@robinson ~]# su - oracle

  --查看未启动实例前的进程情况

  [oracle@robinson ~]$ ps -aef |grep oracle

  root 3332 3300 0 12:20 pts/1 00:00:00 su - oracle

  oracle 3333 3332 0 12:20 pts/1 00:00:00 -bash

  oracle 3365 3333 0 12:20 pts/1 00:00:00 ps -aef

  oracle 3366 3333 0 12:20 pts/1 00:00:00 grep oracle

  --使用ipcs查看当前进程间通讯所用到的共享资源,内存段及信号量,

  --可以看出当前无任何通信设备及共享资源

  [oracle@robinson ~]$ ipcs -a

  ------ Shared Memory Segments --------

  key shmid owner perms bytes nattch status

  ------ Semaphore Arrays --------

  key semid owner perms nsems

  ------ Message Queues --------

  key msqid owner perms used-bytes messages

  --登陆到sqlplus

  [oracle@robinson ~]$ sqlplus / as sysdba

  SQL*Plus: Release 10.2.0.1.0 - Production on Thu Apr 29 13:07:29 2010

  Copyright (c) 1982, 2005, Oracle. All rights reserved.

  Connected to an idle instance.

  --再次查看进程情况,多出了进程

  SQL> !ps -aef | grep oracle

  root 3332 3300 0 12:20 pts/1 00:00:00 su - oracle

  oracle 3333 3332 0 12:20 pts/1 00:00:00 -bash

  oracle 3972 3333 0 13:07 pts/1 00:00:00 sqlplus as sysdba

  oracle 3973 3972 0 13:07 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

  oracle 3974 3972 0 13:07 pts/1 00:00:00 /bin/bash -c ps -aef | grep oracle

  oracle 3975 3974 0 13:07 pts/1 00:00:00 ps -aef

  --再次查看进程间通讯资源,同样是没有任何分配

  SQL> !ipcs -a

  ------ Shared Memory Segments --------

  key shmid owner perms bytes nattch status

  ------ Semaphore Arrays --------

  key semid owner perms nsems

  ------ Message Queues --------

  key msqid owner perms used-bytes messages

  --启动到nomount

  SQL> startup nomount

  ORACLE instance started.

  Total System Global Area 398458880 bytes

  Fixed Size 1219640 bytes

  Variable Size 117441480 bytes

  Database Buffers 276824064 bytes

  Redo Buffers 2973696 bytes

  --可以看到多出了一些后台进程,即为Oracle的后台进程。从开始。

  SQL> !ps -aef | grep oracle

  root 3332 3300 0 12:20 pts/1 00:00:00 su - oracle

  oracle 3333 3332 0 12:20 pts/1 00:00:00 -bash

  oracle 3972 3333 0 13:07 pts/1 00:00:00 sqlplus as sysdba

  oracle 3981 1 0 13:09 ? 00:00:00 ora_pmon_orcl

  oracle 3983 1 0 13:09 ? 00:00:00 ora_psp0_orcl

  oracle 3985 1 0 13:09 ? 00:00:00 ora_mman_orcl

  oracle 3987 1 0 13:09 ? 00:00:00 ora_dbw0_orcl

  oracle 3989 1 0 13:09 ? 00:00:00 ora_lgwr_orcl

  oracle 3991 1 0 13:09 ? 00:00:00 ora_ckpt_orcl

  oracle 3993 1 0 13:09 ? 00:00:00 ora_smon_orcl

  oracle 3995 1 0 13:09 ? 00:00:00 ora_reco_orcl

  oracle 3997 1 0 13:09 ? 00:00:00 ora_cjq0_orcl

  oracle 3999 1 0 13:09 ? 00:00:00 ora_mmon_orcl

  oracle 4001 1 0 13:09 ? 00:00:00 ora_mmnl_orcl

  oracle 4003 1 0 13:09 ? 00:00:00 ora_d000_orcl

  oracle 4005 1 0 13:09 ? 00:00:00 ora_s000_orcl

  oracle 4006 3972 0 13:09 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

  oracle 4009 3972 0 13:10 pts/1 00:00:00 /bin/bash -c ps -aef | grep oracle

  oracle 4010 4009 0 13:10 pts/1 00:00:00 ps -aef

  --可以看到已经分配了SGA

  SQL> !ipcs -a

  ------ Shared Memory Segments --------

  key shmid owner perms bytes nattch status

  0x99eb282c 65537 oracle 640 402653184 14

  ------ Semaphore Arrays --------

  key semid owner perms nsems

  0x6df43ca0 98304 oracle 640 127

  0x6df43ca1 131073 oracle 640 127

  0x6df43ca2 163842 oracle 640 127

  ------ Message Queues --------

  key msqid owner perms used-bytes messages

  --查看控制文件,没有任何数据,因为此阶段控制文件并没有打开

  SQL> select * from v$controlfile;

  no rows selected

  --查看数据文件和日志文件,提示database not mounted

  SQL> select * from v$datafile;

  select * from v$datafile

  *

  ERROR at line 1:

  ORA-01507: database not mounted

  SQL> select * from v$logfile;

  select * from v$logfile

  *

  ERROR at line 1:

  ORA-01507: database not mounted

  --切换到mount阶段

  SQL> alter database mount;

  Database altered.

  --可以查看控制文件的相关信息

  SQL> select * from v$controlfile;

  STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS

  ------- -------------------------------------------------- --- ---------- --------------

  /u01/app/oracle/oradata/orcl/control01.ctl NO 16384 430

  /u01/app/oracle/oradata/orcl/control02.ctl NO 16384 430

  /u01/app/oracle/oradata/orcl/control03.ctl NO 16384 430

  --可以查看数据文件的相关信息

  SQL> select FILE#,STATUS,ENABLED,CHECKPOINT_CHANGE#,CHECKPOINT_TIME,ONLINE_TIME,NAME from v$datafile;

  FILE# STATUS ENABLED CHECKPOINT_CHANGE# CHECKPOIN ONLINE_TI NAME

  ---------- ------- ---------- ------------------ --------- --------- --------------------------------------------------

  1 SYSTEM READ WRITE 2027235 28-APR-10 06-APR-10 /u01/app/oracle/oradata/orcl/system01.dbf

  2 ONLINE READ WRITE 2027235 28-APR-10 06-APR-10 /u01/app/oracle/oradata/orcl/undotbs01.dbf

  3 ONLINE READ WRITE 2027235 28-APR-10 06-APR-10 /u01/app/oracle/oradata/orcl/sysaux01.dbf

  4 ONLINE READ WRITE 2027235 28-APR-10 06-APR-10 /u01/app/oracle/oradata/orcl/users01.dbf

  5 ONLINE READ WRITE 2027235 28-APR-10 /u01/app/oracle/oradata/orcl/example01.dbf

  6 ONLINE READ WRITE 2027235 28-APR-10 /u01/app/oracle/oradata/orcl/Test.dbf

  7 ONLINE READ WRITE 2027235 28-APR-10 /u01/app/oracle/oradata/orcl/ORCL/datafile/o1_mf_s

  _5vrl1t7h_.dbf

  --可以查看日志文件的相关信息

  SQL> select * from v$logfile;

  GROUP# STATUS TYPE MEMBER IS_

  ---------- ------- ------- ------------------------------------------------------------ ---

  3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO

  2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO

  1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO

  --数据不可访问,因为在此阶段,数据文件,日志文件并没有打开

  SQL> select * from scott.emp;

  select * from scott.emp

  *

  ERROR at line 1:

  ORA-01219: database not open: queries allowed on fixed tables/views only

  --切换到open 阶段

  SQL> alter database open;

  Database altered.

  --再次查看进程信息,多出了之后的相关进程

  SQL> !ps -aef | grep oracle

  oracle 3981 1 0 13:09 ? 00:00:00 ora_pmon_orcl

  oracle 3983 1 0 13:09 ? 00:00:00 ora_psp0_orcl

  oracle 3985 1 0 13:09 ? 00:00:00 ora_mman_orcl

  oracle 3987 1 0 13:09 ? 00:00:00 ora_dbw0_orcl

  oracle 3989 1 0 13:09 ? 00:00:00 ora_lgwr_orcl

  oracle 3991 1 0 13:09 ? 00:00:00 ora_ckpt_orcl

  oracle 3993 1 0 13:09 ? 00:00:00 ora_smon_orcl

  oracle 3995 1 0 13:09 ? 00:00:00 ora_reco_orcl

  oracle 3997 1 0 13:09 ? 00:00:00 ora_cjq0_orcl

  oracle 3999 1 0 13:09 ? 00:00:00 ora_mmon_orcl

  oracle 4001 1 0 13:09 ? 00:00:00 ora_mmnl_orcl

  oracle 4003 1 0 13:09 ? 00:00:00 ora_d000_orcl

  oracle 4005 1 0 13:09 ? 00:00:00 ora_s000_orcl

  root 4068 4036 0 13:29 pts/1 00:00:00 su - oracle

  oracle 4069 4068 0 13:29 pts/1 00:00:00 -bash

  oracle 4101 4069 0 13:29 pts/1 00:00:00 sqlplus

  oracle 4102 4101 0 13:29 ? 00:00:01 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

  oracle 4137 1 0 13:54 ? 00:00:00 ora_qmnc_orcl

  oracle 4139 1 0 13:54 ? 00:00:01 ora_j000_orcl

  oracle 4141 1 0 13:54 ? 00:00:00 ora_j001_orcl

  oracle 4143 1 0 13:54 ? 00:00:00 ora_j002_orcl

  oracle 4145 1 0 13:54 ? 00:00:00 ora_j003_orcl

  oracle 4147 1 0 13:54 ? 00:00:00 ora_j004_orcl

  oracle 4149 1 0 13:54 ? 00:00:00 ora_j005_orcl

  oracle 4159 1 0 13:54 ? 00:00:00 ora_q001_orcl

  oracle 4167 1 0 13:56 ? 00:00:00 ora_q002_orcl

  oracle 4169 1 0 13:57 ? 00:00:00 ora_q003_orcl

  oracle 4172 4101 0 13:58 pts/1 00:00:00 /bin/bash -c ps -aef | grep oracle

  oracle 4173 4172 0 13:58 pts/1 00:00:00 ps -aef

  --数据已可正常访问

  SQL> select * from scott.emp where ename = 'SCOTT';

  EMPNO ENAME JOB MGR HIREDATE SAL COMM

  ---------- ---------- --------- ---------- --------- ---------- ----------

  DEPTNO

  ----------

  7788 SCOTT ANALYST 7566 19-APR-87 3000

  --查看告警日志文件路径

  SQL> show parameter background_dump_dest

  NAME TYPE VALUE

  ------------------------------------ ----------- ------------------------------

  background_dump_dest string /u01/app/oracle/admin/orcl/bdu

  mp

  --查看动态性能视图

  SQL> select sql_text,executions from v$sql where cpu_time >2000000;

  SQL_TEXT

  --------------------------------------------------------------------------------

  EXECUTIONS

  ----------

  select s.synonym_name object_name, o.object_type from all_synonyms s, sys.a

  ll_objects o where s.owner in ('PUBLIC', :schema) and o.owner = s.table_owner an

  d o.object_name = s.table_name and o.object_type in ('TABLE', 'VIEW', 'PACKAGE',

  'TYPE', 'PROCEDURE', 'FUNCTION', 'SEQUENCE')

  2

  SQL> select username,status,server,state from v$session where program = 'plsqldev.exe';

  USERNAME STATUS SERVER STATE

  ------------------------------ -------- --------- -------------------

  SYS INACTIVE DEDICATED WAITING

  SYS INACTIVE DEDICATED WAITING

  SQL> select sid,ctime from v$lock where sid = 275;

  SID CTIME

  ---------- ----------

  275 9607

  275 9270

  275 9243

  (以上内容摘于网络,如有侵权,请告之,将第一时间删除)