Oracle 中 orapwd 问题
Publish date: Oct 189, 18119
Last updated: Oct 219, 21029
Last updated: Oct 219, 21029
问
近期完成需求提测后,测试人员发现创建 11g oracle 快照库会失败。
报错信息如下:
答
查询日志
从日志中看到,错误原因是:
invalid username/password: logon denied
看上去,是用户名/密码登录的方式失败了。
尝试
自动登录失败了,于是我决定到 11g 的 oracle 数据库中亲自试验一遍流程:
第一步,生成 password 文件,使用的语句是:
su - oracle -c "orapwd file=/opt/oracle/products/dbs/orapwmaster1 password=oracle entries=10 force=y format=12"
结果执行完后,发现报了如下信息:
并没有执行成功,原因是在 11g 的 oracle 数据库上这条命令没有 format 参数
突然想起来,之前成功创建 oracle 快照库的环境都是使用的 oracle 12c 主库,
原来如此。
修正
代码中赶紧修复了下:
String cmd = String.format(OracleExecuteCmd.GenerateEncryptedFile.getCommand(), String.format(OracleSystemSetting.ORACLE_PASSWORD_FILE_PATH.toString(), sid), password) + (dto.getBefore12c() ? "": " format=12");
ShellUtils.runAndReturnSwitchUser(SystemConst.OracleUser.getStringValue(), cmd);
验证
我找到一台装有 oracle 12c 版本的虚拟机,进去执行了与上述相同的语句,执行成功了,可以看到执行后的结果如下:
是有 format 这个参数的,而且在 12c 之后的版本执行都会有 format 参数。
总结
那么 format 参数是什么,为什么 oracle 在 12c 这个版本加入了这么个参数呢?
缘起
从 Oracle Database 12.2.0.1 版本开始,
orapwd 这个工具为远程认证创建密码文件时,
会要求密码必须满足以下条件以符合安全性:
- 密码至少含有 8 个字符
- 密码不允许含有双引号
- 密码至少包含一个字母
- 密码至少包含一个数字
- 密码至少包含一个特殊字符
- 密码必须不能包含用户名
- 密码必须不能包含反转后的用户名
解决方案
- 使用满足条件的强密码,如
welcome1!
- 使用 12c 格式的密码文件,此时必须加上 format 参数,可以使用不满足这些条件的密码