分类: Oracle
2014-03-06 16:01:32
分类: Oracle
在Oracle9i/10g的(11g还没有测试过) Data guard环境下,通过alter user sys identified by xxx 修改sys用户密码时,不会自动更新备库的密码文件。Oracle Dataguard环境的日志传输安全机制依靠Oracle生产库的密码文件,因此在具有Dataguard环境的灾备系统中,修改sys用户密码需要两种方式:
一、主库用alter user命令,备库用主库传过来的密码文件;
1、在主库通过alter user sys identified by sys_new_password后将主库的密码文件拷贝到备库相应目录,关闭备库并覆盖备库密码文件后启动备库。操作步骤如下:
SQL> alter system archive log current ;
System altered.
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> exit
[@more@]
SQL> alter user sys identified by newpasswd;
User altered.
$scp orapwrac1 oracle@192.168.1.6:/oracle/product/10.2.0/dbs
The authenticity of host '192.168.1.6 (192.168.1.6)' can't be established.
RSA key fingerprint is 6a:ef:bb:e0:4a:97:cb:5d:79:d0:a9:f3:95:73:9e:e2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.6' (RSA) to the list of known hosts.
Password:
orapwrac1 100% |**********************************| 1536 00:00
2、将主库的密码文件拷贝并覆盖到备库相应的目录
也就是说,在Oracle 备库需要将主库的密码文件拷贝到备库的$ORACLE_HOME/dbs目录下,关闭备库后覆盖原有的密码文件(以上已经进行关闭了)再启动备库。
具体操作步命令:
$mv orapwrac orapwrac_bak --将原来的密码文件做好备份
$ mv orapwrac1 orapwrac --替换生产库复制过来的password文件
SQL>startup mount
SQL>alter database recover managed standby database disconnect from session;
二、主库备库都用orapwd生成新密码文件
1、通过orapwd 来重建
重建密码文件可能导致其他拥有sysdba或sysoper权限的用户丢失权限。
在创建密码文件之前,应该先查询视图V$PWFILE_USERS,需要确定原本拥有sysdba和sysoper的用户是否还需要权限,如果需要,还要重新授权。
创建口令文件需要注意的是=前后没有空格!另外值得一提的是10g增加了一个新的参数force default值n,当同名文件存在时是否覆盖。创建完密码文件后需要复制到灾备库相应目录或采用force参数直接覆盖。具体操作命令:
orapwd file=/oracle/product/10.2.0/dbs/orapwtest password=system entries=5 force=y
2、将主库的密码文件拷贝到备库相应的目录,需要备库的重启
也就是说,在Oracle 备库需要将主库的密码文件拷贝到$ORACLE_HOME/dbs目录下,关闭备库后覆盖原有的密码文件(将备库关闭后,再进行拷贝覆盖)再启动备库。
具体操作步命令:
$scp oraprac1 oracle@192.168.1.6:/oracle/product/10.2.0/dbs
$mv orapwrac orapwrac_bak --将原来的密码文件做好备份
SQL>shutdown immediate --关闭备库
$ mv orapwrac1 orapwrac --替换生产库复制过来的password文件
SQL>startup mount
SQL>alter database recover managed standby database disconnect from session;
对备库密码文件要不要关闭后覆盖问题,有不同的说法,网上部分资料上说不必关闭,本人对此没有进行测试。但是对于在线生产系统,为了安全起见还是建议关闭后再覆盖(担心某个文件传到一半就(密码文件被修改)然后出现错误之类的)。
验证密码更新结果:
在主库或其他终端远程sysdba身份登录备库
SQL> conn sys/passwd@standby as sysdba;
Connected.
SQL> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
还要在备库的alertlog中观察主库归档日志(或日志)的传输和应用情况。
如下是关于Oracle 密码文件验证模式和OS验证模式概念及在windows上的测试:
1、os认证
oracle安装之后默认情况下是启用了os认证的,这里提到的os认证是指服务器端os认证。os认证的意思把登录数据库的用户和口令校验放在了操作系统一级。如果以安装oracle时的用户登录os,那么此时在登录oracle数据库时不需要任何验证,如:
SQL> connect /as sysdba
已连接。
SQL> connect sys/aaa as sysdba
已连接。
2、口令文件
oracle 的口令文件的作用是存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使用口令文件, 否则不能连上,由于sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说sys用户要想连接数据库必须使用口令文件。
在unix/linux下也可以在文件sqlnet.ora中增加SQLNET.AUTHENTICATION_SERVICES=(none)以及删除dba(groupdel dba)组或者把oracle用户从dba组中删除都可以屏蔽os认证。
如下是在windows环境的测试:
1、只要把oracle_home/NETWORK/admin/sqlnet.ora中的SQLNET.AUTHENTICATION_SERVICES= (nts)nts改成none或者注释掉这句话(在前面加上#),就可以屏蔽OS验证功能,要想以sys用户连上数据库必须输入正确的sys口令,如:
在SQLNET.AUTHENTICATION_SERVICES= (NTS)注释之前:
@>conn sys/aaa as sysdba --- aaa是并不是sys用户的密码,而随意输入的字母
已连接。
SYS@kuqlan10>conn sys/bbb as sysdba
已连接。
在SQLNET.AUTHENTICATION_SERVICES= (NTS)注释之后:
@>conn sys/aaa as sysdba
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
改回SQLNET.AUTHENTICATION_SERVICES= (NTS)原来设置后,修改sys用户的密码:
SYS@kuqlan10>alter user sys identified by kuqlan;
用户已更改。
SYS@kuqlan10>conn sys/ aaa as sysdba
已连接。
重新注释掉SQLNET.AUTHENTICATION_SERVICES= (NTS),通过密码文件来验证
@>conn sys/kuqlan as sysdba
已连接。
SYS@kuqlan10>conn sys/aaa as sysdba
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
警告: 您不再连接到 ORACLE。
@>
Data Guard中sys用户密码的修改通过覆盖或orapwd方式来解决的原因
数据库在没有OPEN时(对于DG来说mount状态下),通过alter user sys identified by sys_new_password命令无法修改密码的(无论在OS验证模式还是密码文件验证模式),因此备库只能通过密码文件覆盖方式来实现sys用户的密码更新,如下是Oracle在密码文件验证模式下的测试:
SYS@kuqlan10>shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SYS@kuqlan10>startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250476 bytes
Variable Size 587205460 bytes
Database Buffers 16777216 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SYS@kuqlan10>alter user sys identified by kuqlan1;
alter user sys identified by kuqlan1
*
第 1 行出现错误:
ORA-01109: 数据库未打开
SYS@kuqlan10>alter database open;
数据库已更改。
SYS@kuqlan10>alter user sys identified by kuqlan1;
用户已更改。
其他补充:
凡是修改具有sysdba or sysoper权限的用户,如果通过alter user来修改口令,那么同时修改了口令文件和数据库中的口令。
sys密码存放于文件,system存放于数据字典改动sys密码,一定要在副机未启动时,及时拷贝覆盖副机的文件。
在更改sys密码之前,首先应该检查$ORACLE_HOME/dbs目录下的密码文件是本地文件还是一个连接指向共享存储上的密码文件。对于密码文件是本地存储还是共享存储,对于RAC环境而言还是有点区别的。
如果是两个节点分别本地存储,那么最简单的方式莫过于在两个节点上分别执行:
alter user sys identified by sys_new_password;
如果是共享存储,那么执行一次就可以了,当然如果不确定,或者为了方便,也可以在两个节点上分别执行这个语句。所以对于RAC环境而言,修改SYS密码可以在每个节点上都运行一次alter user语句