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 programsPATH=$PATH:$HOME/binexport PATH
unset USERNAMEexport 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 sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on Fri Jan 5 10:49:12 2018Copyright (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 sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on Sat Jan 6 08:00:20 2018Copyright (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                                                NUMBERNAME                                               VARCHAR2(80)TYPE                                               NUMBERVALUE                                              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 programsPATH=$PATH:$HOME/binexport PATH
unset USERNAMEexport 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                                        DEFERRED7 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                                      FALSEsga_max_size                        285212672                                FALSE
pre_page_sga                        FALSE                                    FALSElock_sga                            FALSE                                    FALSE
shared_pool_size                    0                                        IMMEDIATE
large_pool_size                     0                                        IMMEDIATE
java_pool_size                      0                                        IMMEDIATE
streams_pool_size                   0                                        IMMEDIATEsga_target                          285212672                                IMMEDIATEtransactions                        187                                      FALSE
transactions_per_rollback_segment   5                                        FALSEinstance_name                       jiagulun                                 FALSE
service_names                       jiagulun                                 IMMEDIATEdb_name                             jiagulun                                 FALSE
db_unique_name                      jiagulun                                 FALSEasm_power_limit                     1                                        IMMEDIATE
sqltune_category                    DEFAULT                                  IMMEDIATE258 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_sizeNAME                                 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_sizeNAME                                 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 sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on Sun Jan 7 10:04:19 2018Copyright (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_sizeNAME                                 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是
用户主动提交和回滚以后
用户主动断开连接
数据库才能关

transactional是
用户只要提交了或者回滚了
这时候这个数据库
shutdown就会主动的把用户踢出去

记住shutdown transactional
把用户踢出去的一个前提是用户所进行的事务正常的结束了
或者提交了或者回滚了
这时候就把用户踢出去
都踢完以后然后再关闭

关闭的时候
也是将buffercache全部写到磁盘
然后再关闭

这时候比shutdown normal进了一步
也就是你只要是没有事务了就把你踢出去
normal是要等主动退出去

没有事务的连接被自动中断,有事务的连接等待用户的提交然后马上中断这个连接

3)immediate

还有一个我们用的最多
shutdown immediate

所有的会话不管你当前状态
它会将你所有的会话的事务强行给你回滚
然后把你踢出去

这时候对用户有影响

也就是比如用户做了一个事务,做了很长时间了
但它也会强行给你回滚

shutdown imediate
将所有会话的所有的事务强行回滚
然后把用户会话强行踢出去
然后进行关闭

但它有个好处
它也是把buffercache全部写过来
然后再关闭

也是干净的关闭
下次数据库启的时候不需要做实例恢复

只不过对用户有影响
用户被踢出去了

所以说我们看这三种关闭方式
immediate、transactional、normal

最温柔的是normal
其次是transaction
其次是immediate

这三种方式里面
我们通常用immediate

这三种方式都是干净的关闭方式
也就是数据库buffercache全部写过来
数据库下次启动的时候
都不需要做实例恢复

4)abort

还有一个shutdown abort这个关闭

这个关闭就是模拟的突然断电
他跟突然断电是一样的

这个时候
我们的buffercache没有写到磁盘上

下次数据库重启的时候
就需要做实例恢复
这是它最不好的地方

数据库实在不到万不得已
不要用abort
一般用immediate

这是数据库关闭方式
我们用immediate

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

这时候它会强行把用户的未提交事务给它回滚了
然后把用户踢出去
同时做干净的关闭

5)关闭方式小结

normal 等待用户中断连接,不能新建连接,已有连接中仍可建立新的事务
就是等待现有的所有用户主动地断开连接

transactional 不能新建连接,不能开始新事务
没有事务的连接会自动中断连接
有事务的连接等待用户结束已有事务这个连接被自动强行中断
所有的事务都结束就意味着所有连接都被中断,这时这个命令就会执行成功
就是等待现有的所有用户完成正在执行的事务

immediate 强行回滚所有事务,强行中断所有连接
就是对用户不做任何的等待,放弃了所有用户正在执行的事务

abort 模拟突然断电,对内存数据没执行任何的操作
这是不正常的关闭,损坏了用户的操作,重启需要实例恢复

这就是我们这节课讲的内容
内容比较多

2018年2月11日
文字:韵筝

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

  1. Oracle学习笔记:通过种子数据库设置dbid为指定值

    简介:dbms_backup_restore包真是太强大了.和设置dbid有关的存储过程如下: PROCEDURE nidbegin (newdbname   IN  varchar2,        ...

  2. oracle rac 环境配置文件,学习笔记:Oracle RAC spfile参数文件配置案例详解

    天萃荷净 rac中的spfile探讨,记录一下Oracle RAC搭建完成后关于spfile参数文件的配置案例,与更改RAC环境中参数文件的方法 今天朋友的的rac,因为被同事做数据库升级,分别在两个 ...

  3. oracle 权限问题9017,[数据库]oracle学习笔记(一)用户管理_星空网

    oracle学习笔记(一)用户管理 2014-04-13 0 1 --oracle学习第一天 2 --连接 @后面连接数据库实例,具体连接到那个数据库 3 conn scott/tiger@MYORA ...

  4. oracle数据库pfile文件,Oracle pfile/spfile参数文件详解

    Oracle pfile/spfile参数文件详解 在创建数据库时,SPFile文件中部分必须考虑的参数值: 基本规则 a.在SPFile文件中,所有参数都是可选的,也就是说只需要在初始化参数文件中列 ...

  5. oracle:oracle学习笔记(四)循环、光标、异常、瀑布模型

    oracle学习笔记:循环.光标.异常 文章目录 打印Hello World 定义基本变量 引用型变量(单行)` my_name emp.ename%type ` 记录型变量(多行) `emp_rec ...

  6. oracle学习笔记 Oracle体系结构概述

    oracle学习笔记 Oracle体系结构概述 从这节开始,开始讲oracle数据库体系结构. 首先从总体上,从概述上把oracle整体的体系结构讲一下, 然后接下来的时间我们会一块一块的将oracl ...

  7. Oracle学习笔记 字符集概述

    Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...

  8. oracle学习笔记 oracle软件安装准备工作 第一部分 环境准备

    oracle学习笔记   oracle软件安装准备工作  第一部分 环境准备 这节课对初学者来说内容较多,我把它分成了三篇. 即使这样也不可能把每个可能遇到的问题都说到,如果遇到没说到的问题自己上网搜 ...

  9. Oracle学习笔记---(一)

    Oracle学习笔记---(一) 一 1.Oracle简介     Oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库:是一个对象关系数据库管理系统(ORDBMS).它提供了关系数据库 ...

最新文章

  1. Thorntail 2.2.0提供从WildFly Swarm自动迁移的特性
  2. Linux命令删除某目录下的所有.svn文件
  3. tcp/udp高并发和高吐吞性能测试工具
  4. win10专业版虚拟机配置服务器,虚拟机专用专业版win10 账号密码
  5. Hibernate上传数据到数据库,从数据库读取数据到本地模板代码
  6. oracle open for using的用法,oracle OPEN FOR [USING] 语句
  7. linux内核与用户空间的九种通信机制
  8. 多数公司容易犯的5个大数据错误
  9. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(配置数据库监听_09)
  10. python报表_Python生成报表
  11. 一般用css设置中文字体的Unicode编码
  12. 人有钱了就显得素质高,也显得懂事了
  13. centos7安装最新稳定版nginx
  14. paip.java swt 乱码问题解决
  15. 大数据框架之Spark详解
  16. 4000字 Python 必读指南
  17. YUV/YIQ色彩空间的转换
  18. 【基于Python的Selenium2自动化测试】04 - 模拟126邮箱的登录
  19. python拼音数字输出接口_python: 拼音处理模块
  20. 自然》子刊同期刊发两篇重磅论文:月球上的水很多-1

热门文章

  1. 第65篇:探索顶级APT后门Sunburst的设计思路(Solarwinds供应链攻击中篇)
  2. 17 柯西中值定理、不定式极限
  3. 旅行社小程序怎么开发?
  4. cors 后端解决跨域问题
  5. 详细的GStreamer开发教程
  6. 学计算机选北京工业还是西南交通,本科生物医学工程专业排名,2020选择哪所大学好?...
  7. eclipse SVN中文件修改后图标不变黑星解决
  8. 测试步行速度什么软件可以,基于加速度信息的人体步行速度检测方法研究
  9. YOLOv7~ELAN
  10. SLAM知识点——P3P知识点