星期三, 六月 20, 2007

Oracle诊断案例-如何捕获问题SQL解决过度CPU消耗问题

Oracle诊断案例-如何捕获问题SQL解决过度CPU消耗问题 查看全文

星期二, 十一月 28, 2006

文档链接推荐!

学习经验谈:

如何学习Oracle-eygle的方法经验谈
http://www.eygle.com/archives/2005/...eoracleouo.html

Statspack相关文档:

关于Statspack,以下是我收集的一些连接

otn文档:

http://otn.oracle.com/deploy/perfor...f/statspack.pdf

http://otn.oracle.com/deploy/perfor...NG_dialeris.pdf

采用Statspack进行高级调优
http://www.oracle.com/global/cn/ora...?o13expert.html

http://otn.oracle.com/deploy/perfor...ing_otn_new.pdf

Installing and Running Statspack(for 8.0 8.1.5的扩展版本)
http://www.oracle.com/oramag/oracle...pack-other.html

Diagnosing Performance with Statspack:
http://www.oracle.com/oramag/oracle/00-Mar/o20tun.html

Advanced Tuning with Statspack
http://otn.oracle.com/oramag/oracle.../o13expert.html

Itpub精华:

STATSPACK,刚刚解决的一个问题,请大家注意!
http://www.itpub.net/showthread.php?s=&threadid=72037

StatsPack在数据库优化中的使用
http://www.itpub.net/showthread.php?s=&threadid=73500

Metalink文档(需要metalink帐号访问):

FAQ- Statspack Complete Reference
http://metalink.oracle.com/metalink...OT&p_id=94224.1

What is StatsPack and where are the READMEs?
http://metalink.oracle.com/metalink...database_id=NOT

Installing and Configuring StatsPack Package
http://metalink.oracle.com/metalink...database_id=NOT

Creating a StatsPack performance report
http://metalink.oracle.com/metalink...database_id=NOT


Others whitepaper:

http://www.osborne.com/products/007...133783_ch15.pdf

http://www.dbatoolbox.com/WP2002_06/statspack_01.pdf

http://my.oraperf.com/download/yapp_anjo_kolk.pdf

statspack分析实例

Statspack专题
http://www.eygle.com/statspack/statspack_list.htm

求助 oracle 吃cpu
http://www.itpub.net/showthread.php?s=&threadid=92560

看一下spreport,有什么建议啊
http://www.itpub.net/showthread.php?s=&threadid=105361

关于statspack的报告
http://www.itpub.net/showthread.php?s=&threadid=85180

各位班主和高手请留意!
http://www.itpub.net/showthread.php?s=&threadid=106156

db file scattered read-DB文件分散读取
http://www.eygle.com/statspack/statspack12.htm


星期二, 八月 29, 2006

sql.bsq与数据库的创建

« 警惕骗子-以同学名义行骗 | Blog首页 | 中国首届杰出数据库工程师评选前10名单 »


如果我们使用脚本创建数据库,那么最先运行的是一个叫做CreateDB.sql的脚本。
这个脚本发出CREATE DATABASE的命令,具体类似如下的例子:

CREATE DATABASE eygle
MAXINSTANCES 1
MAXLOGHISTORY 1
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE '/opt/oracle/oradata/eygle/system01.dbf'
SIZE 250M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/opt/oracle/oradata/eygle/temp01.dbf'
SIZE 40M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
UNDO TABLESPACE "UNDOTBS1" DATAFILE '/opt/oracle/oradata/eygle/undotbs01.dbf'
SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 ('/opt/oracle/oradata/eygle/redo01.log') SIZE 10240K,
GROUP 2 ('/opt/oracle/oradata/eygle/redo02.log') SIZE 10240K,
GROUP 3 ('/opt/oracle/oradata/eygle/redo03.log') SIZE 10240K;
exit;

在这个过程中,Oracle会调用$ORACLE_HOME/rdbms/admin/sql.bsq脚本,用于创建数据字典。

这个文件的位置受到一个隐含的初始化参数 (_init_sql_file )的控制:

SQL> @GetParDescrb.sql
Enter value for par: init_sql
old 6: AND x.ksppinm LIKE '%&par%'
new 6: AND x.ksppinm LIKE '%init_sql%'

NAME VALUE DESCRIB
--------------- --------------------- ------------------------------------------------------------
_init_sql_file ?/rdbms/admin/sql.bsq File containing SQL statements to execute upon database creation

如果在创建过程中,Oracle无法找到sql.bsq文件,则数据库创建将会出错.
如果我们移除sql.bsq文件,再看这样一个数据库创建过程:

[oracle@jumper scripts]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Fri Aug 18 15:45:26 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to an idle instance.

SQL> startup nomount;
ORACLE instance started.

Total System Global Area 252777592 bytes
Fixed Size 451704 bytes
Variable Size 134217728 bytes
Database Buffers 117440512 bytes
Redo Buffers 667648 bytes
SQL> @CreateDB.sql
CREATE DATABASE eygle
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced


Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

此时日志中会记录:

Fri Aug 18 15:45:49 2006
Errors in file /opt/oracle/admin/eygle/udump/eygle_ora_3632.trc:
ORA-01501: CREATE DATABASE failed
ORA-01526: error in opening file '?/rdbms/admin/sql.bsq'
ORA-07391: sftopn: fopen error, unable to open text file.
Error 1526 happened during db open, shutting down database
USER: terminating instance due to error 1526
Fri Aug 18 15:45:49 2006
Errors in file /opt/oracle/admin/eygle/bdump/eygle_ckpt_3623.trc:
ORA-01526: error in opening file ''
Instance terminated by USER, pid = 3632
ORA-1092 signalled during: CREATE DATABASE eygle
MAXINSTANCES 1
MAXLOGHISTORY...

这就是sql.bsq文件在数据库创建过程中的作用。知道了这个内容之后,我们可以通过手工修改sql.bsq文件来更改数据库字典对象参数,从而实现特殊要求数据库的创建或测试自定义库。

我们也可以通过修改_init_sql_file参数来重定位sql.bsq文件的位置。

ixora网站上有一篇文章可以参考:
http://www.ixora.com.au/tips/creation/bsq.htm
Itpub上的相关文章:
http://www.itpub.net/199099.html

-The End-


星期四, 八月 24, 2006

中国首届杰出数据库工程师评选前10名单

« sql.bsq与数据库的创建 | Blog首页


今天下午,中国首届杰出数据库工程师评选颁奖典礼于北京国宾宾馆举行。

十位最终进入前十名的选手一一亮相,选手名单如下,排名不分先后:

王明胜 李强 段云峰 万正勇 邢海捷 盖国强 齐红胤 牛新庄 冯春培 汪海

本次活动也终于落下了帷幕。

以下是个人在现场的照片一张:

eygle@bestdba

-The End-


在Windows上命令行如何手工起停Oracle

« 拥有归档日志 如何恢复一个丢失的数据文件 | Blog首页 | 中国首届杰出数据库工程师评选尘埃落定 »


在命令行我们可以用net命令手工启动Oracle服务:

C:>net start oracleserviceeygle
OracleServiceEYGLE 服务正在启动 ..............
OracleServiceEYGLE 服务已经启动成功。

在正常情况下,数据库即可随之启动,如果数据库不能启动,则可以通过sysdba身份连接进入数据库,手工mount并Open数据库

C:>sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 8月 18 11:17:16 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
eygle

SQL> exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 断开

停止同样很简单,net命令,一行即可:

C:>net stop oracleserviceeygle
OracleServiceEYGLE 服务正在停止......
OracleServiceEYGLE 服务已成功停止。

在Windows上,使用net命令能否启动数据库,还受到一个注册表参数的影响,这个参数是:ORA_<SID>_AUTOSTART

对于我的Oracle10g数据库,这个键值位于HKEY_LOCAL_MACHINESOFTWAREORACLEKEY_Ora10g,我的数据库SID为eygle,这个参数就是:ORA_EYGLE_AUTOSTART

当这个参数设置为True时,当我们启动服务时,Oracle数据库就会随之启动;反之,数据库就不会启动。

测试1,ORA_EYGLE_AUTOSTART=true时:

C:>net start oracleserviceeygle
OracleServiceEYGLE 服务正在启动 .....................
OracleServiceEYGLE 服务已经启动成功。


C:>sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 8月 22 09:27:35 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
eygle

测试2,ORA_EYGLE_AUTOSTART=FALSE时:

C:>net start oracleserviceeygle
OracleServiceEYGLE 服务正在启动 .
OracleServiceEYGLE 服务已经启动成功。


C:>sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 8月 22 09:30:03 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

已连接到空闲例程。

SQL>

-The End-


星期六, 八月 19, 2006

Oracle入门书籍推荐

« 关于《深入浅出Oracle》的答读者问 | Blog首页


很多朋友要我帮忙推荐一下Oracle的入门书籍,能够了解Oracle的基本概念、基本知识的那种。
我就免为其难,推荐几本。

首先我想强调的一点是,任何一本系统的Oracle书籍只要认真读下来,都会有不错的收获,读书最忌讳的是虎头蛇尾,浅尝则止。

第一本要推荐给大家的是Oracle的概念手册,这本手册是无数DBA学习的起点:Database Concepts
这是Oracle的官方文档,详尽的介绍了Oracle的基本概念,是DBA经常需要翻阅的参考书,也是最好的入门学习资料,如果大家阅读英文不存在问题,请先阅读本书,这本书可以在Oracle的官方文档站点Tahiti找到:
http://www.oracle.com/pls/db102/homepage?remark=tahiti

Oracle10gR2的下载地址为:
http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14220.pdf

下载之前你可能需要注册一个OTN的免费帐号。


第二本要推荐的是Thomas Kyte的《Expert One on One: Oracle》,这本书的中译本,被称为《Oracle专家高级编程》。
毋庸多说,这本书是Oracle界的经典之作,最初是基于Oracle8i进行写作的,现在Tom已经出版了基于Oracle9i/Oracle10g的升级版,书名为《Oracle Database Architecture 9i and 10g Programming Techniques and Solutions》,现在中文译本也已经快要出版了。

这本书的前几章以介绍Oracle的基础知识为主,后几章则以介绍开发相关的内容为主,侧重于管理DBA的朋友可以着重阅读一下该书的前几章。

Expert One on One: Oracle 这本书中文版大家可以参考:
http://www.itpub.net/showthread.php?threadid=224536
其英文版本参考:
http://www.itpub.net/showthread.php?threadid=316444

Oracle Database Architecture 9i and 10g Programming Techniques and Solutions 这本书的英文版参考:
http://www.itpub.net/showthread.php?threadid=486715

我强烈推荐大家仔细阅读本书。


最后一本推荐给大家可以用来做参考书的是《ORACLE8i数据库管理员手册》,这本书也出过Oracle9i的版本,对于一些基本概念本书可以用来翻看。在ITPUB上大家可以参考以下链接:
http://www.itpub.net/showthread.php?threadid=238615


书不在多,精读则灵,希望大家能够静下心来认真阅读,然后一定会有所收获的。

-The End-


关于《深入浅出Oracle》的答读者问

« 使用oradim恢复windows上的数据库 | Blog首页 | Oracle入门书籍推荐 »


有朋友在ITPUB上对本书提出了一点中肯的批评,就是:

偶然看倒一些文章介绍某些值是如何得到的提到一些隐含参数还能接受。难道真有人去修改这些东西?
基础和原理的东西还是最重要。
好比我们高考做数学题一样,平时可能知道一些特殊技巧。
到考场上还是用的自己最熟悉的常规办法。

对于这样的批评,以下是我的回复:

这批评比较中肯.俺以后注意.不过一部分隐含参数是为了将问题的根本介绍出来.

比如ASH的采样间隔是1秒
所以我提到一个参数:
NAME VALUE DESCRIB
------------------------------ ---------- ------------------------------------------------
_ash_sampling_interval 1000 Time interval between two successive Active Session
samples in millisecs

这个参数就是控制这个时间的.知道这个对于实际工作可能也没有用,但是我试图告诉大家的是,Oracle的每一个结果或者限制都是有来源的。知道这些对Oracle的理解就可以多一点。

而有一些众所周知的隐含参数,比如跟恢复有关的,本书也还是提到了.

有些内容我也是斟酌再三,很多内容最后被删减掉了。比如第一章,最后2页我写了BBED,关于这个实在是斟酌再三的,国外的作者是肯定不会写这个,而我只是想让大家知道还有这样一个东西,这样一个方法,一把刀是用来伤人还是救人,这需要读者自己去衡量。关于这2页内容是否适当,我现在也是没有一个确定性的。

基础和原理肯定是非常重要的,本书的一些章节介绍的可能还是比较深了.如果是广泛普遍的介绍,Kevin Loney的一些经典国内的译本都有了,可能大家都有看过了;结构完善的,Tom的书也无人能出其右.

所以本书在写作中为了保持自己的特色,难免走一点偏锋,这是作者的无奈.另外一方面这本书中更多的是介绍了我自己这么多年来的研究和学习历程及方法,有所偏颇也是难免。

大家可以试想一下,已经有了那么多经典在前面,我们还可以怎样写?我非常期待大家有好的建议给我:)

记录一下,也是对读者的一点回答。


星期五, 八月 18, 2006

使用oradim恢复windows上的数据库

很多朋友都问过这样的问题:
在Windows上如果系统崩溃了,数据文件、控制文件、日志文件等都还在,怎样来恢复Oracle数据库?

前几天重新安装了系统,正好需要恢复一下数据库。
如果软件也损失了,那么需要重新安装一下数据库软件。

很多人抱怨我的新书很少关于Windows的内容,实际上,Windows和Linux/Unix上的操作没有什么不同,Windows本身就是一个仿Unix的系统。
那么好吧,我还是用一个系列的文章介绍一下我所使用的Windows系统,以及我所认为的数据库系统无关性。

大家可以跟随我看一下这样一个过程。
首先开启一个cmd命令行窗口。
开始->运行->cmd

我的Oracle软件备份在D:oracle :

D:>dir oracle
驱动器 D 中的卷是 PRIVAT
卷的序列号是 94B0-FD3B

D:oracle 的目录

2006-08-16 14:14 <DIR> .
2006-08-16 14:14 <DIR> ..
2006-08-16 14:14 <DIR> ora10gR2
0 个文件 0 字节
3 个目录 941,744,128 可用字节

我的数据文件位于D:oradata下:

D:>dir d:oradata
驱动器 D 中的卷是 PRIVAT
卷的序列号是 94B0-FD3B

d:oradata 的目录

2006-08-16 14:25 <DIR> .
2006-08-16 14:25 <DIR> ..
2005-09-12 16:40 <DIR> flash_recovery_area
2005-09-12 16:40 <DIR> EYGLE
0 个文件 0 字节
4 个目录 941,744,128 可用字节

现在让我们用oradim创建一个实例,实际上也就是创建一个Windows服务:

C:>oradim -new -sid eygle
实例已创建。

我们用net命令可以查看系统启动了哪些服务,我们看到Oracle的服务已经启动:

C:>net start
已经启动以下 Windows 服务:

...............
O&O Defrag
OracleServiceeygle
Plug and Play
Print Spooler
...............

命令成功完成。

如果你的系统装了一些Unix增强工具,那么可以通过grep过滤一下:

C:>net start |grep Oracle
OracleServiceeygle

Unix命令工具可以在Sourceforge (http://sourceforge.net/projects/gnuwin32/) 下载.

此时我们就可以通过启动实例,挂接原有数据库,启动Oracle数据库了。当然你可能还有一些其他工作需要完成,比如重建口令文件等。

如果你想删除这个服务,那么也很简单:

C:>oradim -delete -sid eygle
实例已删除。

当然做好备份仍然是最重要的,我见过有的企业将文件分散在很多逻辑分区上,结果随系统崩溃丢失了部分文件,损失也是相当惨重的。

在Linux/Unix上不需要服务来启动实例,也就不存在这样类似的操作。不过在命令行操作,一切都是类似的。

系列文章参考:
http://www.eygle.com/archives/2006/08/oracle10g_on_windows.html


在Windows上安装Oracle10gR2

因为《深入浅出Oracle》一书中,多数以Linux/Unix平台为写作依据,前几天在ITPUB上遭到了读者的指责,虽然该读者的观点有所偏激,但是我仍然决定开始写一个系列的文章,陈述在不同平台上管理Oracle的异同,目的在于消弭不同平台之间管理和学习Oracle的差异。

算是对部分读者的一点补偿,也算是对Windows平台内容的一个补充。

为了这个目的,今天在Windows上开始装了一套Oracle10g,已经很久没在笔记本上安装Oracle了,想不到还遇到了一系列的问题,还好最后还是装上去了:)

查看日志文件,看到一些和以前不同的地方,在安装数据库之前,alert文件中记录了一段系统信息:

ORACLE V10.2.0.1.0 - Production vsnsta=0
vsnsql=14 vsnxtr=3
Windows XP Version V5.1 Service Pack 2
CPU : 1 - type 586
Process Affinity : 0x00000000
Memory (Avail/Total): Ph:560M/1023M, Ph+PgF:1574M/1949M, VA:1940M/2047M

包括了系统的内存和CPU等信息。

从明天开始要写一点Windows上的东西了:)


星期二, 八月 15, 2006

Oracle的db_name和instance_name

对于Oracle数据库来说,db_name和instance_name可以不同。
我们来看一下Oracle文档中对于db_name的定义:

DB_NAME必须是一个不超过8个字符的文本串.在数据库创建过程中,db_name被记录在数据文件,日志文件和控制文件中。如果数据库实例启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动。

一个实例可以mount并打开任何数据库,但是同一时间一个实例只能打开一个数据库。
一个数据库可以被一个或多个实例所mount并打开(在OPS/RAC环境下,一个数据库可以被多个实例所打开).

我们看一下我的数据库:

[oracle@jumper dbs]$ grep name initeygle.ora
*.db_name='eygle'
*.instance_name='eygle'

当前参数设置下的数据库:

SQL> select name from v$datafile;

NAME
-----------------------------------------------------
/opt/oracle/oradata/eygle/system01.dbf
/opt/oracle/oradata/eygle/undotbs01.dbf
/opt/oracle/oradata/eygle/users01.dbf
/opt/oracle/oradata/eygle/eygle01.dbf

SQL> show parameter db_name

NAME TYPE VALUE
------------------------------------ ----------- -----------
db_name string eygle
SQL> show parameter instance_name

NAME TYPE VALUE
------------------------------------ ----------- -----------
instance_name string eygle
SQL> create pfile from spfile;

File created.

SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

我们创建一个新的pfile为julia这个新的实例使用:

[oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
[oracle@jumper dbs]$ cp initeygle.ora initjulia.ora
[oracle@jumper dbs]$ ll init*
-rw-r--r-- 1 oracle dba 982 Jul 25 14:03 initeygle.ora
-rw-r--r-- 1 oracle dba 982 Jul 25 14:04 initjulia.ora
-rw-r--r-- 1 oracle dba 8385 Mar 9 2002 init.ora

修改这个文件更改:
instance_name = julia

修改后的参数设置:

[oracle@jumper dbs]$ grep name initjulia.ora
*.db_name='eygle'
*.instance_name='julia'

然后我们启动实例名称为julia的instance:

[oracle@jumper dbs]$ export ORACLE_SID=julia
[oracle@jumper dbs]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 25 14:04:15 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to an idle instance.

SQL> startup mount;
ORACLE instance started.

Total System Global Area 139531744 bytes
Fixed Size 452064 bytes
Variable Size 121634816 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode

SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

注意,此时试图加载数据库时出现错误,因为当前数据库被另外一个实例(instance)加载。在非并行模式(Ops/RAC)下,一个数据库同时只能被一个实例加载。

此时已经启动了两个数据库实例,从后台进程可以看出:

[oracle@jumper dbs]$ ps -ef|grep ora
oracle 27321 1 0 Jul14 ? 00:00:00 ora_pmon_eygle
oracle 27323 1 0 Jul14 ? 00:00:00 ora_dbw0_eygle
oracle 27325 1 0 Jul14 ? 00:00:00 ora_lgwr_eygle
oracle 27327 1 0 Jul14 ? 00:00:00 ora_ckpt_eygle
oracle 27329 1 0 Jul14 ? 00:00:32 ora_smon_eygle
oracle 27331 1 0 Jul14 ? 00:00:00 ora_reco_eygle
oracle 27333 1 0 Jul14 ? 00:00:00 ora_cjq0_eygle
root 15388 656 0 14:02 ? 00:00:00 sshd: oracle [priv]
oracle 15390 15388 0 14:02 ? 00:00:00 sshd: oracle@pts/2
oracle 15391 15390 0 14:02 pts/2 00:00:00 -bash
oracle 15445 1 0 14:04 ? 00:00:00 ora_pmon_julia
oracle 15447 1 0 14:04 ? 00:00:00 ora_dbw0_julia
oracle 15449 1 0 14:04 ? 00:00:00 ora_lgwr_julia
oracle 15451 1 0 14:04 ? 00:00:00 ora_ckpt_julia
oracle 15453 1 0 14:04 ? 00:00:00 ora_smon_julia
oracle 15455 1 0 14:04 ? 00:00:00 ora_reco_julia
oracle 15457 1 0 14:04 ? 00:00:00 ora_cjq0_julia
oracle 15459 15391 0 14:04 pts/2 00:00:00 ps -ef
oracle 15460 15391 0 14:04 pts/2 00:00:00 grep ora

我们关闭eygle这个数据库实例:

[oracle@jumper dbs]$ export ORACLE_SID=eygle
[oracle@jumper dbs]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 25 14:04:39 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

此时就可以通过实例julia加载并打开db_name=eygle的数据库了:

[oracle@jumper dbs]$ export ORACLE_SID=julia
[oracle@jumper dbs]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 25 14:05:06 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3


SQL> alter database open;

Database altered.

SQL> select name from v$datafile;

NAME
----------------------------------------------------------------------------
/opt/oracle/oradata/eygle/system01.dbf
/opt/oracle/oradata/eygle/undotbs01.dbf
/opt/oracle/oradata/eygle/users01.dbf
/opt/oracle/oradata/eygle/eygle01.dbf

SQL> ! ps -ef|grep ora
root 15388 656 0 14:02 ? 00:00:00 sshd: oracle [priv]
oracle 15390 15388 0 14:02 ? 00:00:00 sshd: oracle@pts/2
oracle 15391 15390 0 14:02 pts/2 00:00:00 -bash
oracle 15445 1 0 14:04 ? 00:00:00 ora_pmon_julia
oracle 15447 1 0 14:04 ? 00:00:00 ora_dbw0_julia
oracle 15449 1 0 14:04 ? 00:00:00 ora_lgwr_julia
oracle 15451 1 0 14:04 ? 00:00:00 ora_ckpt_julia
oracle 15453 1 0 14:04 ? 00:00:00 ora_smon_julia
oracle 15455 1 0 14:04 ? 00:00:00 ora_reco_julia
oracle 15457 1 0 14:04 ? 00:00:00 ora_cjq0_julia
oracle 15513 15391 0 14:05 pts/2 00:00:00 sqlplus
oracle 15514 15513 3 14:05 ? 00:00:01 oraclejulia (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 15515 15513 0 14:05 pts/2 00:00:00 /bin/bash -c ps -ef|grep ora
oracle 15516 15515 0 14:05 pts/2 00:00:00 ps -ef

SQL> show parameter instance_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string julia
SQL> show parameter db_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string eygle

我们再看看如果参数文件中的db_name和控制文件中的db_name不一致会出现什么错误.
修改参数db_name:

[oracle@jumper dbs]$ grep name initjulia.ora
*.db_name='julia'
*.instance_name='julia'

在启动过程中,我们看到,在mount阶段,数据库会对参数文件和控制文件进行比较,如果两者记录的db_name不一致,则数据库无法启动:

SQL> startup nomount;
ORACLE instance started.

Total System Global Area 139531744 bytes
Fixed Size 452064 bytes
Variable Size 121634816 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01103: database name 'EYGLE' in controlfile is not 'JULIA'

另外的一个区别是,db_name通常限制在8个字符之内;instance_name最多应该支持21个字符。通常我们都是设置db_name和instance_name一致。需要注意的是如果db_name设置过长,则会被Oracle截断为8个字符,而instance_name仍然会保留在21个字符之内,如果你的环境变量设置的instance_name=db_name,则启动时就会出现问题,你需要重建pfile/spfile并且修改环境变量才能启动实例,加载数据库。

这个问题可以参考Itpub曾经出现的案例:

http://www.itpub.net/showthread.php?threadid=604507

本文通过实例来介绍instance_name和db_name的区别,希望大家能对这两个参数以及instance和database有进一步的认识。


Oracle的TNS-12502 错误原因及解决

前几天收到一位读者朋友的来信,询问以下问题:

在我的监听日志中出现错误TNS-12502: TNS:listener received no CONNECT_DATA from client
经过查找资料了解到这种错误应该是客户端tnsnames.ora中没有写 CONNECT_DATA的原因,我检查过客户端的机器没有发现问题。
目前的现象:
1、每几分钟出现一次该错误(见附件),即使是在凌晨的时候也是,这段时间我们没有开发人员在凌晨时候使用Oracle。
2、到目前为止也没有发现客户端机器不能正常连接数据库的情况。

今天才有时间研究一下,对于TNS-12502错误,Oracle的解释如下:

Error: ORA-12502 / TNS-12502
Text: TNS:listener received no CONNECT_DATA from client
---------------------------------------------------------------------------
Cause: No CONNECT_DATA was passed to the listener.
Action: Check that the service name resolved from TNSNAMES.ORA has the
CONNECT_DATA component of the connect descriptor.

也就是说只有在TNSNAMES.ORA文件中不包含CONNECT_DATA时会出现此问题。

那么当通过一些网络工具或HA工具等检测监听器端口时,日志中就可能记录如上错误。我们可以简单模拟一下,在客户端通过telnet数据库服务器的1521端口测试连通性:

C:>telnet 172.16.30.11 1521

此时在日志中就会记录如下信息:

TNS-12502: TNS:listener received no CONNECT_DATA from client
09-AUG-2006 16:21:03 * 12502
TNS-12502: TNS:listener received no CONNECT_DATA from client
09-AUG-2006 16:21:13 * 12502
TNS-12502: TNS:listener received no CONNECT_DATA from client
09-AUG-2006 16:21:22 * 12502
TNS-12502: TNS:listener received no CONNECT_DATA from client

如果客户端都正常的话,此类错误并不会影响应用,当然也可以彻底检查找出根本原因。


首届杰出数据库工程师评选终组委会声明

首届杰出数据库工程师评选终选记行的终选已经完成,今天朋友告知,组委会发出了一个声明
声明内容如下:

通过8月12日、8月13日两天评审委员会对30名进入终选阶段工程师的集中面试,根据面试的实际情况,评审委员会委员一直认为在评选出前十名杰出数据库工程师的基础上,由于选手来自行业不同,研究方向也有很大区别,很难再量化出前三名杰出数据库工程师。因此,不宜在十名杰出数据库工程师中再排出具体名次。

经过评审委员会委员认真讨论,评审委员会建议组委会取消原评选细则中关于前三名的设置。组委会在充分听取评审委员会专家意见之后,经慎重考虑决定取消原评选细则中关于前三名的奖项设置,由评审委员会评选出的前十名杰出数据库工程师排名不分先后。特此声明。


这一举措看来是恰当的,本来数据库工程的范畴已经太广,如果非要在不同的领域决出胜负,就有"关公战秦琼"之嫌。这次参赛的选手中,开发国产数据库的就有多人,再加上研究领域在Oracle/DB2/SQL Server的不同,可谓百花齐放了。

这些同我们关系不大,还是让我们一起欣赏一下各位评委专家的签名,都帅的很:
pingshenyijian
俺决定也要好好练字了。

星期日, 八月 13, 2006

《深入浅出Oracle》登上排行榜前三甲

« Oracle的TNS-12502 错误原因及解决 | Blog首页 | EVENT: FILE_HDRS 的信息来源 »


感谢大家的支持,《深入浅出Oracle》一书在China-Pub的计算机类本月销售排行榜上,攀升到第3位,留图为念:

BookSale

再次感谢大家对于本书的支持。

本书与7.22上市,在上个月的Oracle类中排于第一位,这个月算是进了一步。


备份的控制文件和新的数据文件

继续上一节的介绍:

我们可以想象,如果控制文件是从备份中恢复的,那么数据库在open过程中又将如何呢?

首先备份控制文件,打开数据库,增进检查点:

[oracle@jumper eygle]$ cp control01.ctl control01.ctl.bak
[oracle@jumper eygle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Fri Aug 11 10:46:05 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 139531744 bytes
Fixed Size 452064 bytes
Variable Size 121634816 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
SQL> alter system checkpoint;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

然后恢复旧的控制文件,mount数据库,转储数据文件头:

[oracle@jumper eygle]$ mv control01.ctl control01.ctl.n
[oracle@jumper eygle]$ mv control01.ctl.bak control01.ctl
[oracle@jumper eygle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Fri Aug 11 10:46:50 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to an idle instance.

SQL> startup mount;
ORACLE instance started.

Total System Global Area 139531744 bytes
Fixed Size 452064 bytes
Variable Size 121634816 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
Database mounted.
SQL> alter session set events 'immediate trace name file_hdrs level 10';

Session altered.

SQL> !

我们看控制文件的信息(选择一个文件):

DATA FILE #4:
(name #4) /opt/oracle/oradata/eygle/eygle01.dbf
creation size=0 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 4, index=4 krfil=4 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:61 scn: 0x0000.002acb1e 08/11/2006 10:44:38
Stop scn: 0x0000.002acb1e 08/11/2006 10:44:38
Creation Checkpointed at scn: 0x0000.0015078d 06/06/2006 09:41:54

再看数据文件头信息:

FILE HEADER:
Software vsn=153092096=0x9200000, Compatibility Vsn=134217728=0x8000000
Db ID=1407686520=0x53e79778, Db Name='EYGLE'
Activation ID=0=0x0
Control Seq=989=0x3dd, File size=1280=0x500
File Number=4, Blksiz=8192, File Type=3 DATA
Tablespace #4 - EYGLE rel_fn:4
Creation at scn: 0x0000.0015078d 06/06/2006 09:41:54
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x232bee1f scn: 0x0000.0007c781 recovered at 08/11/2006 10:11:26
status:0x0 root dba:0x00000000 chkpt cnt: 64 ctl cnt:63
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.002acb98 08/11/2006 10:46:24

我们注意到数据文件的chkpt cnt: 64 要大约控制文件的Checkpoint cnt:61,也就是说控制文件是旧的。

此时尝试打开数据库就会出现如下错误:

[oracle@jumper udump]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Fri Aug 11 10:51:20 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/opt/oracle/oradata/eygle/system01.dbf'
ORA-01207: file is more recent than controlfile - old controlfile

Oracle告诉我们,控制文件是旧的。此时我们可以通过重建控制文件或者从旧的数据备份开始恢复。

未完待续...


关于控制文件与数据文件头信息的说明

为了回答关于《深入浅出Oracle》中的一些疑问,引出本系列文章,讨论链接参考:

http://www.itpub.net/609499.html

上一讲中,我们说过:当我们使用file_hdrs事件来转储数据文件头信息时,Oracle会转储两部分信息,一部分来自控制文件,一部分来自数据文件,在数据库启动过程中,这两部分信息要用来进行启动验证。

在数据库open的过程中,Oracle要进行检查中包含以下两个过程:

第一次检查数据文件头中的Checkpoint cnt是否与对应控制文件中的Checkpoint cnt一致.
如果相等,进行第二次检查.

第二次检查数据文件头的开始SCN和对应控制文件中的结束SCN是否一致如果结束SCN等于开始SCN,则不需要对那个文件进行恢复.

对每个数据文件都完成检查后,打开数据库.同时将每个数据文件的结束SCN设置为无穷大.

通过以下过程我们来进一步说明一下这个内容。

我们来看以下来自控制文件部分(选取一个文件测试):

DATA FILE #4:
(name #4) /opt/oracle/oradata/eygle/eygle01.dbf
creation size=0 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 4, index=4 krfil=4 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:58 scn: 0x0000.002ac8ee 08/11/2006 09:48:29
Stop scn: 0x0000.002ac8ee 08/11/2006 09:48:29
Creation Checkpointed at scn: 0x0000.0015078d 06/06/2006 09:41:54
thread:0 rba:(0x0.0.0)
................
aux_file is NOT DEFINED

这部分中包含的重要信息有:
检查点计数: Checkpoint cnt:58
检查点SCN: scn: 0x0000.002ac8ee 08/11/2006 09:48:29
数据文件Stop SCN:Stop scn: 0x0000.002ac8ee 08/11/2006 09:48:29

我们再看来自数据文件头的信息:

FILE HEADER:
Software vsn=153092096=0x9200000, Compatibility Vsn=134217728=0x8000000
Db ID=1407686520=0x53e79778, Db Name='EYGLE'
Activation ID=0=0x0
Control Seq=979=0x3d3, File size=1280=0x500
File Number=4, Blksiz=8192, File Type=3 DATA
Tablespace #4 - EYGLE rel_fn:4
Creation at scn: 0x0000.0015078d 06/06/2006 09:41:54
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x232bee1f scn: 0x0000.0007c781 recovered at 08/10/2006 20:57:53
status:0x0 root dba:0x00000000 chkpt cnt: 58 ctl cnt:57
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.002ac8ee 08/11/2006 09:48:29
.......................

这部分中包含的重要信息有:
检查点SCN: Checkpointed at scn: 0x0000.002ac8ee 08/11/2006 09:48:29
检查点计数: chkpt cnt: 58 ctl cnt:57

这两者都和控制文件中所记录的一致。如果这两者一致,数据库启动时就能通过验证,启动数据库。

那么如果不一致呢?
Oracle则请求进行恢复。
我们看,从备份中恢复eygle01.dbf文件.
首先第一部分从控制文件中获得的信息是相同的:

DATA FILE #4:
(name #4) /opt/oracle/oradata/eygle/eygle01.dbf
creation size=0 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 4, index=4 krfil=4 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:58 scn: 0x0000.002ac8ee 08/11/2006 09:48:29
Stop scn: 0x0000.002ac8ee 08/11/2006 09:48:29
Creation Checkpointed at scn: 0x0000.0015078d 06/06/2006 09:41:54
...................
aux_file is NOT DEFINED

检查点计数: Checkpoint cnt:58
检查点SCN: scn: 0x0000.002ac8ee 08/11/2006 09:48:29
数据文件Stop SCN:Stop scn: 0x0000.002ac8ee 08/11/2006 09:48:29

而从文件头中获得的备份文件信息则是:

FILE HEADER:
Software vsn=153092096=0x9200000, Compatibility Vsn=134217728=0x8000000
Db ID=1407686520=0x53e79778, Db Name='EYGLE'
Activation ID=0=0x0
Control Seq=973=0x3cd, File size=1280=0x500
File Number=4, Blksiz=8192, File Type=3 DATA
Tablespace #4 - EYGLE rel_fn:4
Creation at scn: 0x0000.0015078d 06/06/2006 09:41:54
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x232bee1f scn: 0x0000.0007c781 recovered at 08/10/2006 20:57:53
status:0x0 root dba:0x00000000 chkpt cnt: 53 ctl cnt:52
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.002ac5f9 08/10/2006 20:58:21
...................................

我们看到此时备份文件的信息:
检查点是:Checkpointed at scn: 0x0000.002ac5f9 08/10/2006 20:58:21
检查点计数为:chkpt cnt: 53 ctl cnt:52

这两者不再一致,首先是检查点技术不一致,当前文件的chkpt cnt为53,小于控制文件中记录的58,Oracle可以判断文件是从备份中恢复的,或者文件故障,需要进行介质恢复。

我们看如果此时我们试图打开数据库,则Oracle提示文件需要介质恢复:

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'

执行恢复:

SQL> recover datafile 4;
Media recovery complete.

我们看看恢复完成之后,控制文件和数据文件的变化.
首先看控制文件的变化:

DATA FILE #4:
(name #4) /opt/oracle/oradata/eygle/eygle01.dbf
creation size=0 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 4, index=4 krfil=4 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:59 scn: 0x0000.002ac8ee 08/11/2006 09:48:29
Stop scn: 0x0000.002ac8ed 08/11/2006 09:48:29
Creation Checkpointed at scn: 0x0000.0015078d 06/06/2006 09:41:54
......................

检查点计数: Checkpoint cnt:59
执行了恢复之后,检查点计数较前增加了1

检查点SCN: scn: 0x0000.002ac8ee 08/11/2006 09:48:29
数据文件Stop scn: 0x0000.002ac8ed 08/11/2006 09:48:29
数据文件Stop scn和数据文件进行了同步。

数据文件头信息:

FILE HEADER:
Software vsn=153092096=0x9200000, Compatibility Vsn=134217728=0x8000000
Db ID=1407686520=0x53e79778, Db Name='EYGLE'
Activation ID=0=0x0
Control Seq=983=0x3d7, File size=1280=0x500
File Number=4, Blksiz=8192, File Type=3 DATA
Tablespace #4 - EYGLE rel_fn:4
Creation at scn: 0x0000.0015078d 06/06/2006 09:41:54
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x232bee1f scn: 0x0000.0007c781 recovered at 08/11/2006 10:11:26
status:0x0 root dba:0x00000000 chkpt cnt: 59 ctl cnt:58
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.002ac8ed 08/11/2006 09:48:29
..........................

我们看到此时数据文件的信息:
检查点是:Checkpointed at scn: 0x0000.002ac8ed 08/11/2006 09:48:29
这个检查点和控制文件中记录的stop scn一致,数据库启动可以顺利进行。

检查点计数为:chkpt cnt: 59 ctl cnt:58

我们打开数据库:

SQL> alter database open;

Database altered.

SQL> alter session set events 'immediate trace name file_hdrs level 10';

Session altered.

此时数据库恢复正常运行。
控制文件信息如下:

DATA FILE #4:
(name #4) /opt/oracle/oradata/eygle/eygle01.dbf
creation size=0 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 4, index=4 krfil=4 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:60 scn: 0x0000.002ac8ef 08/11/2006 10:19:30
Stop scn: 0xffff.ffffffff 08/11/2006 09:48:29
Creation Checkpointed at scn: 0x0000.0015078d 06/06/2006 09:41:54

此时stop scn被置为无穷大。
数据文件头信息如下:

FILE HEADER:
Software vsn=153092096=0x9200000, Compatibility Vsn=134217728=0x8000000
Db ID=1407686520=0x53e79778, Db Name='EYGLE'
Activation ID=0=0x0
Control Seq=984=0x3d8, File size=1280=0x500
File Number=4, Blksiz=8192, File Type=3 DATA
Tablespace #4 - EYGLE rel_fn:4
Creation at scn: 0x0000.0015078d 06/06/2006 09:41:54
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x232bee1f scn: 0x0000.0007c781 recovered at 08/11/2006 10:11:26
status:0x4 root dba:0x00000000 chkpt cnt: 60 ctl cnt:59
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.002ac8ef 08/11/2006 10:19:30

未完待续...