oracle连接异常sharedmemoryrealmdoesnotexist
1. 先描述⼀个连接Oracle 10g的错误:“shared memory realm does not exist”
如图所⽰Sqlplus连接时出现这个错误;
2. Oracle 服务器主要组件分析
下图所⽰为Oracle服务器主要组件:
如上图所⽰:Oracle服务器的组件结构,Oracle服务器可以看做由两部分组成:Oracle实例
和Oracle数据库,上图被加粗直线分为两个部分,直线上半部分表⽰Oracle实例,⽽直线之下表
⽰Oracle数据库。如Oracle Start Up 1中所说,Oracle数据库在物理上可以看做是由不同⽂件组
成的⽂件系统,从逻辑上可以看做是⼀个由TableSpace、Segment、Extent、Blocks组成的四
维结构;
关于Oracle实例:
是访问Oracle数据库的⼀种⽅法,⼀个Oracle实例只可以打开⼀个Oracle数据库;
由内存和后台进程组成;
存在于内存中,⼀个数据库对应⼀个共享的内存区,共享的内存区被Oracle后台进程所共
享;
建⽴与客户端的连接(连接到Oracle服务器实质上与Oracle服务器的Oracle实例建⽴连接)
从以下⼏个⽅⾯分解上图:
(1)Oracle两⼤进程
⽤户进程:
在客户机内存上运⾏的程序,⽤来访问Oracle数据库;
与数据库实例建⽴连接,不能直接与数据库直接连接;
如在客户机上运⾏的 SQL PLUS,企业管理器;
⽤户进程向服务进程提出操作请求;
服务器进程:
⼀个直接与数据库服务器对话的进程;
响应⽤户进程提出的操作请求,并返回结果;
(2) Oracle的主要内存结构包括两个部分
程序全局区Program Global Area (PGA): 当服务器进程启动的时候分配。
每个⽤户连接到Oracle数据库的内存区域;
当进程建⽴的时候单独分配;
当进程终⽌的时候释放;
只能⽤于⼀个进程,是私有的,不能够共享
系统全局区System Global Area (SGA): 在实例启动的时候分配, 是数据库实例的基本组成部分,
从结构框架图中分离出SGA部分如下图:
SGA包括⼏个内存结构:
共享池(Shared Pool)
数据库缓冲区快速缓存(Database Buffer Cache)
重做⽇志缓冲区(Redo Log Buffer )
⼤池(Large Pool)
Java池(Java Pool)
其它结构 (锁(lock)、锁存管理(latch)、统计数据(statistical data)) SGA⼏个特性:
动态分配
由SGA_MAX_SIZE确定⼤⼩
有时称为共享全局区域(Shared Global Area)
在SGA内以内存颗粒( granules )进⾏分配
SGA各内存部分功能键下表:
Library Cache 库快速缓冲区
存储最近使⽤的SQL和pl/sql语句的信息
共享最近使⽤过的SQL语句
通过“最近最少使⽤”( least recently used (LRU) )算法来管理包括两种结构:共享SQL区和共享PL/SQL区
⼤⼩由共享池(Shared Pool)的⼤⼩确定
Data Dictionary Cache 数据字典缓冲区
数据库中最近使⽤过的定义的⼀个集合
包括数据库⽂件、表、索引、列、⽤户、权限、和其它对象的信息
在解析阶段,服务器进程寻数据字典信息来解析对象的名字和访问权限把数据字典的信息加载到内存⾥⾯,来提⾼查询和DML(Data Manipulation Language)数据操纵语⾔语句的反应时间
⼤⼩由共享池(Shared Pool)的⼤⼩确定
Database Buffer Cache 数据库缓冲区快速缓存
存储从数据⽂件提取出来的数据块的⼀个拷贝
当提取数据或者修改数据的时候,能很⼤的提⾼性能通过LRU(Least Recently Used )算法来管理
DB_BLOCK_SIZE决定了主数据块的⼤⼩
Redo Log Buffer 重做⽇志缓冲区
记录了对数据块的所有改变
主要的⽬的是为了恢复数据库
改变被记录在成为重做⽬录的对象⾥⾯(redo entries)重做⽬录(Redo entries)包含重建或者重做改变的信息⼤⼩通过LOG_BUFFER来定义
Java Pool Java池
⽤于解析java命令
在安装和使⽤java的时候需要使⽤⼤⼩确定:JAVA_POOL_SIZE
Large Pool ⼤池
SGA中可选的⼀块内存区域
减少了共享池(Shared Pool)的负担
(3)Oracle实例的后台进程
感觉挺复杂,将在以后做专门说明;
3.Oracle数据库的启动
要启动和关闭数据库,必须要以具有Oracle 管理员权限的⽤户登陆,通常也就是以具有SYSDBA权限的⽤户登陆
启动⼀个数据库需要三个步骤:
(1)、创建⼀个Oracle实例(⾮安装阶段)
(2)、由实例安装数据库(安装阶段)
(3)、打开数据库(打开阶段)
下⾯从实验的⾓度来实践这三个阶段:
Step one:以具有Oracle 管理员权限的⽤户登陆
sqlplus命令
Java代码
1. sqlplus /nolog
2. conn USER/PASSWORD as sysdba
Java代码
1. sqlplus /nolog
2. conn USER/PASSWORD as sysdba
截图:
Step two:创建⼀个Oracle实例(⾮安装阶段)
sqlplus命令
Java代码
1. startup nomount
Java代码
1. startup nomount
截图:
如上所⽰:NONOUNT选项仅仅创建⼀个Oracle实例。读取a初始化参数⽂件、启动后台进程、初始化系统全局区(SGA)。a⽂件定义了实例的配置,包括内存结构的⼤⼩和启动后台进程的数量和类型等。当实例打开后,系统将显⽰⼀个SGA内存结构和⼤⼩的列表,如上截图所⽰
Step three:由实例安装数据库(安装阶段)
命令:
Java代码
1. alter database mount;
Java代码
1. alter database mount;
截图:
该命令创建实例并且安装数据库,但没有打开数据库。Oracle系统读取控制⽂件中关于数据⽂件和重作⽇志⽂件的内容,但并不打开该⽂件。
Step four:打开数据库(打开阶段)
命令:
alter database open;
截图:
该命令完成创建实例、安装实例和打开数据库的所有三个步骤。此时数据库使数据⽂件和重
作⽇志⽂件在线,通常还会请求⼀个或者是多个回滚段。这时系统除了可以看到前⾯Startup Mount⽅式下的所有提⽰外,还会给出⼀个"数据库已经打开"的提⽰。此时,数据库系统处于正常⼯作状态,可以接受⽤户请求。
Note that:
当然可以⽤⽤⼀条命令打开
Java代码
1. startup
Java代码
1. startup
给出截图:
上图中红⾊线分开的三部分表⽰三个启动阶段
4,解决⼀个问题
本⽂⼀开始提出问题,这⾥做⼀解决,为什么会出现那个问题了是因为Oracle数据库没有被启动,解决的⽅法就是如上⾯3所⽰操作打开数据库;
上述问题表现最直接的⼀个现象:查看任务管理器下所占内存,当所占内存为⼏⼗兆说明Oracle数据库没有启动,正常所占内存如下:
现在还原错误:关闭数据库后连接数据库,查看所占内存
查看内存:
与正常启动时相差⽐价⼤,所以总结⼀下解决“shared memory realm does not exist”⽅法:(1)任务管理器中查看所占内存,当所占内存仅为⼏⼗兆,说明问题是数据库没有启动
(2)启动Oracle数据库,管理员登录,启动
Java代码
oracle10g程序异常终止
1. sqlplus /nolog
2. conn USER/PASSWORD as sysdba
3. startup
Java代码
1. sqlplus /nolog
2. conn USER/PASSWORD as sysdba
3. startup
PS: shared memory realm does not exist 这个错误我⽤了好长时间都没有解决主要原因是对数据库太陌⽣。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论