怎样在oracle rman 备份脚本中不写密码?怎样在应用程序连接中不写密码?
每一个Oracle DBA 都有写脚本调度数据库相关任务的经验,经常需要在shell 脚本里连接数据库,可能最让你头疼的是你不得不在脚本里写上明文的用户名密码来连接数据库,例如: connect scott/tiger@test 此类,毫无疑问,这会带来安全隐患。如果你想避免这种安全隐患,一般你有两种方法:1。 使用oracle db 的 os 认证。缺点也同样明显,你必须建立和db中账户相对应得os账户,对于普通帐户来说,这种方法勉强凑合,但是对于oracle来说,可能极不方便。例如你需要用oracle rman 备份数据库,而你不想在shell中写上你的密码。这时候用os 认证就显得极不方便。那么此时你可能需要第二种方法:Secure External Password Store。他的原理就是将oracle schema得认证信息存在客户端的wallet中。这样应用程序或者脚本就可使用诸如 “sqlplus /@test” 之类的语法来登陆数据库了。废话不多说,下面介绍一下他的配置步骤:
1. 使用如下语法创建一个wallet。wallet_location 是你放置wallet 的位置
1 2 3 4 5 | mkstore -wrl <wallet_location> -create oracle@host# mkstore -wrl /tmp/owm -create Enter password: Enter password again: |
2.使用刚才创建的wallet 创建一个数据库认证连接,我例子中的MYDB是一tnsnames.ora中的连接串。
1 2 3 4 | mkstore -wrl <wallet_location> -createCredential <db_connect_string> <username> <password> oracle@host# mkstore -wrl /tmp/owm -createCredential MYDB test test Enter wallet password: |
3.在client sqlnet.ora文件中加入如下两行:
1 2 3 4 5 6 7 8 9 10 | oracle@host# cat sqlnet.ora WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /tmp/owm) ) ) SQLNET.WALLET_OVERRIDE = TRUE |
4.现在你就可以使用诸如:”sqlplus /@MYDB” 或者 “rman target /@MYDB”连接数据库了。
1 2 3 4 5 6 7 8 9 10 11 12 13 | oracle@host# sqlplus /@MYDB SQL*Plus: Release 10.2.0.4.0 - Production on Fri Oct 14 09:29:54 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options SQL> show user USER is "TEST" |
5.列出当前wallet中的连接串
1 2 3 4 | oracle@host# mkstore -wrl "/tmp/owm" -listCredential Enter wallet password: List credential (index: connect_string username) 1: MYDB test |
6.也许有同学会问:我想用不同schema登陆数据库怎么办?oracle怎么知道我用的是哪个schema? 这个问题有两个解决办法:
1). 对于同一个db 增加另一个不同的tnsnames 连接串,然后给oracle wallet 增加一条不同的纪录,例如:
1 2 | oracle@host# mkstore -wrl /tmp/owm -createCredential MYDB1 scott tiger Enter wallet password: |
这时你用mydb1登陆进去就是scott schema了。
2). 创建另一个单独的wallet,不再举例
7. 我们也可以在java application 中使用这一功能:
1 | Connection conn = DriverManager.getConnection ("jdbc:oracle:oci:/@MYDB"); |
8. 使用如下命令删除或者更改已经存在的wallet
1 2 | mkstore -wrl <wallet_location> -modifyCredential <dbase_alias> <username> <password> mkstore -wrl <wallet_location> -deleteCredential <db_alias> |