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学习笔记 参数文件及数据库的启动和关闭的主要内容,如果未能解决你的问题,请参考以下文章