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的关闭方式: