ORACLE 12C 之 ORA-01017

ORACLE 12C 之 ORA-01017

1 错误信息

不管是在sqlplus 命令下,还是在程序连接都有可能会遇到这个问题, 特别是在数据库升级后, 或者是老程序连接新安装的Oracle12C 及以后版本的数据库。基本都会遇到这个问题。

ORA-01017:invalid username/password; logon denied

2 分析

 

2.1 sqlplus环境登录

oracle 12C 以后,数据库分为container 和 pdb 两个层面。在Container 里建用户与pdb 中建用户有所区别。 在Container 中建用户,需要以 ‘C##‘ 开头。如下:

SQL> create user test identified by test;
create user test identified by test
            *
ERROR at line 1:
ORA-65096: invalid common user or role name


SQL> create user C##test identified by test;

User created.

而在pdb 中建用户则不需要:

SQL> alter session set container=amscenter;

Session altered.

SQL> create user test identified by test;

User created.

对于这种,我们首先要确认的是,我们想要登录的是cdb,还是pdb。

  • 登录cdb

    登录cdb,则在用户名前加上 C##:

    SQL> grant connect,resource to c##test;
    
    Grant succeeded.
    
    SQL> conn c##test/test;
    Connected.
    
  • 登录pdb

    登录pdb,有两种方法,一种是使用tnsname,一种是先把当前环境切换到 pdb :

    -- 通过tns 可以正常登录
    SQL> conn scott/tiger@pdbboss
    Connected.
    -- 或者
    sqlplus test/test@amscenter
    

2.2 密码加密解析错误

Oracle 的密码加密方式,在不同的数据库版本中,是不尽相同的。 12C 以后的加密方式,无法识别过低版本驱动提供的加密后的密码。

针对这种情况,需要在数据库层面做如下操作:

  • 第一步:修改sqlnet.ora,加入以下两个参数:

    SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
    SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
    
    - 第二步:修改用户密码,生成支持低版本密码加密格式。
      #+BEGIN_EXAMPLE
    alter user &username identified by &password;
    

2.3 程序配置不满足条件

程序连接数据库的时候,一般是会配置连接串的,连接串有两种配置方法:

  • TNS连接串

    (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ai-csc-00)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = amscenter)))
    

    注意,这里最后一个参数要是SERVICE_NAME, 不能是sid.

  • 简易连接串

    ip:port/service_name
    

    注意最后是 / + service_name , 有些程序原来的的配置中使用并不是这种格式,比如 Ip:port:sid. 在低版本的数据库中没有问题,但是连接12C 及以后数据库时,就会出现 ORA-01017 错误。

Author: halberd.lee

Created: 2020-06-10 Wed 17:34

Validate

ORACLE 12C 之 ORA-01017

上一篇:centos 7 c++连接mysql的常用函数说明及使用样例


下一篇:Oracle RMAN备份数据库