oracle故障怎么解决 oracle常见异常
Oracle Enterprise Manager常见问题及解决
Oracle Enterprise Manager常见问题及解决 Oracle Enterprise Manager(Oracle企业管理器 简称OEM)是通过一组Oracle程序 为管理分布式环境提供了管理服务 OEM包括了一组DBA工具 一个repository 以及一个图形化显示的控制台 OEM控制台与每一个服务器上的智能化代理(IntelligentAgent)相对应 智能化代理能够监控系统的特定事件并且执行任务(作业)就象你在系统本地一样 事件和作业的结果会被送回控制台 这样可以在一个地方管理所有的系统 OEM与Server Manager Motif相比 有以下优点 )从适用范围看 OEM可以同时监控管理多个系统上的多个数据库 因而特别适合分布式环境 而Server Manager只能监控管理一个数据库 )从管理对象看 OEM可以监控管理节点 数据库和监听进程(listener) 而Server Manager只能监控数据库 )从适用版本看 OEM可以同时监控管理Oracle x和 x 而从 版开始 Server Manager已不存在 本文主要介绍一些OEM的常见问题及其解决方法 Q OEM数据库工具组的功能是什么?? A OEM数据库工具组是一组使DBA能够通过GUI界面管理Oracle数据库的工具 包括以下工具 Data Manager(数据管理器) 这工具使你能够象加载数据一样执行数据的export/import Schema Manager 这工具使你能够在数据库中管理对象 可以用于创建 修改 和删除tables indexes views snapshots sequences等等 Security Manager(安全性管理器) 这工具使你能够管理用户 角色 权限及profiles StorageManager(存储管理器) 这工具允许你创建和修改表空间 数据文件和回滚段 InstanceManager(实例管理器) 这工具允许你关闭 启动实例并且存储和管理数据库参数 SQL*Worksheet 这工具使你能够运行或创造SQL脚本并且存储在硬盘上 你能使用这工具重现最后执行的语句 同时 检查显示到屏幕上的执行结果 BackupManager(备份管理器) 这工具允许你管理备份和恢复为Oracle 和Oracle 数据库 在Oracle 此工具支持EnterpriseBackupUtility(EBU) 在Oracle 此工具支持恢复管理器RecoveryManager SofareManager(软件管理器) 这允许你将远程软件安装到支持这一特性的远程服务器 Q 作业状态一直为提交 未变为预定(scheduled) A 作业在OEM控制台创建并且到被通过SQL*net送至智能化代理 一旦当智能化代理接受作业请求 会发送一个通知回到OEM控制台 状态变化到 预定 如果状态从未从提交变化到预定 那代理程序可能没有收到作业请求 确定代理程序是否已经启动 确定SQL*net和OEM是否已经适当配置 Q 作业状态一直为预定 未变为运行 A 当代理程序开始运行作业的时候 会发送一个通知回到OEM控制台 状态变化到 已发送 或 启动 如果作业状态一直为预定而无变化 那可能是代理程序不能打开一个socket回到OEM控制台 原因可能是TCP/IP问题或代理程序没有足够权限去派生一个进程来运行作业 在服务器端使用主机名来Ping控制台 以此确定TCP/IP不存在问题 确认运行作业的数据库用户具有dba connect resource权限 Q 运行作业出错 错误信息为 FailedtoAuthenticateUser A 在NT系统上 你必须把 Logonasabatchjob 权限授予登录用户 然后在OEM Preferred Credentials中设置此用户 如果代理程序是一个 x的代理程序 那这个用户必须是一个本地的NT用户 不能为一个DOMAIN用户 在Unix系统上 代理程序的权限应为 rwsr xr xrootdbadbsnmp s 权限意味着dbsnmp进程将用root用户的权限运行 当这权限设置以后 作业将由在OEM控制台的Preferred Credentials窗口中设置的用户运行 确认在OEM控制台的Preferred Credentials窗口中设置的用户在服务器上有合适的登录权利 Q 客户能创建自己定义的事件吗? A 在OEM x中 客户不能创建自己定义的事件 这将是OEM x的一个新特性 然而 你能创建一个运行TCL脚本的作业 能通过使用TCL命令orareportevent触发一个事件 有关orareportevent的进一步信息 请参阅OEM应用开发者手册 Q 在控制台上 数据库显示为红色的圆圈和斜线 表示数据库已关闭 然而 数据库是正在运行的 A 如果数据库 监听进程或节点显示为红色的圆圈和斜线 OEM控制台是在试图通知你服务已关闭 如果服务未关闭 你需要在事件窗口中单击 OutstandingEventstab 并将通知移动至历史记录 这应该从导航(navigator)和地图(map)窗口中清除关闭提示 Q 怎样创建OEMRepository? A OEMRepository是在Oracle 或Oracle 数据库中的一组表 这些表存储了通过OEM控制台图形化浏览的信息 在OEM x结构中 这些表存储在一个特定的用户下并且不能与另外的用户共享 在OEM x 应该用一个非 system 用户登录来运行脚本SMPCRE SQL 此用户必须有connect resource和dba权限 在OEM x 初次激活OEM控制台图标时将自动地创建Repository 如果已存在一个早期版本的repository 会提示更新表 如果没有OEM表 会提示创建表 Q 怎样自定义OEM工具栏? A 如果要设定OEM工具栏 应在工具栏上按右键 选择Customizetab 你能编辑工具栏项目的名字 删除项目 或添加项目 如果在Databasetab上单击 可以进入logoncredentials 为每数据库选择一个默认值输入项 Q 当登录至OEM控制台时 得到以下错误信息 VOC Failuretoobtaininterfacelogin A 原因是OEM通信后台进程不能打开一个与Repository的连接 确认TCP/IP配置正确 以及是否通信后台进程的缺省参数已被修改(使用DaemonManager) Q 当使用OEM控制台时 得到以下错误信息 VOC FailuresettingcredentialdetailsORA NotconnectedtoORACLE A 原因是OEMRepository所在数据库已关机 或是连接数据库的服务发生了网络故障 Q 当使用SYSDBA登录至OEM控制台时 得到以下错误信息 VOC Failureupdatingorinsertingauserdetailentry ORA Tableorviewdoesnotexist A 用户登录至OEM控制台的缺省角色是NORMAL 如果你需要作为SYSDBA连接 应该在Preferred Credentials窗口中设置CONNECTASSYSDBA选项 Q 当登录至OEM控制台时 得到以下错误信息 VOC OracleDaemonprocesscouldnotbestarted A 通信后台进程不能初始化的原因是因为NT或Windows 的登录库输入项(registryentries)是缺少或无效的 在命令提示符状态下手工地运行VOD EXE注册 OCX Q 当登录至OEM控制台时 得到以下错误信息 VOD OracleDaemonprocesscouldnotbestartedVODA EXE AdeviceattachedtothesystemisnotfunctioningNCRNT DLL FileislinkedtomissingexportinNSNT DLL:n *** hwk A 原因是在同一个ORACLE_HOME中安装了 个以上版本的SQL*NetV 应该仅仅运行与OEM光盘所含版本的SQL*Net 启动Oracle安装程序 移去所有的更早版本的SQL*NetV X Q 当登录至OEM控制台时 得到以下错误信息 VOD Failedtolistenforiningconnections A 后台进程的LISTENINGADDRESS设置错误或是系统的TCP/IP未设置 Q 当登录至OEM控制台时 得到以下错误信息 VAX Repository(x x)isnotpatiblewiththeOEM(x x) A 原因是在此用户中找不到Repository表格或当创建Repository表格时发生问题 应重新创建Repository Q OEM控制台安装在一个共享网络驱动器上 当登录至OEM控制台时 得到GPF A 不应试图从一个共享网络驱动器运行OEM控制台 OEM x产品应该安装在每个工作站的本地盘上 Q 当试图使用OEM对数据库进行离线备份时 得到以下错误信息 ORA SMP_OFFLINE_BACKUP_LOCKtablesnotfound A 用DBSNMP用户登录来运行脚本BACKUPTS SQL Q 当试图使用OEM对数据库进行热备份时 得到以下错误信息 calltoaltertablespacebackupfailed NMS :unabletostartHOTbackup A 数据库不在ArchiveLog方式 将数据库改为ArchiveLog方式 Q 当试图升级或创建一个新的repository时 得到以下错误信息 VOJ :ErrorInsertingintoselect from A 如果是从OEM 升级到OEM 这是一个BUG 可以运行SMPCRE SQL来删除 仓库或联系OracleWorldWideSupport以得到PATCH 如果这不是升级而是一个新的安装 应检查用户所在表空间 修改存储参数或增加新的数据文件 Q 在安装OEM 时 得到以下错误信息 oem ins writeerrorwhilecopyingfile c:\windows\system\oleaut new A 安装程序试图用一个较老版本的oleaut dll来覆盖当前的文件 将oleaut dll拷贝为oleaut old 然后重新启动Oracle安装程序 Q lishixinzhi/Article/program/Oracle/201311/16989
创新互联是专业的涉县网站建设公司,涉县接单;提供成都网站设计、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行涉县网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
Oracle 触发器调试及遇到相关问题解决
今天在项目中遇到一个比较棘手的问题,需要用到触发器。在编写触发器和调试过程中遇到下列问题,在此记录一下:
由于之前写的触发器都能正常运行,就没有涉及到触发器的调试,今天发现触发器没起作用,需要调试,竟不知道在哪儿调试。在网上借鉴一些别人的经验(),记录一下。在PL/SQL中,触发器的调试方法如下:
1,选中要调试的触发器,右击,然后勾选 Add debug information,只有勾选这个按钮后,调试才能进入到断点。
2,选中触发器,点击 Edit,到Edit 界面,在要调试的行号前面单击,或者右键,添加断点。
3,在菜单的新建中选择“测试窗口”,打开一个如下块,在begin和end中间添加能触发触发器的语句
4,按F9或者点击调试菜单中的开始菜单,进入运行调试状态(后面的红框是单步进入)
5,点击运行图标跳到触发器中断点位置
6,鼠标放到变量上可以显示变量值。
7,如果有异常,就弹出相关异常信息。
调试的时候发现new对象的日期格式为中文,而后面又需要yyyy-mm-dd 的格式来作为查询条件。所以就在赋值的时候转换一下。
在select into 给变量赋值的时候,select 查询出来的集合为空,导致报错ORA-01403,解决方案就是将这一段用begin end 包裹起来,抛出改异常的时候给变量一个默认值。如下图:
Oracle数据库频繁归档问题的解决办法
Oracle数据库频繁归档问题的解决办法
第一步 检查
top 输出 CPU 使用率很低
iostat 读 M/s 写 K/s iowait %
v$session 中的会话不多 且都没有大的事务操作
db_writer_processes=
log_archive_max_processes=
主日志组 个 每个组中 个 M大小的日志文件
备日志组 个 每个组中 个 M大小的日志文件
v$log 除了一个组为current 其它所有日志组状态均为active
重启数据库现象依旧
第二步 判断
根据以上检查结果 判断应该不是应用层的问题 初步判断是系统进程或硬件问题 因为是生产系统 不到万不得已不要轻易作硬件检测和更换 因为那样会需要大量停止服务时间 首先采取一般控制日志归档的方法
第三步 措施
增加主日志文件
alter database add logfile member /u /oradata/BOSS/redo log to group
alter database add logfile member /u /oradata/BOSS/redo log to group
alter database add logfile member /u /oradata/BOSS/redo log to group
alter database add logfile member /u /oradata/BOSS/redo log to group
第四步 增加归档进程数 由 改为
alter system set log_archive_max_processes= scope=both
lishixinzhi/Article/program/Oracle/201311/17384
我的oracle宕机了怎么处理
1、案例现象
在root用户下,su切换到一个普通用户oracle下,却发生了如下错误:
oracle数据库意外宕机的分析处理案例
于是,尝试直接通过oracle用户登录系统,发现此时的oracle用户也无法登录了,出现与上面同样的错误。
2、解决思路
从上面错误提示可知是权限出现了问题,那么可以从权限入手进行排查,基本思路如下:
用户目录/home/oracle权限问题;
su程序执行权限问题;
程序依赖的共享权限问题;
selinux问题导致;
系统根空间问题。
3、排查问题
根据上面的思路,我们进行逐一检查,考虑到su在切换到oracle用户时会读取oracle目录下的环境变量配置文件,因此,首先检查/home/oralce目录的权限是否存在问题,
[root@loaclhost home]# ls -al/home|grep oracle
drwx---- 4 oralce oinstall 4096 01-31 10:45 oracle
从输出可知,/home/oracle目录的属主是oracle用户,oracle用户对这个目录有“rwx”权限,因此,oracle用户目录的权限设置是正确的,可以排除掉这个问题了。
接着检查su执行权限问题:
[root@loaclhost home]# 11 /bin/su
-rwsr-xr-x 1 root root 24120 2007-11-30 /bin/su
可见su命令执行权限也没有问题,这个也排除了。
继续检查su依赖的共享库权限,使用ldd命令检查su命令依赖的共享库文件,如下图
oracle数据库意外宕机的分析处理案例
根据上面的操作,依次检查su命令依赖的每个库文件的权限,发现也都是正常的,因此,共享库的问题也排除了。
根据上面的思路,绩效检查SELinux的设置。
oracle数据库意外宕机的分析处理案例
由输出可知,SELinux处于关闭状态,这个原因也排除了。
到这来为止,问题变得朴素迷离,到底是哪里出现问题了呢?作为Linux运维,例行检查系统根分区状态是非常必要的,那么首先检查一个根分区的磁盘空间大小,发现剩余空间还有很多,空间问题也排除了。既然报的错误是权限有问题,那么只要以权限为线索,不偏离这个核心就没错,于是继续尝试检查/home目录下各个用户的权限,如下图。
oracle数据库意外宕机的分析处理案例
从输出看每个用户的目录权限,都是“rwx----”,即“700”,完全没有问题,可是我发现我错了,我的目光一直在用户对应的目录上,而忽略了其他输出信息,而问题就藏在我没有关注的信息中。在这个命令输出的前两行中,第一行权限对应的目录是“.”,代表当前目录,也就是/home目录,权限为“rwxr-xr-x”,第二行权限对应的目录是“..”,也就是根目录,权限却为“rw-rw-rw-”,即“666”,此时,问题终于查找到了,原来是根目录权限问题。
4、解决问题
知道了问题产生的原因,解决问题就非常简单,执行如下命令:
[root@localhost~]#chmod 755 /
然后就可顺利执行su切换命令。
经验分享
这个问题主要是由于根目录没有执行权限,而Linux下所有的操作都是在根目录下进行的,进而导致/home/oralce目录没有执行权限。其实根目录权限的丢失对于系统中运行的每个用户存在同样的影响。因此,在权限出现问题时,一定要注意根目录的权限。
Oracle数据库无响应故障处理方式
Oracle数据库无响应故障处理方式
Oracle数据库无响应故障,简单地讲就是数据库实例不能响应客户端发起的请求,客户端提交一个SQL后,就一直处于等待数据库实例返回结果的状态。更严重的现象是客户端根本不能连接到数据库,发起一个连接请求后,一直处于等待状态。Oracle数据库无响应故障怎么处理呢?下面跟我一起来学习Oracle数据库无响应故障的处理方法吧!
无响应的故障现象一般有以下几种:
1.Oracle的进程在等待某个资源或事件
这种现象一般可以从V$SESSION_WAT、V$LATCH、V$LATCHHOLDER等动态视图中检查进程正在等待的资源或事件,而被等待的资源或事件,一直都不能被获取,甚至是很长时间都不可获得。如果这个正在等待的进程持有了其他的资源,则会引起其他的进程等待,这样就很可能引起实例中大范围的会话发生等待。由于进程在等待资源或事件时,通常都处于SLEEP状态,消耗的CPU资源非常少(在等待latch时要稍微多消耗一些CPU资源),所以从OS来看,CPU的消耗并不高,甚至是非常低。
这种因为等待而引起的个别进程Hang,相对比较容易处理。
2. OracleProcess Spins
所谓Spin,就是指Oracle进程中的代码在执行某个过程时,陷入了循环。在V$SESSION视图中,往往可以看到Hang住的会话,一直处于“ACTIVE”状态。对于这样的会话,用“alter system kill session ‘sid,serial#’”命令也不能完全断开会话,会话只能被标记为“killed”,会话会继续消耗大量的CPU。进程Spins由于是在做循环,CPU的消耗非常大,从OS上明显可以看到这样的进程,通常会消耗整个CPU的资源。
而对于这样的Hang住的会话,处理起来相对比较复杂,并且为了从根本上解决问题,需要超过DBA日常维护所需要的技能。
从故障范围来看,无响应故障可以分为以下几种情况:
1. 单个或部分会话(进程)Hang住
这种情况属于小范围的故障,业务影响相对较小,一般来说只会影响业务系统的个别模块。在一个多应用系统的数据库上面,如果Hang住的会话比较多,则影响的可能是其中的一个应用系统。这里有一个例外,如果Hang住的进程是系统后台进程,如pmon、smon等,则影响的范围就非常大了,最终甚至会影响整个数据库及所有应用系统。还有值得注意的是,即使是少部分会话Hang住,也要及时处理,否则极有可能会扩散到整个系统。
2. 单个数据库实例Hang住
这种情况造成的影响非常大。在这个实例上的所有应用系统均受到严重影响,并且在找到根源并最终解决问题之前,数据库实例往往须要重启。
3. OPS或RAC中的多个实例或所有实例都Hang住
在这种情况下,即使是OPS或RAC,都已经没办法提供高可用特性了。使用这个数据库的所有应用系统将不能继续提供服务,这种情况往往须要重启。
无响应故障成因分析
Oracle数据库无响应,一般主要由以下几种原因引起:
1. 数据库主机负载过高,严重超过主机承受能力
比如应用设计不当,数据库性能低下,活动会话数的大量增加,导致数据库主机的负载迅速增加,数据库不能正常操作,并最终Hang住;主机物理内存严重不足,引起大量的换页,特别是在SGA中的内存被大量换出到虚拟内存时,数据库实例往往就会Hang住。
2. 日常维护不当、不正确的操作引起数据库Hang住
比如归档日志的存储空间满,导致数据库不能归档,引起数据库Hang住;在一个大并发的繁忙的系
统上,对DML操作比较多的大表进行move、增加外键约束等操作也可能使系统在短时间内负载大幅升高,并引起数据库系统Hang住;不正确的资源计划(Resource Plan)配置,使进程得不到足够的CPU等。
3. Oracle数据库的Bug
几乎每个版本都存在着会导致数据库系统Hang住的Bug,这些Bug会在一些特定的条件下触发,特别是在RAC数据库中,引起数据库Hang住的Bug比较多。
4. 其他方面的一些原因
比如在RAC数据库中,如果一个节点退出或加入到RAC的过程中,当进行Resource Reconfiguration时,会使系统冻结一段时间,也有可能使系统Hang住。
以上所描述的几种常见的会导致Oracle数据库实例Hang住的原因中,大部分的情况是可以避免的,只要维护得当,一般不会出现这种故障。对于Oracle数据库Bug所导致的数据库无响应故障,由于是在特定的情况下才会触发,所以如果能够尽量对数据库打上最新版本的补丁,并且熟悉当前版本中会导致系统Hang住的Bug以及触发条件,就能够最大限度地避免这种故障的发生,提高系统的可用性。
那么,在数据库Hang住的情况下,如何去分析并发现导致问题的根源?一方面,由于系统Hang住会导致业务系统不可用,为了能够尽快地恢复业务,须快速地判断问题所在,然后Kill掉引起故障的会话和进程,或者数据库实例不得不重启以迅速恢复业务;但另一方面,如果只是重启数据库或Kill会话和进程来解决问题,在很多情况下是治标不治本的办法,在以后故障随时可能会出现。如何在二者之间进行抉择呢?对于数据库Hang故障的处理,首先是尽可能地收集到系统Hang住时的状态数据,然后尽快地恢复业务,恢复业务后分析收集到的数据,找到数据库系统Hang住的真正原因,然后再进行相应的处理。下一节将详细描述数据库系统Hang住后的处理流程。
无响应故障处理流程
对于Oracle无响应故障的处理,我们可以按下图所示的流程进行。
值得注意的是,上图并不是一个完整的Oracle数据库故障处理流程图,只是处理Oralce数据库无响应这一类特定的故障的流程,只列出了针对这一特定类型故障处理时的关键处理点。不过既然是故障,所以这类故障的处理流程与其他故障的处理流程,有着非常相似的地方。
下面是整个流程的详细说明:
1. 在出现数据库无响应故障后,首先确认系统的影响范围,如上节所描述的',是部分业务系统或模块还是所有的业务系统都受影响,是不是整个实例或多个实例都无响应。同时应询问系统维护和开发人员,受影响的系统在出现故障前是否有过变动,包括主机硬件、操作系统、网络、数据库以及应用等。有时一个细小的变动就可能导致出现数据库Hang住这样严重的故障。曾经遇到一个库,应用只是修改了一个SELECT语句就导致了数据库Hang住。
2. 为了避免由于网络、数据库监听或客户端因素影响分析,建议都登录到主机上进行操作。
3. 如果主机不能登录(为了避免干扰流程主线,这里不讨论如网络问题这样也会导致不能连接的故障),尝试关闭出现问题的业务系统,甚至是所有的业务系统。如果关闭了所有的业务系统之后,仍然不能连接,则只有考虑重新启动数据库主机。在数据库主机重新启动后,使用操作系统工具或OSW等长期监控操作系统的资源使用,同时监控Oracle数据库的性能和等待等。
4. 登录上主机后,先用top、topas等命令简单观察一下系统。看看系统的CPU使用、物理内存和虚拟内存的使用、IO使用等情况。
5. 使用SQLPLUS连接数据库,如果不能连接,则只能从操作系统上观察系统中是否有异常的现象,比如占用CPU过高的进程。使用gdb、dbx等debugger工具对数据库进行system state dump;使用strace、truss等工具检查异常进程的系统调用;使用pstack、procstack等工具察看异常进程的call stack等。
6. 使用SQLPLUS连接上数据库后,进行hanganalyze、system state dump等操作;或检查等待事件、异常会话等正在执行的SQL等待。
7. 找到故障产生的原因,如果暂时找不到原因,尽量收集数据。
8.确良如果应用急须恢复,可通过Kill会话、重启数据库实例等方式,先恢复应用。
9. 根据最终诊断结果,对数据库升级打补丁,或者修改应用等方式从根本上解决问题。
怎样避免数据库出现无响应故障
作为Oracle数据库DBA,除了处理故障之外,更重要的是如何预防故障的发生。根据前面对数据库无响应故障的成因分析,在日常的维护工作中,须做到以下几点:
1. 进行正确的维护操作
很多的数据库无响应故障都是由于不正确的维护操作引起的。应避免在业务高峰期做大的维护操作,比如像move、加主外键约束等会长时间锁表的操作。如果的确需要,尽量使用正确的操作方法。比如用ONLINE方式重建索引;建主键、唯一键约束时先建索引,然后在建约束时指定新建的索引,等等。也就是保证系统的并发性、可伸缩性,避免系统串行操作的出现。
2. 优化应用设计,优化数据库性能
为避免性能问题导致在业务高峰期数据库不能及时有效处理来自业务的请求,甚至于完全Hang住。对于数据库中存在串行访问的部分进行优化,比如latch、enqueue,还包括不合理的sequence设计等。特别是在RAC数据库中,严重串行访问等待往往更容易引起严重的性能问题。优化应用设计,使数据库具有更好的可伸缩性和并行处理能力,能够有效地避免性能问题引起的数据库Hang住。
3. 利用监控系统随时监控系统负载
遇到系统负载过高,内存不足,OS中虚拟内存换页很频繁等情况时,及时采取措施;监控Oracle数据库的核心进程,如pmon、smon等,看是否有异常,如过高的CPU消耗。出现异常应立即处理;监控归档空间和日志切换;监控数据库中的等待事件,比如是否有大量的enqueue、log file switch (archiving needed)、resmgr:become active等待事件等。
4. 为数据库打上补丁
很多的无响应故障是由于Oracle的Bug引起的,数据库DBA应关注当前版本中有哪些Bug会导致数据库Hang住,尽量为数据库打上解决这些Bug的补丁。
;
如何连接oracle数据库及故障解决办法
如何配置才能使客户端连到数据库:
要使一个客户端机器能连接oracle数据库,需要在客户端机器上安装oracle的客户端软件,唯一的例外就是java连接数据库的时候,可以用
jdbc
thin模式,不用装oracle的客户端软件。加入你在机器上装了oracle数据库,就不需要在单独在该机器上安装oracle客户端了,因为装
oracle数据库的时候会自动安装oracle客户端。
用过sql
server数据库然后又用oracle的新手可能会有这样的疑问:问什么我用sql server的时候不用装sql
server的客户端呢?原因很简单,sql server也是microsoft的,它在操作系统中集成了sql
server客户端,如果microsoft与oracle有协议,将oracle客户端也集成到操作系统中,那我们也就不用在客户端机器装oracle
客户端软机就可访问数据库了,不过,这好像是不可能实现的事情。
也有的人会问:为什么在sql
server中没有侦听端口一说,而在oracle中要配置侦听端口?其实sql
server中也有侦听端口,只不过microsoft将侦听端口固定为1433,不允许你随便改动,这样给你一个错觉感觉sql
server中没有侦听端口,咳,microsoft把太多的东西都封装到黑盒子里,方便使用的同时也带来的需要副作用。而oracle中的侦听端口直接
在配置文件中,允许随便改动,只不过无论怎样改动,要与oracle服务器端设置的侦听端口一致。
好,言归正传,我们如何做才能使客户端机器连接到oracle数据库呢?
A. 安装相关软件
B. 进行适当的配置
A.在适当的位置安装适当的软件:
在客户端机器:
1.在客户端机器上安装ORACLE的Oracle Net通讯软件,它包含在oracle的客户端软件中。
2.正确配置了sqlnet.ora文件:
NAMES.DIRECTORY_PATH = (TNSNAMES, ….)
NAMES.DEFAULT_DOMAIN=DB_DOMAIN
一般情况下我们不用NAMES.DEFAULT_DOMAIN参数。如果想不用该参数用#注释掉或将该参数删除即可,对于NAMES.DIRECTORY_PATH参数采用缺省值即可,对于NAMES.DEFAULT_DOMAIN参数有时需要注释掉,在下面有详细解释。
3.正确配置了tnsname.ora文件
在服务器端机器:
1.保证listener已经启动
2.保证数据库已经启动。
如果数据库没有启动,用:
Oracle 9i:
dossqlplus “/ as sysdba”
sqlplus startup
Oracle 8i:
dossvrmgrl
svrmgrlconnect internal
svrmgrlstartup
命令启动数据库
如果listener没有启动,用:
lsnrctl start [listener name]
lsnrctl status [listener name]
命令启动listener
B.进行适当的配置
如何正确配置tnsname.ora文件:
可
以在客户端机器上使用oracle Net Configuration Assistant或oracle Net
Manager图形配置工具对客户端进行配置,该配置工具实际上修改tnsnames.ora文件。所以我们可以直接修改tnsnames.ora文件,
下面以直接修改tnsnames.ora文件为例:
该文件的位置为: …\network\admin\tnsnames.ora (for windows)
…/network/admin/tnsnames.ora (for unix)
此处,假设服务器名为testserver,服务名为orcl.testserver.com,使用的侦听端口为1521,则tnsnams.ora文件中的一个test网络服务名(数据库别名)为:
test =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
此处的笑脸为)。
红色的内容为需要根据实际情况修改的内容,现解释如下:
PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。
HOST:数据库侦听所在的机器的机器名或IP地址,数据库侦听一般与数据库在同一个机器上,所以当我说数据库侦听所在的机器一般也是指数据库所在的机
器。在UNIX或WINDOWS下,可以通过在数据库侦听所在的机器的命令提示符下使用hostname命令得到机器名,或通过ipconfig(for
WINDOWS) or ifconfig(for
UNIX)命令得到IP地址。需要注意的是,不管用机器名或IP地址,在客户端一定要用ping命令ping通数据库侦听所在的机器的机器名,否则需要在
hosts文件中加入数据库侦听所在的机器的机器名的解析。
PORT:数据库侦听正在侦听的端口,可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。
SERVICE_NAME:在服务器端,用system用户登陆后,sqlplus show parameter service_name命令察看。
如何利用配置的网络服务名连接到数据库:
用sqlplus程序通过test网络服务名进行测试,如sqlplus system/manager@test。
如果不能连接到数据库,则在tnsname.ora文件中的test网络服务名(net
service)后面加上sqlnet.ora文件中NAMES.DEFAULT_DOMAIN参数的值,此处我的参数值为
testserver.com,将其加到网络服务名后面,修改后的tnsname.ora中关于该网络服务名的内容为:
什么情况下会引起oracle自动设置NAMES.DEFAULT_DOMAIN参数?
出现这种情况的典型环境为windows的客户端的‘我得电脑à属性à计算机名à更改à其它…à此计算机的主DNS后缀’中设置了‘primary
dns
suffix’,因为在这种情况下安装客户端时,会在sqlnet.ora文件中自动设置NAMES.DEFAULT_DOMAIN参数,或许当把计算机
加入域中安装oracle客户端时也会出现这种情况,有条件的话大家可以试一下。
我在设置oracle的客户端时一般手工修改tnsnames.ora文件,但是还有许多人喜欢用图形工具配置,该图形工具最终还是修改tnsnames.ora文件,但是它有时会引起其它的问题:
在用oracle的图形配置软件'net assistant'或‘Net Configuration
Assistant’配置网络服务名时,假如已经设置了‘primary dns
suffix’,但是在图形配置软件中写的网络服务名的名字中没有‘primary dns
suffix’,如只是写了test,则图形配置软件会自动在后面加上‘primary dns
suffix’,使之变为test.testserver.com,并存在tnsnames.ora中,而不管你的sqlnet.ora文件中是否有
NAMES.DEFAULT_DOMAIN参数。此时,用图形工具进行测试连接是通过的,但是假如此时sqlnet.ora文件中没有
NAMES.DEFAULT_DOMAIN参数,则你在使用网络服务名时应该使用在tnsnames.ora中的
test.testserver.com,而不是你在图形配置软件中键入的test。解决的办法为:
1可以在sqlnet.ora文件中设置NAMES.DEFAULT_DOMAIN= testserver.com,这时你可以用test或test.testserver.com连接数据库
2在sqlnet.ora文件中不设置NAMES.DEFAULT_DOMAIN参数,在tnsnames.ora文件中将test.testserver.com中的.testserver.com去掉,这时你可以用test连接数据库。
关于为什们在网络服务名后面加db_domain参数,需要了解sql*plus连接数据库的原理,我在后面解决12154常见故障中给出了详细的说明。
如果上面的招数还不奏效的话,只好用一下乾坤大挪移了。
将客户端的网络服务名部分
test.testserver.com =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
此处的笑脸为)。
拷贝到服务器的tnsnames.ora文件中。然后再服务器端用sqlplus system/manager@test.testserver.com连接到数据库。
如果能连接成功,说明你的客户端与服务器端的网络有问题。
如果连接不成功,用前面的部分检查网络服务名部分部分是否正确,如果确信网络服务名部分正确而且所有的客户端都连不上数据库则可能为系统TCP/IP或Oracle系统有问题,建议重新安装数据库。
该错误表示用于连接的网络服务名在tnsnames.ora文件中不存在,如上面的tnsnames.ora中的网络服务名只有test,假如用户在连接时用sqlplus system/manager@test1则就会给出TNS-12154错误。
要注意的是,有时即使在tnsnames.ora文件中有相应的网络服务名,可是用该网络服务名连接时还会出错,出现这种情况的典型配置如下(在客户端的机器上):
sqlnet.ora文件:
NAMES.DIRECTORY_PATH = (TNSNAMES, ….)
NAMES.DEFAULT_DOMAIN = server.com
tnsnames.ora文件:
test =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
此处的笑脸为)。
sql*plus运行基本机理:
在用户输入sqlplus system/manager@test后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假 如该参数存在,则将该参数中的值取出,加到网络服务名的后面,
即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/manager@test.server.com
,然后再到tnsnames.ora文件中找test.server.com网络服务名,这当然找不到了,因为该文件中只有test网络服务名,所以报
错。解决的办法就是将sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数注释掉即可,如
#NAMES.DEFAULT_DOMAIN =
server.com。假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找
test网络服务名,然后取出其中的host,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。
另外原则上tnsnames.ora中的配置不区分大小写,但是我的确遇到区分大小写的情况,所以最好将使用的网络服务与tnsnames.ora中配置的完全一样。
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor.
该错误表示能在tnsnames.ora中找到网络服务名,但是在tnsnames.ora中指定的SERVICE_NAME与服务器端的SERVICE_NAME不一致。解决的办法是修改tnsnames.ora中的SERVICE_NAME。
易混淆术语介绍:
Db_name:对一个数据库(Oracle database)的唯一标识,该数据库为第一章讲到的Oracle
database。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负
担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了Db_domain参数,这样在数据库的标识是由Db_name和
Db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将Db_name和
Db_domain两个参数用’.’连接起来,表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了Db_name。
Db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。
Db_domain:定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。
Global_name:对一个数据库(Oracle
database)的唯一标识,oracle建议用此种方法命令数据库。该值是在创建数据库是决定的,缺省值为Db_name.
Db_domain。在以后对参数文件中Db_name与Db_domain参数的任何修改不影响Global_name的值,如果要修改
Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO
db_name.db_domain命令进行修改,然后修改相应参数。
Service_name:该参数是oracle8i新引进的。在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,
一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,
而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name.
Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关
系,即不必Service name 必须与SID一样。
Net service name:网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。
网站标题:oracle故障怎么解决 oracle常见异常
链接地址:http://azwzsj.com/article/hgphog.html