大家好,再学习oracle中有个问题请教一下。。
1。如果在sqlplus中shutdown immediate 一个数据库,在相应的系统进程(oracle.exe)怎么还是存在,而且有内存使用从原来的几百兆变为几十兆,那么这几十兆谁在使用(应该已经不是sga,数据库已经关闭,实例已经关闭,内存应该都收回了) ?
2。shutdown immediate 数据库成功后,会提示数据库已经关闭,已经卸载数据库,oracle例程已经关闭。在我看来服务中的相关服务(oracleserverorcl服务)应该是关闭,但是没有关闭,为什么?他们之间应该是有关联的.
目前我做了如下操作:
1.sqlplus 中shutdown immediate
2.关闭服务中的oracleserverorcl
3.开启oralceserverorcl
4 sqlplus 中可以连接到orcl数据库
以上得出的结论是如果开启服务,那么orcl数据库会被打开.那么为什么我sqlplus中shutdown 数据库,服务不会关闭呢?也就是说如果我shudown数据库在sqlplus,再做什么操作才会使服务自己变为关闭呢????不知道大家有没有明白我的疑问哈.
thanks everybody~

解决方案 »

  1.   

    http://blog.csdn.net/wh62592855/archive/2009/11/21/4846474.aspx在使用命令启动数据库的时候,可以利用不同的选项让数据库启动在不同的状态中。如通常情况下利用命令来启动数据库,带上不同的选项,可以让数据库只启动例程(带上Nomount选项)、挂载数据库而不打开数据库(采用mount选贤)、打开数据库(采用open选项)或者以受限模式(带上restrict选项)打开数据库系统。有时候以某种特定的方式来打开数据库系统对于数据库管理员维护数据库是非常重要的。如数据库管理员需要将某个数据库文件移动到新的硬盘上以减少硬盘的I/Q冲突或者需要将数据库从非归档模式转换到归档模式的时候,就需要将数据库启动到挂载模式。即打开控制文件而没有打开数据文件。此时可以更改控制文件中的内容(控制文件已经打开);也可以移动数据文件(数据文件在挂载模式下还没有打开。只有在这个模式下才能够完成对数据文件的更名、移动等操作。而且利用命令还可以在不同的模式下进行转换。如现在处于数据库挂载模式,则可以利用alter database open命令将数据库转换为打开模式。这些功能通过Oracle服务都是无法完成的。 而通过服务来控制数据库的启动与关闭,就不能够做到这么精细的控制。一般情况下,只有监听程序服务、数据库例程服务和数据库企业管理器服务三个服务同时打开的情况下,对应的数据库才处于启动状态。或者说,只有数据库企业管理器服务启动时数据库才处于打开状态。因为只有有监听程序服务、数据库例程服务这两个服务启动后,才可以启动企业管理器服务。所以一般情况下,企业管理器服务启动了,就表示这三个服务已经同时启动。如果有一个服务还处于关闭的状态,那么数据库就是处于关闭状态。 可见通过命令与通过服务来管理数据库的启动与关闭存在很多的差异。一般情况下笔者建议大家还是通过命令来维护数据库的启动与关闭操作为好。不过通过服务,也可以起到一些命令无法实现的功能。如现在数据库管理员不希望数据库随着操作系统的启动而自动启动,此时就可以通过更改对应服务启动类型来实现。如可以将上面的服务的启动类型设置为“手工”启动。此时当操作系统启动时,就不会自动启动数据库系统。不过这主要用于一些测试服务器或者培训服务器上。对于在企业生产环境中使用的数据库服务器,往往要将这个服务设置为自动启动。即让操作系统启动时自动启动数据库服务,以减少数据库管理员的工作量。所以说,虽然通过服务来管理数据库的启动与关闭进程,属于粗放型的管理。但是有时候数据库管理员确实也离不开它。 最后需要提醒的一点是,在Windows操作系统中,默认情况下数据库系统是会随着操作系统的启动而自动启动的。而在Linux等到作系统平台上,由于没有这种服务的管理机制,所以在Linux操作系统部署Oracle数据库系统的时候,默认情况下是不会随着操作系统的启动而启动的。如果数据库管理员需要让其随着操作系统启动而自动启动,就需要在启动列表中加入相关的指令才行。这是在两个不同操作系统上部署Oracle数据库的一个很明显的区别。 详细内容可以参考下面的连接
      

  2.   

    windows上的吧。
    说穿了,windows 上的服务
    其实只是一个和数据库的接口而已。
    数据库本身并不依靠它。
    你在oracle中 如果shutdown immediate 成功了,
    在数据库日志中就有数据库已经关闭了。
    而此时oracleserverorcl 这个服务仍然开启,
    它这个服务只是操作系统的,而不是数据库的哈。
      

  3.   

    呵呵 我这不是要发挥楼主充分的想象力嘛 
    授人以鱼不如授人以鱼就像楼上csucxcc说的
    服务在WINDOWS里就像一个和数据库的接口一样 一扇门
    打开了服务(打开了走向ORACLE的大门)--才能进一步去打开数据库
    关闭数据库--可服务并没有关闭(大门没关,也没关系呀)  
    OK?
      

  4.   

    谢谢各位的回答。
    看了个各位的回复,如果单纯的理解为接口(大门)好像不是很妥当.
    打开了服务(打开了走向ORACLE的大门)--才能进一步去打开数据库 
    关闭数据库--可服务并没有关闭(大门没关,也没关系呀)  

    如果按照上面的说法:正确开启数据库的步骤应该是:打开服务->sqlplus下startup open.但是如果你开机打开服务数据库就开启了,也就是说oracle服务不是单纯的接口.
      

  5.   

    windows 上的服务是什么概念?
    就是和别的程序有一个接口啊,你打开这个服务,就可以通过接口把数据库打开。
    你关闭这个服务,就可以通过接口把数据库关闭。
    你不通过这个接口,而通过sqlplus这个接口,数据库也可以被你关闭。
    明白否?
      

  6.   

    不理解csucxcc说的 :它这个服务是操作系统的.这句话,让人感觉不安装oracle有会有这个服务一样(是操作系统自带的).
    在你建立一个数据库的时候如果你的数据库名为test,就会有oracleservertest这个服务生成.那个这个服务应该跟你数据库有这密切的关系.但是它又不能单纯的理解为接口..
    你可以双击这个服务其实他是运行了:e:\oracle\product\10.2.0\db_1\bin\ORACLE.EXE test
    到底它运行了什么?是开启数据库么(目前看是)?那为什么sqlplus关闭数据库时候,他还在开启,那么还有什么遗留呢?它俩到底有什么内在联系呢?
    还有进程中的oracleserver所占的内存到底是谁呢(就是shutdown后的内存使用)?
      

  7.   

    呵呵,LZ 钻研精神值得佩服。
    感觉 LINUX。unix都没有这么费事哈。
    除非定制,一般 oracle 不需要作为操作系统的一个服务让人启动。
    :e:\oracle\product\10.2.0\db_1\bin\ORACLE.EXE test 
    到底它运行了什么?是开启数据库么(目前看是)?那为什么sqlplus关闭数据库时候,他还在开启,那么还有什么遗留呢?它俩到底有什么内在联系呢?

    windows 里面这个 oracle.exe里面 是一个进程表示的,不象linux 可以区分的那么细,开启的每个阶段都有不同的进程。
    ps -ef |grep ora 就可以查看所有的相关进程,
    ps -ef |grep ora_ 就可以查看相关的后台进程。
    那这个 windows oracle.exe里面除了 有维护sga的后台进程之外还有些什么呢?
    抛砖引玉一下,呵呵~~
      

  8.   

    印象中好像在什么地方看到过查看ORACLE.EXE这个进程中具体内容的 像LINUX那样
    可惜忘了……
      

  9.   

    SQL> Select vb.name NAME, vp.program PROCESSNAME, vp.spid THREADID,sid SID
      2  From v$session vs, v$process vp, v$bgprocess vb
      3  Where vb.paddr <> '00' and
      4  vb.paddr = vp.addr and
      5  vp.addr = vs.paddr;NAME  PROCESSNAME          THREADID            SID
    ----- -------------------- ------------ ----------
    PMON  ORACLE.EXE (PMON)    3772                170
    PSP0  ORACLE.EXE (PSP0)    3232                169
    MMAN  ORACLE.EXE (MMAN)    2276                168
    DBW0  ORACLE.EXE (DBW0)    2400                167
    LGWR  ORACLE.EXE (LGWR)    2380                166
    CKPT  ORACLE.EXE (CKPT)    1664                165
    SMON  ORACLE.EXE (SMON)    3332                164
    RECO  ORACLE.EXE (RECO)    2052                163
    CJQ0  ORACLE.EXE (CJQ0)    3088                162
    MMON  ORACLE.EXE (MMON)    320                 161
    MMNL  ORACLE.EXE (MMNL)    3204                160NAME  PROCESSNAME          THREADID            SID
    ----- -------------------- ------------ ----------
    RVWR  ORACLE.EXE (RVWR)    3012                157
    ARC0  ORACLE.EXE (ARC0)    2348                155
    ARC1  ORACLE.EXE (ARC1)    3792                154
    ARC2  ORACLE.EXE (J000)    2084                153
    CTWR  ORACLE.EXE (CTWR)    3288                151
    QMNC  ORACLE.EXE (QMNC)    3844                14717 rows selected.
      

  10.   

    不过这里好像并没有查询出ORACLE.EXE里的全部内容
    我通过一个工具pslist查看ORACLE.EXE中的内容时比上面查询的结果多
    大家看下有没有其他什么方法可以查出ORACLE.EXE里所有内容
    D:\Program Files\PsTools>pslist -d oraclepslist v1.28 - Sysinternals PsList
    Copyright ? 2000-2004 Mark Russinovich
    SysinternalsThread detail for HWANG:
    oracle 4004:
     Tid Pri    Cswtch            State     User Time   Kernel Time   Elapsed Time
     368   9       551   Wait:Executive  0:00:00.010   0:00:00.140    3:01:28.486
    3612   8       169     Wait:UserReq  0:00:00.000   0:00:00.030    3:01:21.747
    4084   9        11     Wait:UserReq  0:00:00.000   0:00:00.000    3:01:21.657
    3772   8      4237     Wait:UserReq  0:00:00.210   0:00:00.100    3:01:14.667
    3232   8      4852     Wait:UserReq  0:00:00.090   0:00:00.100    3:01:14.466
    2276   8      4304     Wait:UserReq  0:00:00.150   0:00:00.030    3:01:14.456
    2400   8      7612     Wait:UserReq  0:00:00.280   0:00:00.260    3:01:13.925
    2380   8      7603     Wait:UserReq  0:00:00.180   0:00:00.220    3:01:13.895
    1664   9     14257     Wait:UserReq  0:00:00.430   0:00:00.290    3:01:13.845
    3332   8      5474     Wait:UserReq  0:00:01.562   0:00:00.330    3:01:13.655
    2052   8        67     Wait:UserReq  0:00:00.020   0:00:00.010    3:01:13.645
    3088   9      4031     Wait:UserReq  0:00:02.243   0:00:00.140    3:01:13.625
     320   8      7607     Wait:UserReq  0:00:02.123   0:00:00.300    3:01:13.615
    3204   8     11915     Wait:UserReq  0:00:00.991   0:00:00.140    3:01:13.605
    2772   8       299     Wait:UserReq  0:00:00.020   0:00:00.010    3:01:13.575
    3968   8       419     Wait:UserReq  0:00:00.000   0:00:00.020    3:01:13.505
    3012   8      4894     Wait:UserReq  0:00:00.070   0:00:00.060    3:01:03.961
    2348   8       836     Wait:UserReq  0:00:00.030   0:00:00.110    3:00:55.399
    3792   8      3533     Wait:UserReq  0:00:00.090   0:00:00.550    3:00:55.389
    3288   8      8117     Wait:UserReq  0:00:00.160   0:00:00.090    3:00:53.686
    3844   9      1050     Wait:UserReq  0:00:00.020   0:00:00.020    3:00:40.497
    2952   8       736     Wait:UserReq  0:00:00.020   0:00:00.000    3:00:30.273
     544   8       635     Wait:UserReq  0:00:00.410   0:00:00.060    3:00:30.233
    2840   8       164     Wait:UserReq  0:00:00.050   0:00:00.000    0:17:41.155
    1892   8        57     Wait:UserReq  0:00:00.010   0:00:00.020    0:00:19.217
      

  11.   

    谢谢大家的回答.
    从这几个表好像看不出来什么问题.除非我们在shutdown的模式下还能执行这些语句可以看出还有什么线程存在.
    还有我做了几个例子:
    1 shutdown immediate
    2 提示数据库已经关闭,已经卸载数据库,还有最后一句不是很理解:oracle 例程已经关闭.这里的例程是不是指instance,如果是,为什么我执行conn sysadm/caoyang as sysdba 还是能连接上一个空闲的实例.这个实例是什么?
    问题就在于shutdown关闭后,这个实例占用内存资源..,那么这个实例哪来的?换句话说shutdown 在sqlpus中不是最彻底关闭数据库系统..
      

  12.   

    从资料上看,sga是由share pool,steams pool,large pool,java pool,database buffer,redo log buffer.这么多.
    我是这么理解的
    当关闭数据库的时候没有把这些所有的内存区域收回来.从理解上看,只有database buffer,redo log buffer会通过两个写线程和文件打交到,所以这两个在shutdown的时候肯定会收回来.
    如果在shutdown后我还能连接一个空的实例,那是不是就说其他的内存都没有收回来呢?
    也就是说shutdown 只是实例中的部分内存,以保证shutdown后你不能对数据库文件进行操作.
    如果你像彻底关闭,只有关闭服务.也就是停止所有oracleserver中包含的所有的线程,这样的话就可以彻底释放内存了.我不知道理解对不对,有没有人有其他想法
      

  13.   

    会不会是令一块内存区域存在:PGA??
      

  14.   

    1、楼主说的oracle.exe只是一个windows的系统服务,没有他oracle是不能使用的,如果想使用oracle必须保证这个服务是开启状态。2、同时windows下面安装的oracle,默认情况下启动楼主所说的系统服务后 实例会随之启动3、如果楼主想像linux下一样使用oracle,可以把 那个服务设置成为自动启动,然后根据下面网址的回答设置一下数据库。(注意 是把 选项 消除掉
    http://zhidao.baidu.com/question/113949114.html
      

  15.   

    1
    这里的例程就是INSTANCE
    2
    空闲的实例意思就是说当前实例并没有与某个打开的数据库相关联起来
    因为实例只是一块内存和一些进程而已