AnyBackup-在新建和执行 Oracle 定时任务时,提示 ORA-01017 或 ORA-01031 错误
关键字
Oracle、ORA-01017、ORA-01031
适用产品
· AnyBackup 5.0.x
· AnyBackup 6.0.x
· 超易备 5.0.x
问题描述
在 AnyBackup 中新建、编辑和执行 Oracle 定时备份任务时,可能出现下列错误之一:
· ORA-01031: insufficient privileges
· ORA-01017: invalid username/password; logon denied
上述错误可能在下列的三类操作中出现,具体描述如下:
· 在 AnyBackup 上新建或编辑 Oracle 定时备份任务,对实例进行授权,输入用户名密码后,点击完成按钮,界面弹出对话框,显示上述两个错误其中之一,如下图:


· 对 Oracle 定时备份任务发起完全备份、增量备份或事务日志备份后,查看任务监控和历史记录的执行输出,执行输出有错误信息提示,点击查看详情,界面弹出对话框,显示上述两个错误其中之一,如下图:

· 对 Oracle 定时备份任务发起浏览恢复后,查看任务监控和历史记录的执行输出,执行输出有错误信息提示,点击查看详情,界面弹出对话框,显示 “ORA-01017” 的错误,如下图:

问题影响
执行问题描述中的新建、发起备份任务和发起浏览恢复的三种操作,出现上述错误后,会导致以下三种问题发生:
Oracle 数据库实例无法授权,无法创建定时备份任务;
AnyBackup对 Oracle 数据库完全备份、增量备份、事务日志备份失败;
AnyBackup对 Oracle 数据库进行浏览恢复、高级恢复失败。
问题原因
出现上述两个 Oracle 错误提示的原因均是访问当前数据库实例时,权限认证失败。权限认证失败的具体原因有以下三种,并且对于同种问题原因,在不同的操作场景出现,其更深层次的原因也不尽相同,具体如下:
原因一:对实例进行授权的用户名或密码错误
场景一:新建或编辑 Oracle 定时备份任务,对实例进行授权时弹出对话框提示上述错误
原因可能是输入的用户名或密码错误,导致 AnyBackup 使用错误的用户名或密码访问 Oracle 数据库,认证失败,授权失败。
场景二:Oracle 定时备份任务创建成功,但执行备份或恢复时出现上述错误
原因可能是在任务创建后,授权用户被删除,或者授权用户的密码发生变更,导致 AnyBackup 使用错误的密码访问 Oracle 数据库,认证失败。
原因二:对实例进行授权的用户没有 sysdba 的权限
场景一:新建或编辑 Oracle 定时备份任务,对实例进行授权时弹出对话框提示上述错误
原因可能是输入的数据库用户没有 sysdba 的权限,导致 AnyBackup 使用此用户远程访问 Oracle 数据库,以 sysdba 角色登入时,权限认证失败。
场景二:Oracle 定时备份任务创建成功,但执行备份恢复时出现上述错误
原因可能是在任务创建后,授权用户的 sysdba 角色权限被回收,导致 AnyBackup 使用此用户远程访问数据库,以 sysdba 角色登入时,权限认证失败。
原因三:Oracle 数据库实例的密码文件认证存在问题
密码文件用于具有 sysdba 身份的用户远程登录数据库, AnyBackup 远程访问 Oracle 数据库时,使用的就是密码文件认证的方式,若密码文件认证被禁用、密码文件丢失或密码文件认证信息不正确,均会导致 AnyBackup 无法远程访问 Oracle 数据库,返回“ORA-01017 、 ORA-01031 两个错误之一。
解决方案
整体的解决思路是从用户名密码正确性、授权用户有无 sysdba 角色权限以及密码文件认证是否正常三个层面逐步排查,找到出现问题的真正原因,再以与之对应的解决措施解决问题,详细操作步骤请参考下文。
步骤一:确认授权实例时输入的用户名及密码是否正确
1.确认 Oracle 数据库 DBA 提供的用户名密码,在授权时是否输入错误,重新尝试输入进行验证。
2.若用户名密码输入正确,认证时还弹出相同的错误对话框,则联系 Oracle 数据库 DBA 确认提供的用户名和密码是否正确,获取到正确的用户名和密码后,再重新新建或编辑任务,对实例授权,配置正确的用户名和密码。
步骤二:确认授权实例的用户是否有sysdba角色的权限
检查是否是因为给实例授权的用户没有 sysdba 权限导致登录 Oracle 数据库出错,如果没有则为该用户授予 sysdba 权限,或者更换拥有 sysdba 权限的用户给实例授权:
1.通过远程连接的工具远程登录到 Oracle 数据库服务器后台。
2.对于 Windows 操作系统,按下 WIN + R 键,输入 cmd 命令进入命令提示符,执行下列命令登入Oracle 数据库:
set ORACLE_SID=<sid>
sqlplus / as sysdba
对于Linux/Unix 操作系统,直接打开终端,执行下列命令登入 Oracle 数据库:
export ORACLE_SID=<sid>
sqlplus / as sysdba
说明: <sid> 为 AnyBackup 要备份的 Oracle 数据库实例名,实例名区分大小写。
3.进入 Oracle 数据库后,执行下列 SQL 语句查询当前实例下有 sysdba 角色权限的用户:
select username from v$pwfile_users where sysdba='TRUE';
4.若查询结果 username 的值中不包含 Oracle 定时备份任务中给实例授权的用户,则执行下列命令给用户授权:
grant SYSDBA to <username>;
说明: <username> 为定时备份任务中给实例授权的用户名,例如 sys 。
5.也可以在查询出拥有 sysdba 角色权限的用户之后,登入 AnyBackup 控制台,新建或编辑任务,重新对实例授权,输入有 sysdba 角色权限的用户名及其密码。
步骤三:确认密码文件认证是否存在问题
若执行完上述两个步骤,均已确认不是导致 Oracle 登录出错的原因,则继续执行以下步骤确认是否是密码文件认证存在问题导致登录 Oracle 数据库出错:
1.通过远程连接的工具远程登录到 Oracle 数据库服务器后台。
2.对于 Windows 操作系统,按下 WIN + R 键,输入 cmd 命令进入命令提示符,执行下列命令登入Oracle 数据库:
set ORACLE_SID=<sid>
sqlplus / as sysdba
对于Linux/Unix 操作系统,直接打开终端,执行下列命令登入Oracle数据库:
export ORACLE_SID=<sid>
sqlplus / as sysdba
说明: <sid> 为 AnyBackup 要备份的 Oracle 数据库实例名,实例名区分大小写。
3.进入 Oracle 数据库后,执行下列 SQL 语句查询当前实例是否禁用了密码文件认证:
show parameter password;
若 VALUE 为 EXCLUSIVE 或者 SHARED,表示当前实例允许使用密码文件认证;
若 VALUE 的值为 NONE ,则表示当前实例已经禁用密码文件认证。此时,我们需要执行下列 SQL 语句将 remote_login_passwordfile 的值改为 EXCLUSIVE:
首先检查数据库实例启动使用的是 spfile 还是 pfile,执行下面的命令进行确认:
show parameter spfile;
若值不为空,显示了 spfile 文件的位置,则说明实例是通过 spfile 启动的,执行下面的命令修改 remote_login_passwordfile 的参数值,修改后重新启动实例生效:
alter system set remote_login_passwordfile=exclusive scope=spfile;
若值为空,则说明实例是通过 pfile 启动的,需要确认当前实例是通过哪个 pfile 文件启动的,可以通过查询告警日志中记录的实例启动日志确认。
告警日志位置确认方法如下:
对于 Oracle10g 及其之前版本,可以通过执行下列命令确认:
show parameter background_dump_dest;
对于 Oracle11g 和 12c 的版本,可以通过执行下列 SQL 语句查询:
select * from v$diag_info where NAME='Diag Trace';
VALUE 的值就是告警日志的父目录,此目录下以 alert 开头的文件就是告警日志文件,查询告警日志获取实例启动时用到的 pfile 文件位置。
使用编辑器打开告警日志中查到的 pfile 文件,修改 remote_login_passwordfile 的值为 EXCLUSIVE,修改完成后,关闭实例并使用此 pfile 文件重新启动实例。
实例重新启动后,执行下列命令查询修改是否生效:
show parameter password;
若 VALUE 为 EXCLUSIVE ,则说明修改成功。
4.确保 remote_login_passwordfile 的值改为 EXCLUSIVE 后,执行下列 SQL 语句查询密码文件是否存在:
select * from v$pwfile_users;
能查询出来结果,则说明存在密码文件,若查询不到任何内容,则需要手动创建密码文件。
对于 Windows 操作系统, Oracle 密码文件的默认位置是 %ORACLE_HOME%/database 文件夹,密码文件的名称必须为 pwd <%ORACLE_SID%>.ora ,执行下列命令进行创建:
执行下列命令前,首先得保证在 Oracle 家目录的所在的盘符下,可以执行盘符加冒号的命令切换到正确的盘符,例如切换到D盘可以输入 D: 回车执行。
cd %ORACLE_HOME%/database
orapwd file = pwd<sid>.ora password = <password> force = y nosysdba = n
说明:<sid> 为 AnyBackup 要备份的 Oracle 数据库实例名,实例名区分大小写,<password> 为 sys 用户的密码。
对于 Linux/Unix 操作系统, Oracle 密码文件的位置必须在 $ORACLE_HOME/dbs 目录下,密码文件的名称必须为 orapw<ORACLE_SID>,执行下列的命令进行创建:
orapwd file = $ORACLE_HOME/dbs/orapw<sid> password = <password> force = y ignorecase = n
说明:<sid> 为 AnyBackup 要备份的 Oracle 实例名,实例名区分大小写,<password> 为 sys 用户的密码。
5、密码文件创建成功后,再次登入数据库,执行 select * from v$pwfile_users; 查询,看能否查询出结果。查询出结果后,执行下列命令验证能否用口令文件认证用户远程连接:
sqlplus <user>/<password>@<sid> as sysdba
说明: <user> 为有sysdba角色权限的用户名, <password> 为其密码,<sid> 为 AnyBackup 要备份的 Oracle 数据库实例名,实例名区分大小写。
若执行上述命令能够成功登入数据库,则说明口令文件认证生效,可以正常远程登录;若上述命名执行后,还是报 “ORA-01017” 或 “ORA-01031” 的错误,则可能是创建密码文件时,输入的 password 参数值错误, password 的值必须是 sys 用户的密码,输入错误,需要重新创建密码文件,创建成功后,再执行远程登录的命令进行检查。
更多信息
更多关于 ORA-01017 和 ORA-01031 的错误排查信息,请参考 Oracle 官网文章:Troubleshooting ORA-1031 or ORA-1017 Errors When Connecting As SYSDBA (文档 ID 730067.1)。


