记一次python连oracle数据库报ORA 01017

最近一直在搞自动化开发,说是开发,实际就是搞一些脚本。但我还是围绕着数据库来去做这些工作。

先说说场景

当前正在做针对ADG环境的自动切换工具,工具由python编写,通过cx_Oracle包实现,现在已经完全打通了,可以做到切换同时多套库,如果有新环境需要用工具切换,那么也只需要将其填入到配置文件中即可实现。

连接数据库的用户是一个专用用户,需要具备的权限为:connect,resource,dba,sysdba,前几个权限正常赋权,可sysdba这个后来发现是有问题的。

遇到的问题

遇到ORA-01017报错,很容易想到的是用户或密码错误导致的。开始我也是这么想的,而且也是逐步排查了以下几点:

  1. 用户是否区分大小写?这是11g有个参数,可以开是否区分大小写 SEC_CASE_SENSITIVE_LOGON=true,默认是开启的。
1
2
3
4
5
6
7
8
9
SQL> SELECT USERNAME,PASSWORD_VERSIONS FROM DBA_USERS;

USERNAME                       PASSWORD_VERSIONS
------------------------------ -----------------
JONES                          10G 11G 12C
ADAMS                          10G 11G
CLARK                          10G 11G
PRESTON                        11G
BLAKE                          10G

我们可以通过密码版本来观察用户的密码情况,10g是不区分大小写,不受SEC_CASE_SENSITIVE_LOGON影响,11g以上是区分的。

  1. 密码中是否有特殊符号?

我反复尝试了不同类型的密码,发现并不是密码的问题,因为改成最普通的只包含英文字符的密码也无法连接!

解决思路

其实也没有太好的办法,网上找了不少文章来看,然后不断地尝试。

python连接数据库

1
2
3
4
5
# 这种可以连
conn=cx_Oracle("user/pass@//xxx.xxx.xxx.xxx:1521/svr")

# 这种不可以
conn=cx_Oracle(mode=sysdba,user=user,password=pass,dsn=dsn)

二者区别就在于第二种有个sysdba,因此我怀疑是SYSDBA权限的问题,主库已经是赋权sysdba的了,但从库我认为是可以自动同步过去的。后来把dsn换成不同的实例,发现主库是可以连,而从库一直报'ORA-01017',至此,我知道问题应该出现sysdba不同步上了。

疑问

那为什么sysdba没有主从同步?可以通过Oracle Support找到答案。

image-20240411225448970

updatedupdated2024-04-112024-04-11