数据库错误追踪专题 -- 赵振平 ( 大部分内容摘自《 Oracle 数据库精讲与疑难解析》一书 )
数据库的错误类型 数据库安装时的错误 数据库运行时的错误 网络错误 …
数据库安装时会产生如下的错误 不能启动安装程序( Oracle Universal Installer ) 安装时出现乱码 先决条件检查没有通过 不能写临时目录( /tmp ) 安装完成后不能启动数据库 ……
数据库运行时的错误 不能启动数据库 不能关闭数据库 数据库被挂起(死机) 不能扩展表空间 不能往数据库中插入数据 不能删除表空间 …
网络错误 连接数据库时,提示: TNS : TNS:no listener (没有监听器) 连接数据库时,报告 ORA-12170: TNS:Connect timeout occurred 启动监听器时,提示: TNS : Connect failed because target host or object does not exist ? 连接数据库时,报告 ORA-12505: TNS:listener does not currently know of SID given in connect descriptor 连接数据库时,报告 TNS Failed to resolve name 协议适配器错误( ORA-12560: TNS:protocol adapter error ) …
数据库错误的追踪方法 数据库安装时的错误追踪方法 数据库常规错误的追踪方法 网络错误的追踪方法 …
数据库安装时的错误追踪方法 数据库安装时,会产生千奇百怪的错误, 对于大部分错误来说,解决的过程都很类 似。 解决的过程如下: 首先,查看操作系统的日志文件 ( 跟踪文件 ) 其次,查看 Oracle Universal Installer(OUI) 生成的日志文件 最后,综合操作系统日志文件和 OUI 的日志文件,找出问题 的所在
查看操作系统的日志文件 每个操作系统都有自己的日志文件和跟踪文件,这 些操作系统文件记录了操作系统的系统级改变和错误 信息,从这些文件中,我们能够获得一些提示,这些 提示能够帮助我们分析和定位数据库安装和运行中出 现的问题。
操作系统日志文件的读取方式 大部分日志文件可以直接读取(使用命令 more,cat 等)。 有的操作系统日志文件要使用特殊的命令才能读取 如: AIX, 查看错误日志, 使用 errpt 命令 用 more 或者其它文本查看命令来查看 errlog 文件 ( AIX 日志文件)我们看到的将是一堆乱码。
操作系统日志文件的位置 ( LINUX ) 在 LINUX 中, /etc/syslog.conf 记录了日志文件的位置。 大部分日志文件都位于目录 /var/log/ 之下。 LINUX 中存在如 下日志文件。 /var/log/messages 将 info 或更高级别的消息写到该 文件 /var/log/maillog 记录电子邮件相关的信息 /var/log/boot.log 记录系统启动相关的信息 /var/log/cron 记录系统中定时执行的任务相关 的信息 。。。还有其它日志文件,这里就不一一作介绍
操作系统日志文件的位置 (Solaris) Solaris 的日志文件通常位于目录 /var/adm 下, Solaris 有如下的日志文件: messags 记录来自系统核心的各种运行日志 syslog 记录 mail 事件 sulog 记录普通用户使用 su 成为其它用户的记录 utmp 记录当前登录在主机上的用户
查看 Oracle Universal Installer 生成的日志文件 Step01 :找到文件 oraInst.loc 。 oraInst.loc 文件的位置如下: 对于 AIX , Linux x86 , or Linux Itanium : 文件的位置是 /etc/oraInst.loc 对于其它 UNIX 操作系统: 文件的位置是 /var/opt/Oracle/oraInst.loc 从文件 oraInst.loc 中,找到 Inventory 的位置。 $ cat /var/opt/Oracle/oraInst.loc inventory_loc=/Oracle/app/Oracle/oraInventory inst_group=oinstall 这里的 Inventory 目录是 /Oracle/app/Oracle/oraInventory Step02 :进入 Inventory 目录,找到安装日志 $ cd /Oracle/app/Oracle/oraInventory $ cd logs Step03 : 查看安装日志文件的内容 。 $ more installActions _ PM 。 log
数据库常规错误的追踪方法 数据库常规错误的追踪,主要查看两类文件。 一类是数据库的警报文件( Alert log Files ) 另外一类是数据库的跟踪文件( Trace Log Files )
警报文件( Alert log Files )介绍 警报日志文件,本书简称警报文件,它用于记录数据库的重大活动和发生的错误。 警报文件按照时间的先后记录发生的事件。特别注意的是,警报文件除了记录数据库 中发生的错误外,还记录数据库中发生的重大事件。警报文件记录的内容如下: 每次数据库启动( STARTUP )和关闭 (SHUTDOWN) 的详细信息。 DBA 执行的某些管理操作,如: ALTER SYSTEM , ALTER DATABASE 。 某些数据库错误,如 Oracle 的内部错误 (ORA-600 ),空间错误等。 共享服务器相关的信息和错误。 值是非默认值的初始化参数( Initialization Parameters )信息。 物化视图( materialized view )自动刷新产生的错误。 通过这些信息,我们可以了解数据库发生的重大事件和错误。警报文件是 DBA 使用最频繁 的文件, DBA 常常参考这个文件进行故障排查。
警报文件的位置 警报文件的名字的格式是 alertSID.log ,其中, SID 表示实例名( Instance )。警报文件的位置由初始化 参数 BACKGROUND_DUMP_DEST 指定。
跟踪文件( Trace Log Files )介绍 跟踪日志文件,本书叫 “ 跟踪文件 “ ,每个服务器进程和后台进程都写跟踪文件。 当一个后台进程检测到错误的时候, Oracle 会把错误信息写到跟踪文件中。因此, 检查跟踪文件的内容,就可以知道后台进程运行中是否产生错误。 跟踪信息被写到两个目录,和后台进程( Background Processes )相关的信息 被写到初始化参数 BACKGROUND_DUMP_DEST 指定目录;和服务器进程 ( Server Processes )相关的信息被写到初始化参数 USER_DUMP_DEST 指定的 目录。跟踪文件的名字在每种操作系统上会有不同,但是,每个跟踪文件的名字都 包含进程的名字(如: LGWR )。 如果数据库长时间运行,跟踪文件会变得越来越大。我们可以手工清除跟踪文件, 也可以限制跟踪文件的大小。 Oracle 的初始化参数 MAX_DUMP_FILE_SIZE 用于限 制跟踪文件的大小。 MAX_DUMP_FILE_SIZE 的格式如下: MAX_DUMP_FILE_SIZE = { integer [K | M] | UNLIMITED K | M 表示单位,可以把跟踪文件的大小设置在多少 K ,多少 M ,也可以设置跟踪文 件可以无限制( UNLIMITED )增长。
数据库常规错误的追踪方法 (总结) 通常,我们首先查看警报文件和跟踪文件,看看 这两个文件是否有异常。如果信息还不足够用于诊断 错误的所在,我们可以查看操作系统的日志文件,然 后再结合当前数据库的各种状态,相信我们定能解决 数据库的故障。 有关操作系统日志文件的详细信息,请参考前面的 PPT
网络错误的追踪方法 引起客户端不能访问数据库的原因很多,有软件 问题,也有硬件问题。有操作系统本身的问题,也有 应用程序的问题,也可能是防火墙的问题。但是,多 数情况,都是用户配置不当所致。无论什么网络错误, 我们都可以按照下面的原则去侦测网络问题。
第一步: ping 目标主机 用操作系统命令 ping 目标主机 ,看看目标主机是否存在。 C:\Documents and Settings\netshong>ping Pinging with 32 bytes of data: Request timed out. Ping statistics for : Packets: Sent = 4, Received = 0, Lost = 4 (100% loss) 一般情况,我们从这里基本就可以断定问题的所在。 如果 ping 的结果是 “Request timed out” ,表示客户端到目标主机 ( ) 的网络不通。这时候,需要解决操作系统这一层的网络连 接问题。如果不是操作系统的网络问题,我们再查看问题是不是出在 Oracle 这一层。 ping 不通可能有下面的原因 客户端的网卡物理故障 客户端的网卡设置不当 客户端的防火墙限制 网线断裂 服务器的网卡物理故障 服务器的网卡设置不当 服务器的防火墙限制
第二步: 执行 tnsping 命令 C:\Documents and Settings\Administrator>tnsping NNC TNS Ping Utility for 32-bit Windows: Version Production on 08-2 月 :12:10 Copyright (c) 1997, 2005, Oracle. All rights reserved. 已使用的参数文件 : D:\oracle_client\network\admin\sqlnet.ora 已使用 TNSNAMES 适配器来解析别名 Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = XXXX)(PORT = OK (60 毫秒 ) tnsping 命令主要用于测试客户端是否能够连接到监听器
第三步: 查看监听器状态 登陆监听器控件 C:\Documents and Settings\Administrator>lsnrctl LSNRCTL for 32-bit Windows: Version Production on 07-2 月 :34:07 Copyright (c) 1991, 2005, Oracle. All rights reserved. 欢迎来到 LSNRCTL, 请键入 "help" 以获得信息。 LSNRCTL> 显示监听器的状态 LSNRCTL> status 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=1521))) LISTENER 的 STATUS 别名 LISTENER 版本 TNSLSNR for 32-bit Windows: Version Production 启动日期 08-2 月 :56:52 正常运行时间 0 天 0 小时 20 分 27 秒 跟踪级别 off 。。。。。 服务 "nbo" 包含 2 个例程。 例程 "nbo", 状态 UNKNOWN, 包含此服务的 1 个处理程序... 例程 "nbo", 状态 READY, 包含此服务的 1 个处理程序... 服务 "nboXDB" 包含 1 个例程。 例程 "nbo", 状态 READY, 包含此服务的 1 个处理程序... 服务 "nbo_XPT" 包含 1 个例程。 例程 "nbo", 状态 READY, 包含此服务的 1 个处理程序... 命令执行成功
第四步: 查看监听器配置文件 监听器启动的时候,会读取一个叫 listener.ora 的文件,这个文件叫 “ 监听器 配置文件 ” ,这个文件指定监听器所在的主机,监听器监听的实例名,监听 的端口号,监听的协议等信息。这个文件的内容类似于下: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = nbo) (ORACLE_HOME = D:\oracle\product\10.2.0\db_1) (SID_NAME = nbo) ) LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521)) ) LISTENER 是监听器的名字,我们也可以使用别的名字。 ORACLE_HOME 是 Oracle 的主目录。 SID_NAME 监听器监听的数据库的实例名。本例中的实例是 nbo 。 PROTOCOL 监听器监听的协议。本例中使用的是 T C P / I P 协议。 HOST 指定数据库服务器的主机名或者 IP 地址。本例中的数据库服务器的 IP 地址是 PORT 指定监听器使用的端口号,默认的端口号是 1521 。
第五步: 查看客户端网络配置文件 tnsnames.ora 客户端网络配置文件 tnsnames.ora 的样例如下,这个文件定义了网络服务名 TONBO 。 TONBO = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xxxx)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = nbo) ) PROTOCOL 用于指定使用的协议。本例中使用的是 T C P / I P 。 HOST 指定数据库服务器的主机名或者 IP 地址。本例中的数据库服务器的 IP 地 址是 ) PORT 指定监听器使用的端口号,默认的端口号是 1521 。 SERVICE_NAME 指定请求的数据库的实例名。本例中请求的实例是 nbo 。
第六步: 查看 Oracle 网络的日志文件 如果完成前面的步骤,还是不能诊断出网络故障,我们可以查看 Oracle 网络的日志文件,从这些文件,我们能够获得更多的信息, 这些文件如下: listener.log Listener sqlnet.log Client or Database Server instance-name_pid.log Oracle Connection Manager listener …
“ 数据库错误追踪专题 ” 总结 有时候我们会碰到一些疑难问题,按照上面的方法难以解决, 我们可以到国外的网站进行搜索,一般情况下,国外的同行也会 遇到类似的问题。有时候,从国外的网站不能够直接搜索到答案, 但是我们还是要去搜索,因为从国外同行的帖子中,我们能够获 得一些启示。 如果从网上不能解决我们的疑难问题,我们只好耐心拜读 ORACLE 公司的大作(官方文档),你要知道,这是一切 ORACLE 知识的源泉。以 ORACLE 的官方文档为工具,开动我们 的大脑,相信我们一定能够找出解决问题的办法。
《 Oracle 数据库精讲与疑难解析》一书的作者将在 中关村图书大厦举办数据库专题讲座 时间: 6 月 28 日,下午 1 点到 3 点 地点:中关村图书大厦 主题:《构建高速运行的 SQL 语句》 届时,期望对数据库感兴趣的朋友一起去探讨学习 数据库的体会和感受。。。
感谢 ITPUB 和电子工业出版社
Thanks !