ora-01017本质是认证失败,主因是跨版本dblink连接时未用英文双引号包裹用户名密码,导致oracle自动转大写后与11g+默认大小写敏感的密码哈希不匹配;须强制使用"scott"和"tiger"格式,并确认远程用户有create session权限、密码文件有效且监听器配置正确。

ORA-01017 错误本质是认证失败,但问题往往不出在密码输错,而是 Oracle 对密码大小写的处理逻辑在跨版本连接时崩了——尤其 10g/11g/12c/19c 混用时,不加双引号几乎必现。
创建 DBLink 时必须对用户名和密码加双引号
Oracle 在存储 DBLink 的凭据时,会把未加引号的标识符自动转为大写。而从 11g 起,默认启用密码大小写敏感(PASSWORD_VERIFY_FUNCTION 和底层哈希机制决定),远程库实际校验的是原始大小写形式的密码。一旦本地建 link 时写 identified by tiger,Oracle 内部存成 TIGER,但远程库只认 tiger,就直接拒绝。
解决方法非常直接:
- 无论用户名、密码本身是否含大小写字母,只要涉及跨版本(如 10g→11g、11g→19c、12c→19c),一律用双引号包裹:
connect to "scott" identified by "tiger" - 引号必须是英文双引号
",不能用中文引号或单引号 - 如果用户名/密码里本身含特殊字符(如
@、$、空格),加引号更是强制要求,否则语法报错
确认远程用户具备 CREATE SESSION 权限
ORA-01017 有时是“假象”——表面是密码错,实则是远程用户根本没被授权登录。DBLink 连接复用的是远程用户的会话能力,不是本地权限。
需在远程库中执行验证:
- 用相同账号密码直连远程库:
sqlplus "scott/tiger@remote_tns",若失败,先解决这个 - 检查远程用户是否拥有
CREATE SESSION:SELECT privilege FROM dba_sys_privs WHERE grantee = 'SCOTT' AND privilege = 'CREATE SESSION'; - 没有就补授:
GRANT CREATE SESSION TO scott; - 注意:仅
CONNECT角色在较新版本中可能不隐含CREATE SESSION,显式授予更稳妥
注意监听器与网络层是否真正放行
ORA-01017 也可能由更底层的拦截导致——比如监听器只绑定了 localhost,或防火墙丢弃了连接请求,此时 Oracle 会伪造一个“密码错误”的响应来避免暴露服务状态。
快速排查点:
- 查远程库的
listener.ora,确认HOST值不是localhost或127.0.0.1,应为真实 IP 或0.0.0.0 - 远程执行
lsnrctl status,看Listening Endpoints Summary中是否列出你的客户端 IP + 端口(如(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521))) - Linux 上检查防火墙:
firewall-cmd --list-ports | grep 1521;Windows 上确认 TCP 1521 在“专用网络”配置文件中已放行 - 用
tnsping remote_tns测试 TNS 解析和基础连通性,成功 ≠ 认证成功,但失败一定拦在这里
19c 及以上版本要额外检查数据库角色与只读状态
如果你连的是 19c 物理备库(OPEN_MODE = READ ONLY WITH APPLY),即使用户名密码全对、权限齐全,仍可能报 ORA-01017——因为部分 19c RAC 备库默认禁用密码文件认证(REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE 未启用或密码文件缺失)。
关键检查项:
- 远程库执行:
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME = 'remote_login_passwordfile';,值必须是EXCLUSIVE或SHARED - 确认密码文件存在且包含该用户:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID entries=10 force=y(必要时重建) - 如果用户是通过外部认证(如 OS auth),DBLink 不支持,必须改用密码认证方式
- 备库上用户密码若近期重置过,需确保同步到了密码文件(
ALTER USER scott IDENTIFIED BY tiger;后,密码文件不会自动更新)
最常被忽略的一点:DBLink 创建后,它的凭据是静态存储的,不随远程用户密码变更自动刷新。哪怕你改了远程库的密码,也必须删掉旧 link、用新密码(带引号!)重建,否则永远卡在 ORA-01017。











