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可以打开了可以看了
控制文件在
/u01/app/oracle/oradata/jiagul
un/control01.ctl, /u01/app/ora
cle/oradata/jiagulun/control02
.ctl, /u01/app/oracle/oradata/
jiagulun/control03.ctl
这几个地方
在这三个位置
在这三个位置内容都是一样的
3)mount阶段
我们nomount以后
将参数文件打开以后,可以找到控制文件
第二个阶段mount
在nomount阶段可以使用下面的命令进入mount
alter database mount;
在nomount阶段执行startup mount不可行
SQL> startup mount;
ORA-01081: cannot start already-running ORACLE - shut it down first
正确的可以
SQL> alter database mount;
Database altered.
mount就是找到控制文件把控制文件打开
就是第二阶段
mount就是打开控制文件
4)open阶段
然后open是把数据文件和redolog打开
因为数据文件和redolog这些文件在控制文件中记载着
因为控制文件记载着数据库的物理结构
所以说你要打开数据文件和redolog必须先打开控制文件
同时控制文件还记录着数据库的运行状态
根据控制文件记录的状态
我们去判断这个数据库是不是一致
所以说第三阶段是open
在mount阶段这时不能执行startup
SQL> startup open;
ORA-01081: cannot start already-running ORACLE - shut it down first
正确的方法可以
SQL> alter database open;
Database altered.
open是把数据文件和跟redolog打开
所以是一步步的去对接的
回去要好好的把oracle的启动顺序
启动流程去看一下
好三个阶段
nomount是读spfile
mount是读controlfile
open是读数据文件和redolog
spfile里面记录着控制文件的位置
控制文件中记录着数据库的物理位置
所以说通过控制文件可以找到数据文件跟redolog
这是oracle启动的三个阶段
5)各阶段可以查看的内容
在启动的这个三个阶段
随着每个阶段的打开
数据库的内容也一步步的打开
这样每启动一步有些内容就可以查看了
这里以数据字典的动态性能视图为例
在数据库启动到 NOMOUNT 的状态时
只能访问那些与SGA区相关的数据字典视图
可以访问 v$parameter、v$sga 、v$session、v$process、v$instance、v$version、v$option
这些视图中的信息都是从SGA区中获得的,与数据库无关
当数据库启动到 mount 的状态时
可以访问那些与控制文件相关的数据字典视图了
我们还可以访问 v$log、v$logfile、v$datafile、v$controlfile、v$database、v$thread、v$datafile_header
这些视图中的信息都是从控制文件获得的
Open模式,数据库的所有数据文件已被打开
所有的表和视图都可以访问了
七)动态和静态参数文件的生成
动态和静态参数文件互相可以生成
记住有了动态参数文件了我可以生成静态参数文件
有了静态了可以生成动态
create pfile from spfile;
建立一个pfile然后from spfile
将动态参数文件生成一个静态参数文件
这个最简单
原来默认参数文件所在目录状态
[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
其实这个create pfile 和 create spfile命令在数据库是关闭的状态下在sqlplus中就可以执行
创建pfile文件
SQL> create pfile from spfile;
File created.
老师在实验中字符显示有些问题
是字符集设置中的语言有问题
执行命令时返回结果会有些乱码
显示的时候有些不太好
这个系列中的实验一直如此
前面老师总是在用户会话中使用
export NLS_LANG=american_america.zhs16gbk
解决问题
但每次实验前都执行有些麻烦
其实可以放到用户的初始化文件.bash_profile中
修改后的oracle用户的.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 NLS_LANG=american_america.zhs16gbk
这一行
这样每次这个oracle用户登录
这个环境变量就自动设置好了
刚才静态文件已经生成了
生成到哪个地方去了
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat initdw.ora initjiagulun.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
在
/u01/app/oracle/product/10.2.0/db_1/dbs
目录下多了一个文件initjiagulun.ora
名字的前部分字符有init
这是通过同一目录下的spfilejiagulun.ora生成的initjiagulun.ora
当然也可以通过initjiagulun.ora生成spfilejiagulun.ora
但是
SQL> create spfile from pfile;
create spfile from pfile
*
ERROR at line 1:
ORA-32002: cannot create SPFILE already being used by the instance
说明运行的实例正在使用spfile文件时不能替换spfile文件
initjiagulun.ora这个文件是可以vi编辑的
[oracle@redhat4 dbs]$ vi initjiagulun.ora
文件内容:
jiagulun.__db_cache_size=192937984
jiagulun.__java_pool_size=4194304
jiagulun.__large_pool_size=4194304
jiagulun.__shared_pool_size=75497472
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修改完了,直接就修改了pfile中的这个参数
对这里面的参数来讲
有一个参数启动时是必须的
jiagulun.__shared_pool_size=75497472
设置这一个参数其实就可以了
老师的环境这个参数比较小,只有4兆,比较小
[oracle@redhat4 dbs]$ sync
老师在这里写了一下磁盘缓存
也就是说对spfile来讲
对这个参数文件来讲
如果说启动起来至少要设正确一个参数就是sharedpool size
老师说的是要使实例正常运行必须的参数设置
经查阅资料
要让数据库启动起来必须的参数是db_name,只要有这个参数数据库就可以启动起来
这就是动态和静态的生成
根据静态我生成动态是可以的
比如说我们的动态参数文件坏了
有可能被修改坏了
这时候数据库启动不起来了
我可以先用静态的启来
然后再create一个动态的
再重启
动态的生成就是create spfile from pfile;
这是动态和静态的生成
如果错误的修改了spfile里面的参数,数据库启动失败
因为没有办法直接修改spfile,该怎么办
我们后面有个小例子有个小实验
关于生成呢先讲到这里
八)参数的修改类型
1)不同类型参数有不同的修改方法
接下来我们讲一个很重要的东西
就是参数类型
数据库启动起来以后
哪些参数可以修改,哪些参数不能修改
一个参数的作用范围可以在三个地方起作用
整个数据库、运行的实例和运行的会话
参数修改在实例级别我们用
ALTER SYSTEM SET parameter_name=parameter_value [comment=‘注释’] scope=[memory|spfile|both] [sid=‘sid’|’*’]
命令修改
一般用这个修改
oracle实例中有关于参数的视图,oracle有哪些参数可以通过它们来查
这节课用到了v$parameter、v$system_parameter、v$spparameter
v$parameter显示的是session级的参数及其状态
v$system_parameter显示的是实例级的参数及其状态
v$spparameter显示的是在spfile文件中的有哪些参数的设置
这些视图它们在unmount状态就可以查
每一个新Session都是从v$system_parameter上取得系统的当前值而产生Session的v$parameter视图
v$system_parameter这个视图是实例参数的情况,对会话的参数的修改和它无关联
平时常用的show parameter指令的值来自于v$parameter
就是它来自于当前会话的参数值
oracle数据库参数有动态和静态之分是针对实例来讲的
静态指实例运行期间这个参数的值是不能改变的
动态就是实例运行期间在这个实例中这个参数的值可以改变。
关于参数的详细信息和使用在oracle官方文档中可以查到
oracle官方文档里面有个books
books里面有一个reference
打开以后然后查V$PARAMETER
在Dynamic Performance (V$) Views中可以找到
然后打开V$PARAMETER的说明
这里面有这个数据字典的详细说明
这个字典视图有一个ISSYS_MODIFIABLE VARCHAR2(9) 列
ISSYS_MODIFIABLE用来说明
这个参数是静态参数还是动态参数
以及这个参数在系统级别可以修改的方式及在什么时候生效
这个视图中还有两个类似的列
ISSES_MODIFIABLE,isinstance_modifiable
ISSES_MODIFIABLE表示参数值是否可以在会话级别进行修改
isinstance_modifiable在一个数据库有多个实例运行时使用,如RAC环境
整个教程没牵扯到这部分内容,不细讲了
isses_modifiable列的值有两个
true可以、false不可以
表示修改时可不可以使用alter session命令修改
alter session命令是没有scope选项的,如果带上会报错不会执行
对issys_modifiable列
下面是官方文档的说明:
ISSYS_MODIFIABLE VARCHAR2(9) Indicates whether the parameter can be changed with ALTER SYSTEM and when the change takes effect:
?IMMEDIATE - Parameter can be changed with ALTER SYSTEM regardless of the type of parameter file used to start the instance. The change takes effect immediately.
?DEFERRED - Parameter can be changed with ALTER SYSTEM regardless of the type of parameter file used to start the instance. The change takes effect in subsequent sessions.
?FALSE - Parameter cannot be changed with ALTER SYSTEM unless a server parameter file was used to start the instance. The change takes effect in subsequent instances.
如果说是FALSE
表示这个参数不可以使用ALTER SYSTEM对运行的实例中的这个参数进行修改
但是可以修改用于实例启动的参数文件中的参数值
在以后的实例中产生效果
如果说这个列里面的值是IMMEDIATE
表示这个参数可以使用ALTER SYSTEM修改
可以不修改参数文件,修改完了可以马上生效,不用重新启动实例
而且马上对所有会话生效
那么DEFERRED呢
表示可以使用ALTER SYSTEM修改当前实例中的值,
可以不修改参数文件,不用重新启动实例来生效,修改完了马上在实例生效
对会话的作用效果是对修改以后建立的新会话生效
对已经正在运行的会话无效,需要这个会话重新登陆后才在会话中生效
这个DEFERRED只对少数参数有用
一个参数可以分别设置于多个地方
在spfile文件中可以有值
在内存中也可以有值
而在内存中有可以分为实例中和会话中
对这几个部分可以使用相应的命令分别修改
实际issys_modifiable列这几种参数类型都是可以静态修改的
就是alter system 使用scope = spfile参数
就是不管是静态参数还是动态参数
都是可以在oracle启动时的参数文件中直接修改
如果ISSYS_MODIFIABLE的值是FALSE说明这个参数是静态参数
修改只能在参数文件中修改
不能修改实例中的此参数的值
如果ISSYS_MODIFIABLE的值是IMMEDIATE或DEFERRED表示这个参数是动态参数
这时仍然可以在参数文件中直接修改
而且可以修改运行的实例中的此参数值,这时修改的值在内存中生效
我们看修改语句的语法:
alter system set parameter_name = parameter_value [, parameter_value ]...
[ COMMENT 'text' ]
[ DEFERRED ]
[ SCOPE = { MEMORY | SPFILE | BOTH } ]
[ SID = { 'sid' | * } ]
修改的范围有三种
SCOPE = { MEMORY | SPFILE | BOTH }
根据这个参数的ISSYS_MODIFIABLE的值
可以选择alter system的修改范围,就是SCOPE的值
另外决定是否使用DEFERRED选项
所有的参数不管是静态的还是动态的都可以使用SCOPE = SPFILE
不管ISSYS_MODIFIABLE的值是FALSE还是IMMEDIATE或DEFERRED都可以直接修改参数文件
并在下次实例启动时生效
ISSYS_MODIFIABLE的值是IMMEDIATE时
可以使用 SCOPE = MEMORY只修改实例内存中此参数的值
并且马上在实例和实例中的所有会话生效
ISSYS_MODIFIABLE的值是DEFERRED时
修改时必须加上DEFERRED选项实例内存中此参数的值才能得到修改
只在参数修改后启动的会话中生效,对当前已有的会话不影响
这里的DEFERRED是个特别的地方
这个类型的参数数量很少
SQL> select name,value,issys_modifiable from v$parameter where issys_modifiable='DEFERRED';
NAME VALUE ISSYS_MOD
------------------------------ ---------------------------------------- ---------
backup_tape_io_slaves FALSE DEFERRED
audit_file_dest /u01/app/oracle/admin/jiagulun/adump DEFERRED
object_cache_optimal_size 102400 DEFERRED
object_cache_max_size_percent 10 DEFERRED
sort_area_size 65536 DEFERRED
sort_area_retained_size 0 DEFERRED
olap_page_pool_size 0 DEFERRED
7 rows selected.
一共就这几个
我举例语句中以sort_area_size为例
这个参数的原始状态
SQL> select name,value,isdefault,isses_modifiable,issys_modifiable,isinstance_modifiable,ismodified from v$parameter where NAME = 'sort_area_size';
NAME VALUE ISDEFAULT ISSES ISSYS_MOD ISINS ISMODIFIED
--------------- -------- --------- ----- --------- ----- ----------
sort_area_size 65536 TRUE TRUE DEFERRED TRUE FALSE
它的isses_modifiable类型是TRUE,就是可以对会话修改它的参数值,
这个只对单个会话有作用,和实例及spfile文件没有关系
SQL> alter session set sort_area_size = 75536;
Session altered.
issys_modifiable为DEFERRED类型的参数也是可以直接修改spfile文件的
SQL> alter system set sort_area_size = 75536 scope = spfile;
System altered.
这样对DEFERRED类型的参数修改就剩下了对实例的修改了
对内存中实例中此参数的值的修改则必须带上DEFERRED选项
使用无DEFERRED的alter system 的语句会报错
如使用无DEFERRED的memory参数:
alter system set sort_area_size = 75536 scope = memory;
返回结果
SQL> alter system set sort_area_size = 75536 scope = memory;
alter system set sort_area_size = 75536 scope = memory
*
ERROR at line 1:
ORA-02096: specified initialization parameter is not modifiable with this
option
oracle对这个错误的描述是:
[oracle@redhat4 ~]$ oerr ora 02096
02096, 00000, "specified initialization parameter is not modifiable with this option"
// *Cause: Though the initialization parameter is modifiable, it cannot be
// modified using the specified command.
// *Action: Check the DBA guide for information about under what scope
// the parameter may be modified
说明使用的命令有错误
DEFERRED类型的参数
修改时带上DEFERRED选项就可以修改了
这时所有的scope选项的取值都可以使用
这时的scope的值可以进一步限制DEFERRED参数修改的范围
alter system set sort_area_size = 75536 DEFERRED;
alter system set sort_area_size = 75536 DEFERRED scope=both;
alter system set sort_area_size = 75536 DEFERRED scope=memory;
alter system set sort_area_size = 75536 DEFERRED scope=spfile;
这几种都是可以执行成功的
其中DEFERRED和DEFERRED scope=both是等同的
既修改内存也修改spfile文件
就是在这里scope的默认值是both
DEFERRED对内存的修改是修改实例中此参数的值
对当前以存在的会话不影响
但是以后开启的会话会使用新指定的值
关于参数是否被修改过
v$parameter和v$system_parameter视图中有ismodified
v$spparameter视图中有个isspecified
这几个PARAMETER视图列出了所有用户可操作的参数
V$PARAMETER是会话中参数的情况
v$system_parameter是实例中参数的情况
v$spparameter是所有参数在spfile中的定义情况
v$parameter中ismodified字段有三个取值
FALSE会话中的此参数没有被修改过
MODIFIED会话中的此参数被alter session修改过
SYSTEM_MOD会话中的此参数被alter system修改过
v$system_parameter中ismodified字段有两个取值
FALSE实例中的此参数没有被修改过
MODIFIED实例中的此参数被修改过
v$system_parameter是实例的参数只能使用alter system修改
v$spparameter中isspecified字段有两个取值
FALSE说明spfile文件中没有指定这个参数
TRUE说明spfile文件中指定了这个参数
因为v$spparameter只和spfile相关,所以isspecified为true说明这个参数被静态修改了
2)参数修改小结
参数可以在两个位置进行修改
spfile中是静态修改,oracle启动使用spfile,所以在数据库启动时这里的修改生效
内存中的修改是动态修改,不用重启数据库就可以生效
内存中又有实例中的参数值和会话中的参数值
用户使用的参数及其状态oracle提供了视图,如V$PARAMETER、v$system_parameter、v$spparameter
视图中所有的参数都可以直接使用
alter system set…scope=spfile;
修改
因为这是静态修改,只修改spfile文件,和内存中正在运行的实例及实例中的会话没有关系
视图中isses_modifiable字段的值表示是否可以对当前会话进行修改此参数值
是针对单个会话的修改
视图中issys_modifiable字段的值表示是否可以对当前实例进行修改此参数值
是对正在运行的实例的修改,同时对实例中运行的会话也有作用
issys_modifiable的三个类型在修改实例时起作用
FALSE不能对实例修改这个参数
IMMEDIATE对实例可进行修改并对实例生效,并且对实例中所有的会话立即生效
DEFERRED对实例可进行修改并对实例生效,实例中已运行的会话没有作用只对实例中后来启动的会话生效
DEFERRED类型的参数在对实例修改时必须带上DEFERRED选项
关于参数修改的情况被分别记录在各个PARAMETER视图中的ismodified字段或isspecified字段中
九)一个修改例子
参数一般的是IMMEDIATE和FALSE
老师用oracle sql developer查了一下
连接以后执行
select name,value,ISSYS_MODIFIABLE from v$parameter;
查询结果:
SQL> select name,value,ISSYS_MODIFIABLE from v$parameter;
NAME VALUE ISSYS_MOD
----------------------------------- ---------------------------------------- ---------
tracefile_identifier FALSE
lock_name_space FALSE
processes 150 FALSE
sessions 170 FALSE
sga_max_size 285212672 FALSE
pre_page_sga FALSE FALSE
lock_sga FALSE FALSE
shared_pool_size 0 IMMEDIATE
large_pool_size 0 IMMEDIATE
java_pool_size 0 IMMEDIATE
streams_pool_size 0 IMMEDIATE
sga_target 285212672 IMMEDIATE
transactions 187 FALSE
transactions_per_rollback_segment 5 FALSE
instance_name jiagulun FALSE
service_names jiagulun IMMEDIATE
db_name jiagulun FALSE
db_unique_name jiagulun FALSE
asm_power_limit 1 IMMEDIATE
sqltune_category DEFAULT IMMEDIATE
258 rows selected.
内容较多这里只选了部分本课可能用到的列出来
如:
tracefile_identifier FALSE
它的ISSYS_MODIFIABLE为FALSE
表示可以修改
但是修改完了以后需要实例重启生效
比如有一个比较经典的参数
sga_max_size 285212672 FALSE
sga_max_size参数当前大小是285212672
然后参数的ISSYS_MODIFIABLE是FALSE
false表示什么意思我们修改一下试试
原来的值是285212672,约285兆
也可以这样查询当前的值是:
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 272M
假设修改的大一些
alter system set sga_max_size=2285000000 scope=both;
2285000000是3位K,3位M,修改结果是2个多G
我们来看静态参数文件动态参数文件里面有什么特点
我们使用动态参数文件的时候
我们的参数有几个地方有
在spfile里有参数
在内存里面也有参数
我们修改参数的时候可以用这个命令来修改
ALTER SYSTEM SET parameter_name=parameter_value [comment=‘注释’] scope=[memory|spfile|both] [sid=‘sid’|’*’]
ALTER SYSTEM SET 参数 等于 新的值
scope=memory表示只是修改内存的
是设在内存马上生效
因为只是修改内存的
下次数据库重启的时候参数就没了,又恢复原来了
scope=spfile表示只是修改参数文件
没有立即生效,下次重启生效
那么both表示spfile和memory全部修改
修改参数默认是both
我们修改sga_max_size使用scope=both
命令:
alter system set sga_max_size=2285000000 scope=both;
执行结果
SQL> alter system set sga_max_size=2285000000 scope=both;
alter system set sga_max_size=2285000000 scope=both
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
报错了这个参数不能修改
我们查的这个参数的ISSYS_MODIFIABLE为FALSE
这时scope不能使用both
是FALSE意思是
你修改的时候只能是scope等于spfile
只能使用spfile
也就是ISSYS_MODIFIABLE为FALSE
可以修改但只能spfile
这样命令就是:
alter system set sga_max_size=2285000000 scope=spfile;
这时候可以修改了
执行结果:
SQL> alter system set sga_max_size=2285000000 scope=spfile;
System altered.
已经被修改成功了
这时马上再看一下这个参数的值
SQL> select name,value,ISSYS_MODIFIABLE from v$parameter where name='sga_max_size';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
ISSYS_MOD
---------
sga_max_size
285212672
FALSE
或者
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 272M
仍是原来的值
退出数据库前此参数的值并没有改变
然后我们再重启数据库
我们先把静态的参数文件删了
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat initdw.ora initjiagulun.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
[oracle@redhat4 dbs]$ rm -f initjiagulun.ora
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat initdw.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
好删了,然后只有一个动态的
因为在动态参数文件启动不起来数据库时会自动去使用静态参数文件,
这里把静态参数文件删了,是为了动态参数文件无法启动时直接让它报错
下面把数据库关了
使用shutdown abort;关的快一些
SQL> shutdown abort;
ORACLE instance shut down.
这里用了一个比较粗暴的关闭的方式
退出sqlplus然后再连上来
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@redhat4 dbs]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jan 7 10:04:19 2018
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
然后我们去启动
SQL> startup
ORACLE instance started.
Total System Global Area 2298478592 bytes
Fixed Size 1220676 bytes
Variable Size 2147487676 bytes
Database Buffers 134217728 bytes
Redo Buffers 15552512 bytes
Database mounted.
Database opened.
查看一下这个参数的值
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 2192M
现在是两个G,就是修改后的值
表示参数修改成功
再核实一下:
SQL> select name,value,ISSYS_MODIFIABLE from v$parameter where name='sga_max_size';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
ISSYS_MOD
---------
sga_max_size
2298478592
FALSE
修改成功了!
十)一个修改参数造成实例无法启动的排错例子
1)造成的错误
老师又实验修改了三个参数
alter system set sga_max_size=8285000000 scope = spfile;
alter system set sga_target=8285000000 scope = spfile;
alter system set pre_page_sga=true scope = spfile;
整个实验过程要多次修改这些参数,使用这个参数的不同值
所以每次修改前如果允许可以把这些参数重置一下,就是先恢复它们的默认值
重置一个参数可以使用reset命令
语法是:alter system reset 参数名 scope = spfile sid=’*’;
这个命令执行后在spfile文件中的这个参数的定义会被删除
重启实例前内存中此参数的值没有影响
这里的scope只能等于spfile,使用memory和both是不允许的
选项sid必须有,用来指定要在哪些实例中重置这个参数
可以指定一个实例的名如我们用的jiagulun
也可以对所有实例起作用就用*表示所有实例
因为环境问题
修改参数后没有重启成功
模拟了一下后数据库启不启来了
我的实验环境是虚拟机
内存比较小总共只给了1个G
上面的参数数据大了也无法实现
执行了上面的三个命令后
重启数据库时
SQL> startup
ORA-27102: out of memory
所以恢复原系统后自己重新改了一下大小
alter system set sga_max_size=385000000 scope = spfile;
alter system set sga_target=385000000 scope = spfile;
alter system set pre_page_sga=true scope = spfile;
再看一下385M是否可以启动数据库,我的环境是可以启动起来的
我的环境如果这么改
alter system set sga_max_size=2050000000 scope = spfile;
alter system set sga_target=2050000000 scope = spfile;
alter system set pre_page_sga=true scope = spfile;
是2G时,启动困难
执行startup一直在等待
半天都没完全启动
SQL> startup;
ORACLE instance started.
Total System Global Area 2063597568 bytes
Fixed Size 1220336 bytes
Variable Size 469762320 bytes
Database Buffers 1577058304 bytes
Redo Buffers 15556608 bytes
Database mounted.
ORA-01092: ORACLE instance terminated. Disconnection forced
我把它强行终止了
实验环境中内存1G确实太小
尽管参数数值改小了,
但实际需要的内存相对还是太大
重启数据库还是启动不起来了
这三个参数分别是什么意思呢
前面两个参数sga_max_size、 sga_target
sga_target表示将oralce的SGA设成8个G
你即使把这两个参数都设成8个G
oracle启动的时候,在startup的时候
你发现它也是分配了8个G
但是你用icps看一下
实际并没有分配8个G
也就是它是预留8个G
但是实际上它再根据需要再去扩
并没有实际分
如果你把
pre_page_sga这个参数设成true的话
你设了8个G
oracle启动的时候
它就会在内存空间里面划出8个G来
所以说如果把这个参数pre_page_sga设成true的话
oracle的启动会慢很多
因为它要划8个G出来
因为实验环境里面我们的内存没有8个G
所以说在启动的时候会时间很长
你用ipcs看一下
它会分很多内存出来
这时候
如果说物理内存不够的话它会去用swap
结果改了这三个参数以后
数据库启不来了
2)改错的方法
这时有个矛盾
这时候有个小矛盾
小矛盾就可能带来一些问题
我们把spfile的参数改错了
改错了以后这时候spfile就打不开了
打不开的话我们又不能改
我们知道不能用vi直接改这个文件
这就矛盾了
参数错了打不开
打不开又改不了
也就是这个参数文件用不了了
这时候oracle留了个这么个地方
有个命令就是刚才那个生成命令
针对这种情况我们的办法是
[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
这里面有个spfile文件spfilejiagulun.ora
这个文件被我们用alter system改坏了
数据库启不来了
启不来以后就打不开
打不开以后就不能改
也就是说目前为止这个文件不能用了
针对这种情况我们可以这样
[oracle@redhat4 dbs]$ sqlplus / as sysdba
连上来以后我们执行这个命令
SQL> create pfile from spfile;
File created.
然后退出
SQL> exit
Disconnected
[oracle@redhat4 ~]$
看dbs文件夹
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat initdw.ora initjiagulun.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
生成了
initjiagulun.ora
这个文件
这时这个文件的内容和spfile是一样的
并且这个pfile文件是可以手动修改的
用vi编辑一下这个文件
[oracle@redhat4 dbs]$ vi initjiagulun.ora
文件内容:
jiagulun.__db_cache_size=260046848
jiagulun.__java_pool_size=4194304
jiagulun.__large_pool_size=4194304
jiagulun.__shared_pool_size=109051904
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
*.pre_page_sga=TRUE
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_max_size=8285000000
*.sga_target=8285000000
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/jiagulun/udump'
vi打开文件以后
找到刚才修改的那三个参数
文件中
*.pre_page_sga=TRUE
把它改成false
*.pre_page_sga=false
把这些参数
*.sga_max_size=8285000000
*.sga_target=8285000000
去一位是828500000
8百多兆了
都改成228500000
2百多兆
好把这个参数改回去
*.sga_max_size=228500000
*.sga_target=228500000
然后vi执行:x保存并退出
然后我再连上来
[oracle@redhat4 ~]$ sqlplus / as sysdba
执行
SQL> create spfile from pfile;
File created.
这时候实际生成了一个spfile
这个spfile已经和pfile的内容一样了
pfile中参数已经改过来了
并使用这个改过的pfile生成了一个新的spfile文件spfilejiagulun.ora
这个时候就可以启了
SQL> startup
ORACLE instance started.
Total System Global Area 230686720 bytes
Fixed Size 1218700 bytes
Variable Size 75499380 bytes
Database Buffers 146800640 bytes
Redo Buffers 7168000 bytes
Database mounted.
Database opened.
如果说我们手工地用alter system不小心把spfile改坏了的话
数据库启不来的时候
我们可以用刚才那个办法解决一下
数据库启来了,启来了就没问题了
刚才给大家讲了一个常见的错误解决流程
特点是
spfile没有打开的时候我们可以create一下
spfile即使没有打开也可以create
这是讲的这些知识
十一)oracle的关闭方式
我们再来看一下还有oracle的关闭方式这个知识点
实验环境先重新登录一下
这时数据库在打开状态
Oracle关闭四种方式
有四个选项可以选择
默认是normal
1、abort
模拟突然掉电
内存被清空、内存中的数据没有写入数据文件
事务被立即中断
没有提交、没有回滚
2、immediate
强制中断当前正在运行的所有事务,回滚这些事务
回滚完毕,强制中断所有的连接
将实例中的所有数据写入数据文件
3、transactional
等待正在运行的事务,一直到他们提交或者回滚
所有事务主动结束以后(提交或者回滚),强行中断连接
将实例里面的数据写入数据文件
清空缓存
如果有事务一直没有提交或者回滚,实例无法关闭
4、normal
等待事务的主动提交或者回滚
等待用户主动断开连接
如果有一个用户没有断开连接,那么数据库无法关闭
1)normal
第一种方式是默认方式
数据库关闭的时候执行shutdown
shutdown默认就是normal这个参数
shutdown normal一般我们不用
对数据库来讲关闭的时候会有各种情况
oracle的实例和数据库
在关闭的时候实例会存在很多的会话在链上来
在关闭期间关闭的时候
第一有会话连上来
第二有的会话还有未提交的事务
有很多的情况
shutdown normal是
第一、等待事务的主动提交或者回滚
shutdown normal会等待所有的会话的事务主动的提交或回滚
主动是指连接的这个人主动的提交或者回滚
第二、等待用户主动断开
数据库它不但等待这些会话主动的提交或回滚
还等待会话主动的断开
断开是用户在客户端把这个连接给它断了
也就是这是最干净的一种连接方式、一种关闭方式
第一它会等待这个会话提交或回滚
第二它会等待这个会话主动断开
在断开连接前,已运行连接中是可以开始新的事务的
但不允许建立新的连接
在这个前提下它再关闭
在关闭的时候
它会将buffercache里面所有的脏缓冲区写到磁盘上,然后关闭
这种关闭方式最干净对客户端的影响最小
但它有个问题
如果用户没有主动断开
这个shutdown一直在那里停着
也就是关闭不了
所以说shutdown如果正常
shutdown回车以后基本上就关不了
因为只要有一个连接在这里连着
即使空连接在这里连着你也关不了数据库
这个关闭方式很不好
一般你很难关,关不了
2)transactional
针对这个问题
还有第二个
shutdown transactional
就是shutdown这个命令后面加上transactional
这种方式不能新建事务
它等待正在运行的事务结束
然后强行中断
shutdown normal是