oracle学习笔记 参数文件及数据库的启动和关闭

Posted 新站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle学习笔记 参数文件及数据库的启动和关闭相关的知识,希望对你有一定的参考价值。

oracle学习笔记 参数文件及数据库的启动和关闭

我们这节课把oracle的参数文件以及oracle的启动关闭讲一下

一)参数文件作用

先看oracle的参数文件
它由来已久了

我们知道oracle数据库有数据库和实例
所谓的实例是一堆进程和一堆内存

数据库启动起来以后
在内存里面会有一个比较大的一个内存结构
内存结构里面有PGA有SGA
SGA里面有很多种池子
池子里面有很多的一些链啊等等这些
包括还有一堆进程,还有PGA,还有所能连接的serverprocess数量这些
整个的这是实例
这些统称oracle的实例

我们来看oracle实例
到底是SGA分多大
里面的池子分多大
池子里面具体的什么情况
等等这些该如何分配

也就是说oracle启动的时候
如何来分配内存
oracle这些参数在oracle的参数文件里面

有一个参数文件
其中一部分参数就是用来设置这个实例的

当然了oracle参数文件里面
还有很多参数和这个实例没有多大关系
但是oracle数据库运行期间会使用这些参数

也就是这么认为
oracle数据库的很多参数
都在参数文件里面
所以说你要对oracle进行配置和修改
绝大部分操作是修改oracle参数文件

二)参数文件位置

oracle参数文件在什么地方呢

简单给大家看一下

在linux或unix里面
是在$ORACLE_HOME下dbs目录
windows里面
是在$ORACLE_HOME下database目录

好我们看一下

[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat  initdw.ora  init.ora  lkJIAGULUN  orapwjiagulun  spfilejiagulun.ora    

这里面有一个文件spfilejiagulun.ora
spfile数据库名字.ora这个文件
应该是spfile数据库实例的名字.ora

正常情况下我们实例的名字等于数据库的名字
因为我们是单实例环境
单实例环境数据库的名字等于实例的名字
多实例环境
一个数据库的名字对应多个实例的名字

这里是spfile实例名字.ora

oracle从9i开始
oracle的参数文件就叫spfile实例名字.ora

三)静态和动态参数文件

1)名字和文件格式的区别

参数文件的内容一会儿我们去看
先看这个参数文件

oracle参数文件在9i以前
oracle7和oracle8的时候它是叫静态参数文件
从oracle9i开始叫动态参数文件

静态和动态参数文件
第一个不同的地方是
静态参数文件的名字叫initSID.ora

我们这里面
如果是静态参数文件的话就应该叫什么initjiagulun.ora

也就是后面的jiagulun.ora是一样的
前面叫init然后实例名字.ora
如果是静态参数文件的话应该是这个名字

我们这里面动态参数文件叫spfile实例名字.ora
这是动态参数文件
这是它名字上不一样的地方

从oracle9i开始
我们都用动态参数文件

还有一个不同的地方是
静态参数文件是文本文件
动态参数文件是二进制文件

其实它所不同的地方是
文本文件是vi可以看的
二进制文件原则上vi是不能看的

但是我们这里面呢
vi也可以看动态参数文件

[oracle@redhat4 dbs]$ vi spfilejiagulun.ora
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^G^@^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^B^@^@U^D^@^@!Âz9^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@jiagulun.__db_cache_size=184549376
jiagulun.__java_pool_size=4194304
jiagulun.__large_pool_size=4194304
jiagulun.__shared_pool_size=83886080
jiagulun.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/jiagulun/adump'
*.background_dump_dest='/u01/app/oracle/admin/jiagulun/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl','/u01/app/oracle/oradata/jiagulun/control02.ctl','/u01/app/oracle/oradata/jiagulun/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/jiagulun/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='jiagulun'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=jiagulunXDB)'
*.job_queue_processes=10
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=285212672
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/jiagulun/udump'
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

这是vi的结果
但里面上面是有一些乱码

记住你vi看的时候这些内容也可以看到
但是退出的时候一定要用q!退出

q!退出就是强制退出但不保存
否则这个文件就被损坏了

原则上我们不建议对spfile进行vi

这是静态和动态的几个区别

一是名字的区别
一是文件格式的区别

记住不管是静态和动态里面放的都是oracle的参数
我们平时对oracle进行配置的时候主要看这个参数

2)本质的区别

我们看静态和动态参数文件的本质区别是什么

静态参数文件
是oracle启动的时候去读一下这个文件
根据参数文件的设置来设置这个实例

同时把参数读到内存里面去
然后关闭这个参数文件
然后再也不用它了

也就是说静态参数文件
只有在oracle数据库启动的时候才能去读一下
读完了就关闭了,然后就一直不用了

它对应的是
如果你要改oracle的任何参数只能重启数据库

这是本质的地方

动态参数文件是
oracle启动的时候读一下
这个跟静态一样
启动的时候读一下然后去设置,根据参数去设置
然后把参数读到内存里面去
但是它不关闭这个文件
它一直打开这个文件

这就意味着在数据库运行期间
我们可以动态的修改参数
但是记住
只是部分参数可以动态修改
不是全部的参数都可以动态修改

因为有些参数
它改动的非常大所以轻易的不让改
就是有的参数不能动态改

所谓的不能动态改是这么个意思
是可以动态改
但是改完了后不一定马上生效,需要重启

或者从某种意义上来讲
动态参数文件里面所有的参数
都可以在数据库运行期间修改
但是有的参数
修改完了马上生效
有的参数修改完了需要重启数据库

一会儿我们去看一个去判断一个参数是什么情况
这就是数据库的动态和静态参数
所以说我们用动态参数好还是用静态参数好
显然用动态好

因为对oracle数据库来讲
我们轻易的不重启

所以说对静态参数来讲改任何参数都要重启显然不合适

所以说数据库一定要用动态参数
从oracle9i开始我们都在用动态参数

这是本质的地方

四)参数文件寻找顺序

oracle数据库启动的时候
寻找参数文件的过程中
参数文件的寻找顺序很有意思
有时候会有一些问题

我们来看一下

首先来讲oracle启动的时候用什么启动

用sqlplus / as sysdba
先连接数据库,先连接进去

我的数据库已经启动了
为了试验先给它关了

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

这个关,一会儿告诉你几种关的方式

数据库启动的时候这里面会有些小技巧
关的话最好先关监听

实验环境中有对数据库的连接
先把其它的连接关了

如oracle sql developer中的连接

在一个连接上点右键
然后执行
断开连接

把其它连接关了
数据库断开了对它的连接关闭过程会快一些

oracle数据库关了以后
就没有进程了

我们看数据库启动过程

oracle启动的时候
数据库启动分三步

启动三个阶段
第一个阶段是nomount
第二个阶段是mount
第三个阶段是open

启动阶段我们先不看
先看oracle的参数文件

oracle数据库启动的时候
做的第一件事情是找spfile是找ora文件找参数文件

默认是到这个目录底下去找
/u01/app/oracle/product/10.2.0/db_1/dbs

这个目录底下有很多文件

oracle根据

[oracle@redhat4 dbs]$ echo $ORACLE_SID
jiagulun

ORACLE_SID环境变量

根据这个环境变量里面设置的SID里面
这里名字叫jiagulun

然后它跑到这个dbs目录底下去
/u01/app/oracle/product/10.2.0/db_1/dbs
去找spfilejiagulun.ora

也就是说
能不能找到这个文件spfilejiagulun.ora
取决于环境变量$ORACLE_SID设的有没有问题

找到这个文件spfilejiagulun.ora以后
然后使用这个文件去启动

如果找不到这个文件呢
它就尝试找initjiagulun.ora

也就是动态文件找不到它找静态文件

当然了它的寻找顺序基本上是这个顺序
先找动态,动态找不着找个静态

一般的我们要保证有这个动态文件spfilejiagulun.ora

在使用静态参数文件initjiagulun.ora启动后
对参数的修改与使用和动态参数文件启动有些不同

这时alter system执行时无法对spfilejiagulun.ora文件进行写入操作
所以只能修改内存中的参数值

如果向spfile文件中写入参数值会报错
如:

SQL> alter system set recyclebin = off scope = spfile;
alter system set recyclebin = off scope = spfile
*
ERROR at line 1:
ORA-32001: write to SPFILE requested but no SPFILE specified at startup

在数据库启动时没有指定spfile文件所以向spfile文件的写请求无法执行

这时向内存中的更改还是可以执行的
如:

SQL> alter session set recyclebin = off;

Session altered.

SQL> alter system set recyclebin = off scope = memory;

System altered.

这样的修改对运行中的实例是有效的,但数据库重启内存中的修改都会失效

要想使以后的实例有效需要手动编写init.ora文件
这样的修改不会在当前实例中马上生效
下次启动使用这个init.ora文件才能使参数更改有效

使用静态参数文件启动后
虽然这时动态参数文件还在磁盘的那个位置
但是实例是不使用它的,只有在启动时加载了它才会使用它

如使用它的一个参数视图v$spparameter
这时对它查询所有的参数都无值
ISSPECIFIED都是FALSE就是都没有指定值

五)参数文件名和$ORACLE_SID的值的关系

如果说假设我这个$ORACLE_SID设错了的话
启动的时候会找不到这个参数文件,就会报错
所以$ORACLE_SID一定要设对了

设不对的话我们改一下就ok了

这个环境变量在oracle用户的.bash_profile文件里面

看一下这个文件

[oracle@redhat4 ~]$ vi .bash_profile

文件内容

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
unset USERNAME

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORACLE_SID=jiagulun
export NLS_LANG=american_america.zhs16gbk
export PATH=$PATH:$ORACLE_HOME/bin:.

有这一行
export ORACLE_SID=jiagulun
这个名字我们事后设置也可以
它一定等于数据库实例的名字

[oracle@redhat4 ~]$ sync

这里老师执行了一下sync命令
它的作用是,将有关文件系统的存储器常驻信息送入物理介质内
这里就是强制把磁盘缓冲的所有数据写入磁盘

这是我们刚才讲的寻找顺序
一定要给它设对了
既然设对了用sqlplus就可以连上来

假设我们设错了
重新设一下

[oracle@redhat4 ~]$ export ORACLE_SID=jiagulun1

设错了以后连过来
在数据库已开启和没有开启的状态下,执行结果都是

[oracle@redhat4 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Jan 5 10:49:12 2018

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

Connected to an idle instance.

连过来以后,它提示
Connected to an idle instance.
连到一个空闲的实例上

表示数据库没有实例启动,就是没有名为jiagulun1的实例已启动

sqlplus连接要用到ORACLE_SID这个环境变量

返回结果说明刚才的
ORACLE_SID=jiagulun1中的
jiagulun1这个实例
就是ORACLE_SID所对应的实例没有启动

我们启动一下

SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun1.ora'

它提示
could not open parameter file
不能打开参数文件
/u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun1.ora

它去找jiagulun1.ora
因为spfile没找到,它就找init
也没找到,它就报错了

实际上我们报错以后发现
不是我们的参数文件没有
是因为我们的ORACLE_SID设错了
设对了以后就ok了

这是一个简单的排错流程

[oracle@redhat4 ~]$ echo $ORACLE_SID
jiagulun1

然后看这个SID和我们的实际的SID一不一样

这个名字应该在$ORACLE_HOME/dbs目录底下
有一个spfile后面名字跟他一样

我们把$ORACLE_SID改回正确的值
exit对linux的oracle用户的会话后重新登陆一下

[oracle@redhat4 ~]$ echo $ORACLE_SID
jiagulun

因为刚才的修改时对单个会话进行的export
所以退出那个会话,在重新登陆一个会话就可以了

好这回对了
上面修改linux的这个环境变量时是在oracle用户的会话中进行的
是对单个会话进行的,只对当前的linux会话有效
退出这个会话这次的修改就失效了

记住这个oracle参数文件的启动顺序寻找顺序

六)oracle启动的三个阶段

Oracle启动三个阶段
nomount
mount
open

第一是nomount
第二是mount
第三是open

我们来简单看一下这个启动状态启动过程

我们来启动

首先打开sqlplus客户端

[oracle@redhat4 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jan 6 08:00:20 2018

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

Connected to an idle instance.

首先来讲它是idle空闲
当前没有数据库实例在运行
所以sqlplus没有连接到实例

然后在sqlplus中startup直接回车以后
启动的三个阶段自动完成

如果分阶段启

1)nomount阶段和mount阶段

先启动到nomount状态

用startup nomount指令

数据库nomount启动阶段做了件什么事情呢

nomount的过程oracle要找到参数文件

记住nomount阶段oracle只做一件事情
找到参数文件
根据参数文件的配置将内存空间以及进程起来

就是内存空间划分出来、进程起来就ok

所以说只要有参数文件
只要参数文件的设置没有错就可以nomount

第二个阶段是mount

mount是根据参数文件里面设置的控制文件的位置
找到控制文件把控制文件打开
也就是说二阶段把控制文件打开

一阶段如果能打开的话
只要参数文件正确就可以打开

二阶段是找到控制文件打开控制文件
第一找到、第二打开

2)nomount阶段的状态

SQL> startup nomount;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              83887720 bytes
Database Buffers          192937984 bytes
Redo Buffers                7168000 bytes
SQL>

startup nomount;执行完了
它只是把实例启动起来了
就是进程和内存空间都有了

还做了一件事情把参数文件打开了

第一内存空间划分了
第二进程起来了

我们去判断一下

[oracle@redhat4 ~]$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Jan05 ?        00:00:02 init [5]
root         2     1  0 Jan05 ?        00:00:12 [migration/0]
root         3     1  0 Jan05 ?        00:00:00 [ksoftirqd/0]
.
.
.
root     24780 24697  0 07:58 pts/1    00:00:00 su - oracle
oracle   24784 24780  0 07:58 pts/1    00:00:00 -bash
oracle   26088  8843  0 08:00 ?        00:00:05 /u01/app/oracle/product/10.2.0/db_1/jdk/bin/java -server -Xmx256M -XX:MaxPermSize=96m -XX:MinHeoracle   26197 24784  0 08:00 pts/1    00:00:00 sqlplus   as sysdba
oracle   27113     1  0 08:09 ?        00:00:00 ora_pmon_jiagulun
oracle   27115     1  0 08:09 ?        00:00:00 ora_psp0_jiagulun
oracle   27117     1  0 08:09 ?        00:00:00 ora_mman_jiagulun
oracle   27119     1  0 08:09 ?        00:00:00 ora_dbw0_jiagulun
oracle   27121     1  0 08:09 ?        00:00:00 ora_lgwr_jiagulun
oracle   27123     1  0 08:09 ?        00:00:00 ora_ckpt_jiagulun
oracle   27125     1  0 08:09 ?        00:00:00 ora_smon_jiagulun
oracle   27127     1  0 08:09 ?        00:00:00 ora_reco_jiagulun
oracle   27129     1  0 08:09 ?        00:00:00 ora_cjq0_jiagulun
oracle   27131     1  0 08:09 ?        00:00:00 ora_mmon_jiagulun
oracle   27133     1  0 08:09 ?        00:00:00 ora_mmnl_jiagulun
oracle   27135     1  0 08:09 ?        00:00:00 ora_d000_jiagulun
oracle   27137     1  0 08:09 ?        00:00:00 ora_s000_jiagulun
oracle   27138 26197  0 08:09 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root     28069 24689  0 08:18 pts/2    00:00:00 bash
root     28151 28069  0 08:18 pts/2    00:00:00 su - oracle
oracle   28152 28151  0 08:18 pts/2    00:00:00 -bash
oracle   28348 28152  0 08:21 pts/2    00:00:00 ps -ef

我们看结果中有

oracle   27113     1  0 08:09 ?        00:00:00 ora_pmon_jiagulun
oracle   27115     1  0 08:09 ?        00:00:00 ora_psp0_jiagulun
oracle   27117     1  0 08:09 ?        00:00:00 ora_mman_jiagulun
oracle   27119     1  0 08:09 ?        00:00:00 ora_dbw0_jiagulun
oracle   27121     1  0 08:09 ?        00:00:00 ora_lgwr_jiagulun
...

这样的一些内容
是oracle的一堆进程起来了

再看一下内存的情况

[oracle@redhat4 ~]$ ipcs -a

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x36010028 524288     oracle    640        287309824  14

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x7df2e688 360448     oracle    640        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

oracle也占用相关内存了

如结果中的

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x36010028 524288     oracle    640        287309824  14

Shared Memory Segments共享内存段中有oracle信息

内存也启来了
然后进程也启来了
参数文件也可以访问了

这时一般数据文件还不能访问

SQL> desc tab;
ERROR:
ORA-04043: object tab does not exist

有些动态视图已经可以访问了

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/jiagul
un/control01.ctl, /u01/app/ora
cle/oradata/jiagulun/control02
.ctl, /u01/app/oracle/oradata/
jiagulun/control03.ctl

参数文件中的信息中有控制文件的位置

parameter可以打开了可以看了

控制文件

以上是关于oracle学习笔记 参数文件及数据库的启动和关闭的主要内容,如果未能解决你的问题,请参考以下文章

Oracle11g09_Oracle的启动和关闭

oracle学习笔记之-------启动与关闭权限管理

Oracle 11g 数据库启动和关闭

oracle体系架构-5-数据库的启动和关闭

oracle 关闭之后启动报错ora-00205,怎么解决?

Oracle数据库实例的启动及关闭