欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle参数文件及数据库的启动和关闭详解

程序员文章站 2022-05-03 19:35:50
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可以打开了可以看了

控制文件在

/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是