Oracle数据库分为数据库和实例,实例是一堆进程和内存。Oracle启动时如何分配内存,SGA分多大,SGA里面的每个池子改分多大,这些信息全部存在参数文件里面。对oracle进行配置和修改,绝大多数都是对参数文件的操作。
在Linux系统中,参数文件存放在$ORACLE_HOME/dbs目录下。在Windows系统中,参数文件存放在database目录下。
[oracle@redhat4 ~]$ cd $ORACLE_HOME/dbs [oracle@redhat4 dbs]$ ls hc_cgh.dat initdw.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora hc_demo.dat init.ora lkTEST orapwtest spfiletest.ora hc_jiagulun.dat lkCGH orapwcgh spfilecgh.ora hc_test.dat lkDEMO orapwdemo spfiledemo.ora
参数文件:spfile+实例名.ora。单实例环境,数据库名等于实例名,多实例环境,一个数据库的名字对应多个实例名。
在oracle9i 9i以前,是静态参数文件:init+实例名.ora,oracle9i以后是动态参数文件:spfile+实例名.ora。静态参数文件是文本文件,动态参数文件是二进制文件。Vi命令参看动态参数文件时,一定要用q!的方式退出,不然文件要损坏。
静态参数文件只在oracle启动时读一次,读完就关闭,如果要改oracle的任何参数,只能重启数据库。动态参数文件在oracle启动时读一次,但是参数文件在oracle运行期间是打开的,可以动态的修改部分参数,还有少部分参数可以动态改,但是改完不一定马上生效,需要重启。
Oracle启动的第一步是找参数文件。在Linux中,oracle根据环境变量$ORACLE_SID设置的oracle SID的名字到$ORACLE_HOME目录下找动态参数文件,也就是说,能不能找到参数文件取决于环境变量设置的是否正确。如果找不到动态参数文件,oracle会尝试着找静态参数文件。
修改$ORACLE_SID:
[oracle@redhat4 ~]$ vi .bash_profile PATH=$PATH:$HOME/bin export PATH unset USERNAME ORACLE_BASE=/u01/app/oracle export ORACLE_BASE ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1 export ORACLE_HOME <span style="color:#FF0000;">ORACLE_SID=jiagulun export ORACLE_SID</span> NLS_LANG=american_america.zhs16gbk export NLS_LANG PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
假如把$ORACLE_SID修改成一个错误的名字:jiagulun1,则启动时oracle报错:找不到参数文件。
[oracle@redhat4 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Productionon Wed Dec 30 08:47:32 2015 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to an idle instance. SQL> startup <span style="color:#FF0000;">ORA-01078: failure inprocessing system parameters LRM-00109: could not openparameter file '/u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun1.ora'</span>
Oracle数据库启动的三个阶段:nomount、mount、open。
1. nomount,oracle找到参数文件(读spfile文件),根据参数文件的配置将内存空间划分出来和将进程起起来。只要有参数文件,参数文件设置正确,就可以nomonut。
SQL> startup nomount <span style="color:#FF0000;">ORACLE instance started.</span> Total System Global Area 285212672 bytes Fixed Size 2020192 bytes Variable Size 113249440 bytes Database Buffers 163577856 bytes Redo Buffers 6365184 bytes
#实例启动起来了,进程和内存空间都有了,同时打开了参数文件
#查看nomount启动的oracle进程:
[oracle@redhat4 ~]$ ps -ef UID PID PPID C STIME TTY TIME CMD oracle 7447 7446 0 14:27 pts/1 00:00:00 -bash oracle 7508 1 0 14:27 ? 00:00:00 ora_pmon_jiagulun oracle 7510 1 0 14:27 ? 00:00:00 ora_psp0_jiagulun oracle 7512 1 0 14:27 ? 00:00:00 ora_mman_jiagulun oracle 7514 1 0 14:27 ? 00:00:00 ora_dbw0_jiagulun oracle 7516 1 0 14:27 ? 00:00:00 ora_lgwr_jiagulun oracle 7518 1 0 14:27 ? 00:00:00 ora_ckpt_jiagulun oracle 7520 1 0 14:27 ? 00:00:00 ora_smon_jiagulun oracle 7522 1 0 14:27 ? 00:00:00 ora_reco_jiagulun oracle 7524 1 0 14:27 ? 00:00:00 ora_cjq0_jiagulun oracle 7526 1 0 14:27 ? 00:00:00 ora_mmon_jiagulun oracle 7528 1 0 14:27 ? 00:00:00 ora_mmnl_jiagulun oracle 7530 1 0 14:27 ? 00:00:00 ora_d000_jiagulun oracle 7532 1 0 14:27 ? 00:00:00 ora_s000_jiagulun oracle 7762 7447 0 14:31 pts/1 00:00:00 ps –ef
#查看nomount成功后oracle占用的内存:
[oracle@redhat4 ~]$ ipcs -a ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x36010028 65537 oracle 640 287309824 13 ------ Semaphore Arrays -------- key semid owner perms nsems 0x7df2e688 98304 oracle 640 154 ------ Message Queues -------- key msqid owner perms used-bytes messages #查看nomount成功后打开的参数文件: SQL> desc v$parameter; Name Null? Type ------------------------------------------------- ---------------------------- NUM NUMBER NAME VARCHAR2(80) TYPE NUMBER VALUE VARCHAR2(512) DISPLAY_VALUE VARCHAR2(512) ISDEFAULT VARCHAR2(9) ISSES_MODIFIABLE VARCHAR2(5) ISSYS_MODIFIABLE VARCHAR2(9) ISINSTANCE_MODIFIABLE VARCHAR2(5) ISMODIFIED VARCHAR2(10) ISADJUSTED VARCHAR2(5) ISDEPRECATED VARCHAR2(5) DESCRIPTION VARCHAR2(255) UPDATE_COMMENT VARCHAR2(255) HASH NUMBER
#通过参数文件查看控制文件在什么地方:
SQL> show parameter control; NAME TYPE VALUE ---------------------------------------------------------------------------------------------------- control_file_record_keep_time integer 7 control_files string /u01/app/oracle/oradata/JIAGULUN/controlfile/o1_mf_7p5b2xty_.ctl, /u01/app/oracle/flash_recovery_area/JIAGULUN/controlfile/o1_mf_7p5b2y0c_.ctl
2. mount,根据参数文件保存的控制文件的位置,找到控制文件,把控制文件打开(读*.ctl文件),控制文件中记录着数据文件和redo log的位置,同时控制文件记录着数据库的运行状态,根据运行状态判断数据库的一致性。
SQL>alter database mount; Database altered.
3. open,把数据文件和redolog打开。
SQL>alter database open; Database altered.
动态参数文件和静态参数文件可以相互生成。
#由动态参数文件生成静态参数文件:
SQL>create pfile from spfile; File created.
#找到生成的静态参数文件:
[oracle@redhat4~]$ cd $ORACLE_HOME/dbs [oracle@redhat4dbs]$ ls hc_cgh.dat <span style="color:#FF0000;">initjiagulun.ora </span>lkTEST spfilecgh.ora hc_demo.dat init.ora orapwcgh spfiledemo.ora hc_jiagulun.dat lkCGH orapwdemo spfilejiagulun.ora hc_test.dat lkDEMO orapwjiagulun spfiletest.ora initdw.ora lkJIAGULUN orapwtest
#静态文件是可编辑的
当我们使用动态参数文件的时候,在spfile里面有参数,在内存里也有参数。
假如把spfile的参数改错了,导致数据库打不开,数据库打不开又不能改spfile,陷入死锁。
1.以sqlplus / assysdba登录数据库,用create pfile from spfile生成一个静态文件,然后在静态文件里修改参数;
2.再以sqlplus /as sysdba登录数据库,用create spfile from pfile从静态文件中生成一个动态文件。
3.这样就可以startup了。
Oracle的关闭方式: