您的位置:首页 > 数据库 > Oracle

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

2014-04-08 20:08 691 查看
--================================
-->Oracle 数据库实例启动关闭过程
--================================
/*
    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<SID>.ora ---> spfile.ora ---> init<SID>.ora
           b.分配SGA
           c.启动后台进程
           d.打开并修改告警<SID>.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: