Informix 11.5 新特性介绍tempdbs

来源:互联网 发布:知乎如何添加话题 编辑:程序博客网 时间:2024/05/22 02:17

数据库应用开发方面的一些实用特性   会话配置例程(Session Configuration Routines)   在 Informix 11 版本中,新增加了 sysdbopen( ) 和 sysdbclose( ) 内置 SPL 过程,使数据库管理员能在用户连接到数据库或从数据库断开连接时,自动执行相关的 SQL 和 SPL 语句。通过使用这两个 SPL 过程,我们可以在连接或访问时更改数据库服务器会话的属性,而不更改会话所运行的应用程序。这样,对于那些不能通过修改应用程序的源代码来设置环境选项(或环境变量)或包含与会话相关的 SQL 语句(例如,由于 SQL 语句包含从供应商处获得的代码)的情况,该操作非常有用。同样,对于自动化应用程序终止之后需要执行的操作,主要是清除操作,这两个程序也很有用。   如果 DBA 将用户的登录标识指定为名称是 sysdbopen( ) 的过程的所有者,当指定用户连接到数据库或从数据库断开连接时,Informix Dynamic Server 会执行该过程。如果 DBA 将 PUBLIC 指定为所有者,当不是任何这些内置会话配置过程所有者的用户连接到数据库时,会自动执行该例程。同样,当已连接到数据库的用户执行引用其他数据库中对象的分布式操作(如跨数据库或跨服务器查询)时,不会调用 sysdbopen( ) 例程。   同样,如果没有为该用户在数据库中注册 user.sysdbclose( ),当该用户关闭与数据库的连接时,将会自动调用另一内置过程 user.sysdbclose( ) 或 public.sysdbclose( ) 。   如果要更改会话的属性,可为各种数据库设计定制 sysdbopen( ) 和 sysdbclose( ) 过程以支持特定用户或 PUBLIC 组的应用程序。 sysdbopen( ) 和 sysdbclose( ) 过程可包含数据库服务器在数据库打开或关闭时为用户或 PUBLIC 组执行的一系列 SET、SET ENVIRONMENT、SQL 或 SPL 语句。   例如,对于 user1,可定义包含 SET PDQPRIORITY、SET ISOLATION LEVEL、SET LOCK MODE、SET ROLE 或 SET EXPLAIN ON 语句的过程,无论何时 user1 使用 DATABASE 或 CONNECT TO 语句打开数据库时,这些过程都将执行。   sysdbopen( ) 过程中由 SET ENVIRONMENT 语句指定的会话环境变量 PDQPRIORITY 和 OPTCOMPIND 的任何设置都将在整个会话期间保持。对于常规过程非持久的 SET PDQPRIORITY 和 SET ENVIRONMENT OPTCOMPIND 语句,在 sysdbopen( ) 过程包含它们时将保持。   当作为过程所有者的用户从数据库断开连接时,将运行 user.sysdbclose( ) 过程(或者此时将运行 PUBLIC.sysdbclose( ),前提是此过程存在且当前用户不具有任何 sysdbclose( ) 过程)。   使用 sysdbopen( ) 和 sysdbclose( ) 内置 SPL 过程的先决条件:只有 DBA 或用户 informix 能够在 SQL 的 ALTER PROCEDURE、ALTER ROUTINE、CREATE PROCEDURE、CREATE PROCEDURE FROM、CREATE ROUTINE FROM、DROP PROCEDURE 或 DROP ROUTINE 语句中创建或更改 sysdbopen( ) 或 sysdbclose( ) 。   设置 sysdbopen() 和 sysdbclose() 过程以配置会话属性的基本操作步骤:   将 IFX_NODBPROC 环境变量设置为任何值(包括 0)以使数据库服务器绕过和防止 sysdbopen( ) 或 sysdbclose( ) 过程的执行。   编写 CREATE PROCEDURE 或 CREATE PROCEDURE FROM 语句以定义特定用户或 PUBLIC 组的过程。   测试过程(例如,通过使用 EXECUTE PROCEDURE 语句中的 sysdbclose( ))。   取消设置 IFX_NODBPROC 环境变量以使数据库服务器能够运行 sysdbopen( ) 或 sysdbclose( ) 过程。   下面的程序为特定用户 usr1 设置角色,并将隔离级别设为 committed read 。 create procedure usr1.sysdbopen()   set role oltp;   set isolation to committed read;    end procedure;   这样,当用户 usr1 通过 DATABASE 或 CONNECT 语句连接到数据库时,将设置 oltp 角色,并将隔离级别设为 committed read 。   下面的程序设置 PUBLIC 组的角色和 PDQ 优先级。 create procedure public.sysdbopen()   set role others;   set pdqpriority 1;    end procedure;   这样,当用户通过 DATABASE 或 CONNECT 语句连接到数据库时,如果没有为该用户创建自己的 sysdbopen( ) 过程,他将执行 public.sysdbopen() 过程,设置 oltp 角色,并将 PDQ 优先级设为 1 。   下面的程序为 PUBLIC 组创建 sysdbclose() 过程。    CREATE PROCEDURE public.sysdbclose() INSERT INTO logit   VALUES(USER, “ O “ ,CURRENT::DATETIME YEAR TO SECOND);    END PROCEDURE;   这样,当用户断开数据库连接时,如果没有为该用户创建自己的 sysdbclose() 过程,他将执行 public.sysdbclose() 过程,将用户信息、操作状态及相应的时间戳的信息保存到 logit 表中。   Disabling logging for temporary tables   在 Informix 数据库中,我们经常会创建一些临时表来处理应用中的临时信息。系统可以采用如下两种方式创建临时表:   使用 SELECT INTO TEMP 语句隐含地创建临时表   使用 CREATE TEMP TABLE 语句显示地创建临时表   如果数据库采用非日志模式,DBSPACETEMP 环境变量或配置参数设置后,临时表会自动创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上;如果数据库采用日志模式,那么创建的临时表缺省情况下是记日志的,不会被创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上,那么由 SELECT ... INTO TEMP 语句创建的临时表将被创建在根数据空间(Root dbspace)上,由 CREATE TEMP TABLE 语句创建的临时表将被创建在数据库所在的数据空间上。如果希望临时表创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上,我们需要使用 SELECT INTO TEMP with no log 语句或 CREATE TEMP TABLE with no log 语句来创建临时表。   下边例子显示了在日志模式数据库中创建临时表的方法:    $ export DBSPACETEMP=dbs1,dbs2     SELECT number FROM account INTO TEMP tp1      Use with a logged database:    Temp table tp1 is created in the rootdbs:      SELECT number FROM account INTO TEMP tp2 WITH NO LOG      Temp table tp2 is fragmented across dbs1,dbs2:   临时表按照如下优先顺序创建在相应的数据空间上:   由 DBSPACETEMP 环境变量指定的数据空间   由 DBSPACETEMP 配置参数指定的数据空间   如果设置了 DBSPACETEMP 环境变量,那么临时表会创建在由 DBSPACETEMP 环境变量指定的数据空间上,如果没有设置 DBSPACETEMP 环境变量,那么临时表会创建在由 DBSPACETEMPP 配置参数指定的数据空间上。   出于性能考虑,一般我们建议在多个物理磁盘上创建多个临时表空间,这样,当创建临时表时,它会分片到所有临时表空间上,提高并发处理效率。   在采用日志模式的数据库中,对临时表的所有 DML 操作都要记日志,而且不加 with no log 选项,临时表不会创建在由 DBSPACETEMP 环境变量或配置参数指定的临时数据空间上,往往数据会写到根数据空间(Root dbspace)上,影响系统性能,而且用户在创建临时表时,往往总是忘记 with no log 选项。为了解决上述问题,Informix 11 版本开始提供了关闭对临时表记日志的方法,这样,建临时表时,即使没加 with no log 选项,临时表也会创建在由 DBSPACETEMP 环境变量或配置参数指定的临时数据空间上。   我们可以采用下述两种方法来关闭对临时表记日志:   修改 onconfig 配置参数 TEMPTAB_NOLOG 1   通过 onmode 命令动态改变 onmode -Wf "TEMPTAB_NOLOG =1"   onmode -Wm "TEMPTAB_NOLOG =1"   其中,-Wm 选项改变参数值后立即生效; -Wf 选项改变参数值后立即生效,同时将新的参数值写到 onconfig 配置文件中。   使用 TEMPTAB_NOLOG 参数来禁用临时表上的日志记录。该参数可以改进应用程序的性能,尤其是在有 HDR 辅助服务器、RS 辅助服务器或 SD 辅助服务器的数据复制环境中,因为其防止 Informix 通过网络传输临时表。   数据库高可用集群方面的一些实用特性   用户的关键业务系统,特别是 OLTP 系统,都要求提供 24X7 不间断的应用服务,这就要求数据库系统能够提供强大的高可用能力。这种能力不仅仅体现在主机及备机的接管方面,同时要能够提供远程容灾能力,以及本地的负载均衡能力。针对上述对数据库的要求,Informix 从版本 6 开始, 就提供了 HDR 技术,它是通过数据库的事务日志的方式实现了主、备机互相接管的功能,当主机工作时,备机提供只读功能,因此,备机可以提供查询、报表等功能,实现负载分担的功能,当主机发生故障,备机会自动接管,实现主机及备机的接管功能。从 Informix 7.2.2 版本开始,Informix 数据库提供了 ER(Enterprise Replication) 数据库复制技术,它也是通过读取数据库日志的方式实现数据同步功能,当源数据库数据发生变化后,Informix 数据库通过读取数据库日志,将变化的数据及时同步到目标数据库,采用 ER 的方式,和 HDR 不同,HDR 数据库的接管是基于数据库服务器的,也就是它的作用范围是基于整个实例的,而 ER 的作用范围是作用于一个表,你可以灵活定义需要复制哪些数据列及数据行,而且可以灵活定义数据复制的方式,是采用主从方式、汇总方式还是双向复制方式。从 Informix 11 开始,Informix 数据库提供了 SDS(Shared Disk Secondary)、RSS(Remote Standalone Secondary)、CLR(Continuous Log Restore) 等高可用集群技术,提供了更加强大的高可用能力。从 Informix 11.5 开始,HDR、SDS、RSS 备机都支持读写能力,提供了更强大的负载均衡能力。同时,从 Informix 11.5 开始,Informix 还提供了 Connection Manager 功能部件,它可以提供 SLA(Service Level Agreement) 功能,更好地实现负载均衡的能力,同时提供了 FOC(Fail Over Connection) 功能,实现透明故障接管能力,而且,所有这些对客户端应用来说是透明的。

原创粉丝点击