今天下午测试了一下,发现不论Failover type是SESSION类型还是SELECT类型,TAF都不能把session级的参数failover过去。估计是由于session的变量存放在PGA 中,oracle做failover的时候只是选择性地对查询的上下文进行了迁移,漏掉了session参数。
目前有如下妥协性方案:
在数据库中建立一个触发器,判断一下,如果是需要设置nls参数的客户端登陆进来,就自动设置session参数。
服务器的timestamp格式是HH.MI.SSXFF AM,客户端自己设置YYYY-MM-DD HH24:MI:SS
下面是我测试用的,在failover后可以正常用自己格式的字符串插入时间数据。
create or replace trigger tgr_autosetnls
after logon on scott.schema
begin
insert into ip values (ora_client_ip_address); (这里是为了测试它能取到IP地址)
execute immediate 'alter session set nls_timestamp_format=''yyyy-mm-dd hh24:mi:ss''';
end;
/
目前有如下妥协性方案:
在数据库中建立一个触发器,判断一下,如果是需要设置nls参数的客户端登陆进来,就自动设置session参数。
服务器的timestamp格式是HH.MI.SSXFF AM,客户端自己设置YYYY-MM-DD HH24:MI:SS
下面是我测试用的,在failover后可以正常用自己格式的字符串插入时间数据。
create or replace trigger tgr_autosetnls
after logon on scott.schema
begin
insert into ip values (ora_client_ip_address); (这里是为了测试它能取到IP地址)
execute immediate 'alter session set nls_timestamp_format=''yyyy-mm-dd hh24:mi:ss''';
end;
/
测试结果:
[oracle@XXXXXXXX1 tmp]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#Public IP address
X.X.X.49 XXXXXXXX1
X.X.X.50 XXXXXXXX2
#Private IP address
X.X.X.1 XXXXXXXX1-priv
X.X.X.2 XXXXXXXX2-priv
#Virtual IP address
X.X.X.149 XXXXXXXX1-vip
X.X.X.150 XXXXXXXX2-vip
SQL> select * from ip;
IP
--------------------
X.X.X.50
X.X.X.150
第一次是用sqlplus直接登陆的因此用的是固定的IP(50),第二次登陆是failover,是oracle操作的,因此使用的是vip(150)
用这种方法,指定哪个用户登录的时候设置session参数,同时可以结合客户端IP地址进行判断。
下面是官方文档中的描述:
另外,如果需要随时手工设置其它session的参数,可以调用DBMS_SYSTEM包。可惜目前oracle只支持设置其它session的INT型和布尔型参数:
PROCEDURE SET_INT_PARAM_IN_SESSION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN
SERIAL# NUMBER IN
PARNAM VARCHAR2 IN
INTVAL BINARY_INTEGER IN
PROCEDURE SET_BOOL_PARAM_IN_SESSION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN
SERIAL# NUMBER IN
PARNAM VARCHAR2 IN
BVAL BOOLEAN IN
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#Public IP address
X.X.X.49 XXXXXXXX1
X.X.X.50 XXXXXXXX2
#Private IP address
X.X.X.1 XXXXXXXX1-priv
X.X.X.2 XXXXXXXX2-priv
#Virtual IP address
X.X.X.149 XXXXXXXX1-vip
X.X.X.150 XXXXXXXX2-vip
SQL> select * from ip;
IP
--------------------
X.X.X.50
X.X.X.150
第一次是用sqlplus直接登陆的因此用的是固定的IP(50),第二次登陆是failover,是oracle操作的,因此使用的是vip(150)
用这种方法,指定哪个用户登录的时候设置session参数,同时可以结合客户端IP地址进行判断。
下面是官方文档中的描述:
另外,如果需要随时手工设置其它session的参数,可以调用DBMS_SYSTEM包。可惜目前oracle只支持设置其它session的INT型和布尔型参数:
PROCEDURE SET_INT_PARAM_IN_SESSION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN
SERIAL# NUMBER IN
PARNAM VARCHAR2 IN
INTVAL BINARY_INTEGER IN
PROCEDURE SET_BOOL_PARAM_IN_SESSION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN
SERIAL# NUMBER IN
PARNAM VARCHAR2 IN
BVAL BOOLEAN IN
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26239116/viewspace-1075975/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26239116/viewspace-1075975/