ORA-01017 When Connect SYSDBA by SQL Developer

在尝试使用SQL Developer用SYSDBA连接数据库时总是报ORA-01017错误。

ORA-01017: invalid username/password; logon denied

实际上用户名密码是正确的,并且在数据库服务器上使用SQL*Plus通过监听连接也是正常的。

[sourcecode language=”sql” light=”true”]C:\Users\Kamus>sqlplus "sys/oracle@orcl11g as sysdba"

SQL*Plus: Release 11.1.0.7.0 – Production on Fri Mar 12 12:17:01 2010

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

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 – Production
With the Partitioning, OLAP and Real Application Testing options

SQL> [/sourcecode]

真正的问题是因为数据库密码文件缺失了。在windows下,Oracle数据库密码文件是储存在%ORACLE_HOME%\database目录下,命名为PWD%SID%.ora。

密码文件不存在,数据库实例完全可以正常启动,只是在尝试通过监听登陆SYSDBA的时候就会报ORA-01017错误。

那么为什么在本地使用SQL*Plus是正常的,这实际上是一个错觉,因为在Windows中Oracle默认安装以后会在sqlnet.ora文件中设置SQLNET.AUTHENTICATION_SERVICES = (NTS),这表示支持“Windows NT native authentication”方式登陆数据库,也就是属于OSDBA组的Windows用户不用提供密码也可以通过SYSDBA登陆数据库。sqlnet.ora文件位于%ORACLE_HOME%\network\admin目录下。

我们随便使用一个不存在的用户名密码都是可以登录数据库的。

[sourcecode language=”sql” light=”true”]C:\Users\Kamus>sqlplus "NotExist/nopassword@orcl11g as sysdba"

SQL*Plus: Release 11.1.0.7.0 – Production on Fri Mar 12 13:10:49 2010

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

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 – Production
With the Partitioning, OLAP and Real Application Testing options

SQL>[/sourcecode]

修改SQLNET.AUTHENTICATION_SERVICES参数为NONE之后。

SQLNET.AUTHENTICATION_SERVICES = (NONE)

再次测试用SQL*Plus登陆,报ORA-01031错误,即使提供正确的SYS用户密码也会报同样的错误,因为此时密码文件不存在,不能通过密码文件校验SYS用户密码是否正确,而又不允许通过NTS方式登陆数据库。

[sourcecode language=”sql” light=”true”]C:\Users\Kamus>sqlplus "NotExist/nopassword@orcl11g as sysdba"

SQL*Plus: Release 11.1.0.7.0 – Production on Fri Mar 12 13:14:07 2010

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

ERROR:
ORA-01031: insufficient privileges

Enter user-name:[/sourcecode]

重新创建密码文件,保持sqlnet.ora文件中SQLNET.AUTHENTICATION_SERVICES = (NONE)。

orapwd file=D:\oracle\product\11.1.0\db_1\database\PWDorcl11g.ora password=oracle

这样就只能通过正确的SYS用户和密码才可以用SYSDBA登陆数据库了。

[sourcecode language=”sql” light=”true”]C:\Users\Kamus>sqlplus / as sysdba

SQL*Plus: Release 11.1.0.7.0 – Production on Fri Mar 12 13:18:32 2010

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

ERROR:
ORA-01031: insufficient privileges

Enter user-name:
C:\Users\Kamus>
C:\Users\Kamus>sqlplus sys/oracle as sysdba

SQL*Plus: Release 11.1.0.7.0 – Production on Fri Mar 12 13:18:44 2010

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

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 – Production
With the Partitioning, OLAP and Real Application Testing options

SQL>[/sourcecode]

同样在这种配置下,SQL Developer也可以正常用SYSDBA登陆数据库了。

We simply don’t need them anymore!

之前作为一个Oracle Employee,却总是在使用PL/SQL Developer(而且是破解版),这实在有些说不过去,但是如何找到一个合心趁手的能够在有条件的情况下比SQL*PLUS更方便的工具却实在不是一件简单的事情,以前期待tora被Quest收购以后会有长足发展,可惜,并没有看到最终的结果。

之前曾经说过,PL/SQL Developer对于我最难以割舍的是completion insight功能,当你记不住表、性能视图或者存储过程、函数的全名,PL/SQL Developer将会在你输入了几个字母之后自动提示。TOAD发展了那么多年,却一直没有提供相类似的功能。

但是现在完全免费的替代产品出现了,这就是Oracle SQL Developer,Oracle官方出品的开发工具,当然这个工具并不是今年才推出的,现在最新版本已经是1.5.1.54.40,但是,最早的1.0版本并不是那么好用,而现在,我可以郑重地推荐它了。

请注意,这个工具是完全免费的,可以通过这个链接下载。

以一个普通使用者(甚至说是一个并不是着重在开发上的数据库管理员)的身份比较一下Oracle SQL Developer和PL/SQL Developer。

1. 格式化的结果输出
这一点任何一个第三方工具都做得不错,是一个基本功能。

2. 自动提示
也就是上面提到的Completion Insight功能,可以说,Oracle SQL Developer拥有的功能以及速度绝对不亚于PL/SQL Developer,甚至有更人性化的表现。比如当你键入select * from,空格之后,Oracle SQL Developer会立刻给出一个当前用户下的所有Table的列表,如果继续键入比如DBA三个字母,那么列表将转换为DBA打头的所有数据字典。而如果你从一行的开头键入exec四个字母,那么当回车以后,Oracle SQL Developer会立刻给出一份所有可以执行的存储过程的列表。
最新版本中对于V$视图的提示有bug,相信很快就可以修改。

3. 代码美化功能
所有使用过PL/SQL Developer的朋友们应该都知道在最近这几版中都有一个PL/SQL Beautifier的功能,可以将一大串SQL语句格式化更容易阅读的样式。同样Oracle SQL Developer也提供了这样的功能,称之为Format,快捷键是Ctrl+F7。

4. 显示SQL的执行计划
在Oracle SQL Developer中快捷键是F6,同时也提供了显示Autotrace的结果,快捷键是F10(最新版本中似乎有点儿小bug,有时候需要按两次F10才能显示)

5. 会话监控
在PL/SQL Developer中我们可以显示当前数据库中的所有会话,点击某一个会话,在下方会显示该会话正在执行的SQL,正在经历的等待事件以及其它一些可以自定义的感兴趣的信息,Oracle SQL Developer同样提供了这个功能,可以在Tools -> Monitor Sessions菜单中找到它。

6. 快捷显示对象信息
比如写了一条SQL语句,其中牵涉到一张表,我们可能会想立刻看到这张表有哪些字段,这张表上有哪些约束哪些索引,如果是分区表有哪些分区,在PL/SQL Developer中我们会选中SQL语句中这张表的名字,然后右键 -> View,同样Oracle SQL Developer也提供了这个功能,同样可以鼠标右键选中表名 -> Popup Describe,另外还有快捷键Shift+F4。

7. 编写以及调试存储过程
我并不有太多的机会去编写一个很长的存储过程,因此这点我不敢对PL/SQL Developer和Oracle SQL Developer做过多的比较,但是我知道好几个版本的PL/SQL Developer(包括最新版)在编译存储过程的某些特定语句的时候会导致ORA-600错误,而在SQL*Plus里面直接编译则完全没有问题,很多客户出现了这个问题寻求我们的帮助,而我们的回答是,抱歉,这是PL/SQL Developer的问题我们不做技术支持,但是如果你要是改用了Oracle SQL Developer呢?恭喜你,虽然这是个免费的产品,但是仍然可以得到原厂商的技术支持。

好吧,具有了上述这些功能,至少对于我来说,Oracle SQL Developer已经完全具备了日常管理数据库的所有需要点,而且用起来一点儿也不觉得别扭,只是可能快捷键的改变需要适应一下。比如在PL/SQL Developer中执行一个SQL是F8,而Oracle SQL Developer则是F9,显示执行计划一个是F5而另外一个是F6,但是这都是小问题,不是吗?要知道人生总是在不断变化的,呵呵。

接下来是Oracle SQL Developer的闪光点,这些闪光点会让Oracle SQL Developer更加可爱。

1. 自动更新
Help -> Check for updates,将会自动将Oracle SQL Developer更新到最新的版本,包括多种插件。

2. 插件
这是多么令人兴奋的功能,要知道,在浏览器领域的Firefox,在Java开发工具领域的Eclipse,都是因为支持插件(或者称之为扩展)体系,并且有大量丰富的插件才成为了焕然一新的工具,噢,我知道PL/SQL Developer也是支持Plugins的,但是这么多年了,Plugins始终只有那几个。而Oracle SQL Developer才推出多久,我们已经可以看到像Fourth Elephant的Insider这样强大的扩展了,Insider一眼看上去简直就是一个Quest Spotlight for Oracle,虽然我对这个插件不是那么感兴趣,但是你得承认它确实很强大。

3. 跨平台
PL/SQL Developer只能在Windows上使用,而Oracle SQL Developer目前已经支持了Windows,Mac OS X,Linux,这得益于Java的跨平台特性,好吧,我承认Java用于桌面应用确实速度有些让人不满意,但是对于Oracle SQL Developer来说,仅仅是启动速度有些慢而已,实际使用中仍然是行云流水的。而且得益于依靠Java,Oracle SQL Developer连接数据库,并不需要安装Oracle数据库客户端,这确实很方便。

4. Reports
一个新安装的Oracle SQL Developer就已经包含了一个Reports标签页,内置了一部分可以用于数据库管理的脚本,并且可以允许使用者自定义自己需要日常使用的脚本,而且支持复杂的父子视图效果,就是类似于Session Viewer的效果,点击父结果中的某一行,能够将更详细的关联信息显示在子结果中。每个DBA都有自己积累的一套SQL,你可以将它们全部放在Oracle SQL Developer中。

5. 多连接
在同一个Oracle SQL Developer界面里,可以连接多个数据库实例,虽然这不是什么复杂的功能,但是,PL/SQL Developer却做不到。

6. tkprof直观显示
用Oracle SQL Developer直接打开一个trc文件,将会出现一个图形化的界面,并且包含了几乎所有的tkprof功能,比如可以按照某个指标进行排序。

7. 免费
有什么东西比免费更吸引人呢?曾经在itpub上做过一个投票调查,目前使用PL/SQL Developer的Oracle DBA或者开发人员占据了超过60%,而其中绝大部分都在使用破解版。改为Oracle SQL Developer吧,你不用再去辛辛苦苦找最新的破解,你也可以自豪地说我现在用的开发工具是Free的,是正版的。

好吧,我承认Oracle SQL Developer是一个新产品,在很多小功能上确实还没有像PL/SQL Developer那样丰富。比如说也许我们需要一个command window,一个类似于SQL*Plus的界面,可以输入诸如archive log list或者show sga这样的命令,也可以仅仅输入edit 表名就可以弹出更改表结构的界面,输入edit 存储过程名就可以弹出编辑存储过程的界面;也许我们需要一个text import工具,可以方便地通过图形化界面将一个csv文件中的记录插入到一个表中;也许我们需要一个data gernerater工具可以方便地生成测试数据。

但是,这些都是小事儿,没有也就没有吧。另外,请相信Oracle的研发实力,短短的一年时间,Oracle SQL Developer已经开始引人瞩目了,而且Oracle一直在大力地研发这个工具在频繁地发布新版本,所以也许不久的将来这个工具将更好更强大。在这里可以看到大量使用者提出的Feature Request,很多已经被接收,将会出现在下一个版本中。

这篇文章不是一个正规的Oracle SQL Developer的产品功能或者说使用介绍,这仅仅是因为我作为一个普通的Oracle数据库顾问发现了一个免费的好用的工具(只不过恰巧这个工具是Oracle推出的而已)而感到欣喜之后的随意而为的文章,我很期待与已经在使用Oracle SQL Developer和看到这篇文章转而使用它的各位做更多的经验交流。

用一个使用者的感想做结,这个感想在Oracle SQL Developer的主页上也可以找到。

We’ve given up all of our licenses for other tools. We simply don’t need them anymore. Oracle SQL Developer does it all for us. We’ve saved a lot of money because it’s free. It’s also given our development staff a standard tool and they love it. It’s made training and support easier.

更多的讨论请参看在ITPUB中的专题贴