Informix 11.70 系统管理认证考试 919 准备教程,第 3 部分: 系统活动监视

在本教程中,您将学习 IBM Informix® 数据库工具、监视数据库的实用程序,以及如何诊断问题。学习如何使用系统监视接口 (SMI) 和 SQL 管理 API。本教程帮助您准备参加 Informix v11.70 的系统管理认证考试 919 的第 3 部分。

Mu Yang, 顾问软件工程师, IBM China

Yangmu 的照片Yangmu 研究 Informix 领域已有 10 多年。他拥有 PMP 和 ITIL 认证的数据库设计、实现、维护和性能调优方面的丰富经验。Yangmu 成功帮助许多客户实施了升级、维护和性能优化项目。



Hedwig Fuchs, 高级支持工程师, IBM China

Hedwig Fuchs 的照片Hedwig Fuchs 在过去 14 年来一直在 Informix 技术支持部门工作。在加入 Informix 之前,她担任过顾问和程序员。在 IBM,她专攻数据库引擎相关工作。他的工作职责是分析问题,其中包括问题再现和代码分析。



2012 年 8 月 09 日

开始之前

免费下载:IBM® Informix® 11.7 试用版(包括 Ultimate Edition、Developer Edition 和 Innovator-C Edition)
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

关于本系列

正在考虑获得 Informix 11.70 版本的系统管理认证(考试 919)吗?如果是,那么您来对地方了。这个 Informix 认证准备教程系列 涵盖了您在参加考试前需要理解的所有主题。即使您目前没有获取认证的想法,这一系列教程仍然是您开始了解 Informix 11.70 中的新功能的不错地方。

关于本教程

在本教程中,您将学习如何使用一组 Informix 监视工具来监视和诊断问题。此处提供的材料主要涵盖考试第 2 部分(名为 “系统活动监视”)中的目标。本教程涵盖的主题包括:

  • 使用系统数据库监视和隔离问题
  • 消息日志
  • 使用 Informix 实用程序查看有关数据库服务器的信息
  • 使用 Scheduler 和 SQL Administration API 查看有关数据库服务器的信息
  • 并发性和锁定
  • 操作系统工具

目标

完成本教程后,您应该知道:

  • 如何使用 sysmaster 数据库
  • 要在消息日志中查找哪些内容
  • 如何使用 onstat 和 oncheck 实用程序
  • 如何使用 dbschema 实用程序
  • 如何使用调度程序
  • 如何使用 SQL Administration API
  • 不同类型的锁
  • 如何使用操作系统工具进行监视

前提条件

要理解本教程中提供的材料,您应该熟悉以下内容:

  • Informix 环境,包括配置文件、参数、安装和管理
  • Informix 概念和术语,包括 dbspace、数据块、物理日志、逻辑日志和检查点

系统需求

您不需要 Informix 副本即可完成本教程。但是,如果您 下载 Informix Innovator-C Edition 的免费试用版 来完成本教程的学习,您将会更好地掌握本教程。


使用系统数据库监视和隔离问题

数据库服务器创建和维护 sysmaster 数据库。它类似于数据库的系统目录,系统目录已在 IBM Informix Guide to SQL: Reference 中介绍过。就像数据库服务器管理的每个数据库的系统目录跟踪数据库中的对象和特权一样,每个数据库服务器的 sysmaster 数据库会跟踪有关数据库服务器的信息。

sysmaster 数据库包含系统监视接口 (SMI) 表。SMI 表提供有关数据库服务器的状态信息。您可以查询这些表来识别处理瓶颈,确定资源使用情况,跟踪会话或数据库服务器活动等。本文将介绍这些 SMI 表,这些表与普通的表稍有不同。

sysmaster 数据库中有许多表。请查阅手册了解详细信息。表 1 给出了 Informix 版本 11 中引入的一组新表。

表 1. 新的 sysmaster 表
表名称说明
sysbaract_logOnBar 活动日志文件
syscheckpoint检查点信息
syscluster高可用性集群信息
syscmsmsla连接管理器信息
syscmsmtab连接管理器信息
syscompdicts_full压缩字典信息
sysdual一个只有一行的表
sysenv在线服务器的启动环境
sysenvses会话级环境变量
sysha_lagtime从属服务器延迟时间统计信息
sysha_type有关连接的服务器的信息
sysha_workload 从属服务器工作负载统计信息
sysipl 索引页面日志信息
sysmgminfo内存授权管理器/并行数据查询信息
sysnetclienttype客户端类型网络活动
sysnetglobal全局网络信息
sysnetworkio网络输入/输出
sysonlinelog在线日志信息
sysprofile系统配置文件信息
sysrsslogRS 从属服务器信息
sysrstcb改进了对输入/输出和锁定等待信息的查看
sysscblst改进了对会话使用的内存的查看
syssqlcacheprof有关每个 SQL 缓存的配置文件信息
syssqltraceSQL 语句信息
syssqltrace_infoSQL 配置文件跟踪系统信息
syssqltrace_iterSQL 语句迭代器
syssrcrssRS 从属服务器统计信息
syssrcsdsSD 从属服务器统计信息
systcblst修改现有的表以添加等待统计信息
systrgrssRS 从属服务器统计信息
systrgsdsSD 从属服务器统计信息

理解 SMI 表

重要的使用说明

数据库服务器依赖于 sysmaster 数据库中的信息。不要更改 sysmaster 中的任何表或这些表中的任何数据。这些更改可能导致不可预测和不可靠的结果。数据库服务器在初始化磁盘空间时创建 sysmaster 数据库。数据库服务器使用未缓冲的日志来创建该数据库。您无法丢弃该数据库或其中的任何表,您也无法关闭日志。

作为 UNIX 上的用户 informix 或 Windows 上的 Informix 管理组的成员,您可以在 sysmaster 数据库中创建 SPL 例程。(您也可以在 sysmaster 中的表上创建触发器,但数据库服务器从不会执行这些触发器。)

请注意,联接 sysmaster 中的多个表可能会返回不一致的结果,因为数据库服务器不会在联接期间锁定这些表。您可以将 sysmaster 表与其他数据库中的表相联接。但是,要将 sysmaster 表与非日志数据库中的表相联接,首先需要将这个非日志数据库设置为当前数据库。

要重新构建 sysmaster 数据库,您应该联系技术支持人员来指导您使用 $INFORMIXDIR/etc/buildsmi 实用程序。

SMI 包含数据库服务器自动维护的表和伪表。尽管 SMI 表向用户显示为表,但它们不会像普通表一样记录在磁盘上。相反,数据库服务器基于该时刻共享内存中的信息,在内存中按需构建这些表。当您查询一个 SMI 表时,数据库服务器从共享内存结构读取信息。因为数据库服务器会持续更新共享内存中的数据,所以 SMI 提供的信息要求您检查您的数据库服务器当前的状态。

SMI 表提供有关以下主题的信息:

  • 审计
  • 检查点
  • 数据块输入/输出
  • 数据块
  • 数据库日志状态
  • Dbspace
  • 磁盘使用
  • 环境变量
  • 范围
  • 网络
  • SQL 语句缓存统计信息
  • SQL 语句
  • 系统配置文件
  • 用户配置文件
  • 虚拟处理器 CPU 使用情况

访问 SMI 表

只要您可以对普通表使用 SELECT,您可以在 SMI 表上使用 SELECT 语句(例如从 dbaccess、在一个 SPL 例程中、使用 Informix ESQL/C 等),但有一个限制:您在查询 SMI 表时无法(有意义地)引用行 ID。使用行 ID 的 SELECT 语句不会返回错误,但结果无法预测。所有标准 SQL 语法(包括表之间的联接、输出的排序等)都适用于 SMI 表。例如,如果您希望将一个 SMI 表与一个非 SMI 表相联结,可使用以下标准语法来命名该 SMI 表: sysmaster[@dbservername]:[owner.]tablename

任何用户都可以使用 SQL SELECT 语句查询 SMI 表,但标准用户无法运行除 SELECT 以外的语句。尝试运行其他语句的用户会收到权限错误。管理员可运行除 SELECT 外的 SQL 语句,但这些语句的结果无法预测。

提示:要获得更多可预测的结果,请查询与每个表关联的视图,而不要直接查询这些表。

Dynamic Server 包含 sysadtinfo 和 sysaudit 表。只有 UNIX 上的用户 informix 或 WIndows 上的 Informix 管理组成员可查询 sysadtinfo 和 sysaudit 表。

您无法在 sysmaster 数据库中的任何表上使用 dbschema 或 dbexport 实用程序。如果这么做,数据库服务器会生成以下错误消息:Database has pseudo tables - can't build schema

触发器和事件警报

您可以在 SMI 表上创建触发器,但它从不会执行。触发器仅在一个表上执行 INSERT、UPDATE 或 DELETE 语句时激活。对 SMI 数据的更新在数据库服务器内执行,无需使用 SQL,所以 SMI 表上的触发器从不会激活。

要创建事件警报,可以以预定义的间隔查询一个特定的条件,如果满足必要的警报条件,则会执行一个 SPL 例程。

SPL 和 SMI 表

您可以从一个 SPL 例程访问 SMI 表。当引用 SMI 表时,可以使用您用于引用标准表相同的语法。

锁定和 SMI 表

SMI 表中的信息基于数据库服务器活动进行变更。但是,数据库服务器不会使用 SQL 语句更新信息。当以一种锁定对象的隔离级别使用 SMI 表时,它会阻止其他用户访问该对象,但它不会阻止数据更改。从这种意义上讲,所有 SMI 表都有一种永久的脏读取隔离级别。

使用 SMI 表的示例

您可能想要一个打开了一个数据库的用户列表和这些用户用于连接该数据库的工作站列表。onstat -u 指示哪些用户连接到服务器,但没有指示他们在使用哪些数据库和工作站。onstat -g ses 指示用户和工作站,但没有指示数据库。onstat -g sql 指示会话 ID 和数据库,但没有指示用户名和工作站。

清单 1 shows an example query.

清单 1. 查询 sysmaster 中的 SMI 表
SELECT sysdatabases.name database, syssessions.username,
       syssessions.hostname, syslocks.owner sid 
FROM syslocks, sysdatabases, outer syssessions 
WHERE syslocks.tabname = "sysdatabases" 
AND syslocks.rowidlk =sysdatabases.rowid  
AND  syslocks.owner  =  syssessions.sid;

清单 2 显示了最终的输出。

清单 2. 查询 sysmaster 中的 SMI 表的结果
database stores_demo 
username informix 
hostname istation1 
sid 27

database  sysmaster  
username  informix  
hostname  istation1  
sid  29

使用 syslocks 表的示例

请查看 ysmaster 数据库中的 syslocks 表,看看它对排除锁定问题有何帮助。syslocks 表跟踪锁,类似于 onstat -k 的输出。清单 3 显示了 onstat -k 输出的一个样例行。

清单 3. onstat -k 的输出
Locks
address          wtlist  owner            lklist  type   tblsnum  rowid    key#/bsiz
700000011aee2a8  0       7000000704d3d30  0         S    100002   204    0       
7000000157f72a8  0       7000000704d4568  0     HDR+S    100002   204    0       
70000001d2092a8  0       7000000704d34f8  0         S    100002   204    0       
 3 active, 2000000 total, 262144 hash buckets, 0 lock table overflows

这里有大量数据,但还需要一定的工作才能获得有意义的信息。

查询 sysmaster 中 syslocks 表的示例

清单 4通过在 sysmaster 中执行该命令,显示了相同的锁。请注意,省略了 where 子句。

清单 4. 查询 sysmaster 中的 syslocks 表
Select * from syslocks 

dbsname stores_demo 
tabname customer 
rowidlk 256
keynum 0 
type X 
owner 28 
waiter

没有加密的部件编号 (tblsnum),使用了实际的数据库名称和表名称。在真实生活中,这样做更有用。onstat -k 输出中没有提供所有者的地址,SELECT 语句实际提供了一个会话 ID。所以,您可以运行 onstat-g sesonstat -g sqlonstat -g stm 来查找一个用户执行的什么操作导致了锁定。

请注意,查询 sysmaster 数据库的结果实际上是以十进制格式提供的,但 onstat 输出可能是以十六进制格式提供的。如果您尝试同时使用两种形态来跟踪一个问题,可能会引起混淆。

常见伪表的示例

许多伪表的名称通常很直观,与它们跟踪的资源相对应。请查阅 表 2 了解一些常见的伪表及其相应的 onstat 命令。

表 2. 常见伪表
表名称相应的 onstat 命令
sysconfigonstat -c
syschunksonstat -d(数据块部分)
sysdbspacesonstat -d(dbspace 部分)
syslogsonstat -l(逻辑日志部分)
sysprofileonstat -p ?onstat -F
sysptntabonstat -t
sysusersonstat -u
syslocksonstat -k

buildsmi 脚本

当第一次启动数据库服务器时,它会运行一个名为 buildsmi 的脚本,该脚本位于 etc 目录中。此脚本构建支持 SMI 的数据库和表。数据库服务器需要大约 1750 个空闲的逻辑日志空间页面来构建 sysmaster 数据库。如果您收到一条错误消息要求您运行 buildsmi 脚本,那么可能在数据库服务器构建 SMI 数据库、表和视图时产生了一个问题。

当您使用 buildsmi 时,现有的 sysmaster 数据库会被丢弃并重新创建。此脚本必需在确保在构建数据库期间没有连接到 sysmaster 数据库之后,以 UNIX 上的用户 informix 或 Windows 上的 Informix 管理组成员的身份运行。例如,如果 buildsmi 脚本开始运行时有一个调度程序任务正在运行,在调度程序尝试访问任何 sysmaster 表时该脚本会运行失败。在 UNIX 上,buildsmi 脚本运行时发出的错误会写入到文件 /tmp/buildsmi.out;在 Windows 上,会写入到文件 %INFORMIXDIR%\etc\buildsmi_out.%INFORMIXSERVER%,其中 %INFORMIXSERVER% 是 Informix 数据库服务器的名称。

bldutil.sh 脚本

sysutils 数据库是 OnBar 存储有关它执行的每个备份或还原信息的地方。有关每个 dbspaces 日志和逻辑日志的备份信息也存储在这里。OnBar 在执行热还原时使用这些表。

当您第一次初始化数据库服务器时,它会在 UNIX 上运行一个名为 bldutil.sh 的脚本或在 Windows 上运行 bldutil.bat。此脚本会构建 sysutils 数据库。如果它失败,数据库服务器会在 tmp 目录中创建一个输出文件。UNIX 上的输出文件是 bldutil.process_id;Windows 上的是 bldutil.out。此输出文件中的消息反映了在脚本执行期间发生的错误。

系统监视接口表

sysmaster 数据库包含许多表,可用于监视您的系统。数据库服务器支持以下 SMI 表:

syscheckpoint
syscheckpoint 表提供有关检查点的信息和统计信息。相应的 onstat 是 onstat -g ckp
syschunks
syschunks 表包含数据库服务器管理的每个数据块的描述。相应的 onstat 是 onstat -d
syslocks
syslocks 表提供有关数据库服务器中所有当前活动的锁的信息,相应的 onstat 是 onstat -k
syssqltrace
syssqltrace 表提供有关 SQL 语句的详细信息。相应的 onstat 是 onstat -g his
syslogs
syslogs 表提供有关逻辑日志文件中的空间使用的信息。相应的 onstat 是 onstat -l
syssessions
syssessions 表提供有关每个连接到数据库服务器的用户的一般信息。相应的 onstat 是 onstat -g ses

使用消息日志

Informix 消息日志是一个操作系统文件。数据库服务器将状态和错误消息写入消息日志文件。

位置

要指定消息日志路径名,可设置 MSGPATH 配置参数。对 MSGPATH 的更改会在您关闭并重新启动数据库服务器之后生效。

监视消息日志

您应该经常监视消息日志,以确保数据库服务器在正常运行,并且事件已按预期记录。使用 onstat -m 命令获取消息日志的名称和该文件的最后 20 行。使用一个文本编辑器阅读完整的消息日志。

监视消息日志大小,因为数据库服务器会将新条目附加到此文件。根据需要编辑日志,或者将它备份到磁带并删除它。

如果数据库服务器遇到一个故障,消息日志可用作从以后开发的事件追溯到问题的审计线索。数据库服务器常常会在消息日志中提供问题的准确性质和建议的更正操作。

消息类别

存在 4 种普通类别的未编号消息。一些消息不只属于一个类别。

  • 常规消息
  • 断言失败的消息
  • 需要的管理操作
  • 检测到的致命错误

例程信息的示例

清单 5 给出了一个属于常规信息类别的消息示例。

清单 5. 例程信息的消息示例
15:52:27  Maximum server connections 0
15:52:27  Checkpoint Statistics - Avg. Txn Block Time 0.000, # Txns blocked 0,
         Plog used 20, Llog used 12
15:52:27  Level 0 Archive started on rootdbs
15:52:28  Archive on rootdbs Completed.
15:53:07  Checkpoint Completed:  duration was 0 seconds.
15:53:07  Fri Apr  8 - loguniq 6, logpos 0xdfa018, timestamp: 0xa24db Interval: 21

断言失败示例

清单 6 给出了一个属于断言失败消息类别的消息示例。

清单 6. 断言失败消息的示例
18:39:07  Assert Failed: No Exception Handler
18:39:07   Who: Session(176, informix@testdb, 7263, c000000011012ef0)
		Thread(6457, xchg_3.0, c000000010feab00, 3)
		File: mtex.c Line: 491
18:39:07   Results: Exception Caught. Type: MT_EX_OS, Context: mem
18:39:07   Action: Please notify IBM Informix Technical Support.
18:39:07   See Also: /home/dump/af.1d21d84a, shmem.1d21d84a.0

管理操作需要的消息示例

清单 7 给出了一个属于管理操作需要的消息类别的消息示例。

清单 7. 管理操作需要的消息示例
11:05:49  Maximum  server  connections  4
11:08:05  Logical  Log  Files  are  Full  --  Backup  is  Needed

致命错误消息示例

清单 8 给出了一个属于致命错误消息类别的消息示例。

清单 8. 致命错误消息示例
20:29:19  Assert Failed: Unexpected virtual processor termination, pid = 25504, exit = 0x9

20:29:19  IBM Informix Dynamic Server Version 11.70.FC1    
20:29:19   Who: Session(2, informix@, 0, 0)
                Thread(9, soctcppoll, 0, 1)
                File: mt.c Line: 14549
20:29:19  stack trace for pid 25503 written to /home/informix/1170/tmp/af.3f1739e
20:29:19   See Also: /home/informix/1170/tmp/af.3f1739e
20:29:24  mt.c, line 14549, thread 9, proc id 25503,
                  Unexpected virtual processor termination, 
                  pid = 25504, exit = 0x9
.
20:29:24  The Master Daemon Died
20:29:24  PANIC: Attempting to bring system down

事件警报

数据库服务器提供了一种机制,该机制可基于数据库服务器环境中发生的事件自动触发管理操作。事件可用于提供信息(比如备份已完成)或者它们可指示一个需要注意的错误条件(比如无法分配内存)。要使用事件警报功能,可以将 ALARMPROGRAM 配置参数设置为一个执行必要管理操作的可执行文件的完整路径名。

数据库服务器可以执行一个在发生某些值得注意的事件警报或在每次发生任何事件警报时运行的程序。值得注意的事件警报包括数据库故障;表、索引、数据块或 dbspace 离线;内部子系统故障;启动故障以及较长事务的检测。您可以通过电子邮件或 pagermail 接收事件警报通知。

以下配置参数是特定于事件警报的。

ALRM_ALL_EVENTS
指定 ALARMPROGRAM 为 MSGPATH 中记录的所有事件运行还是仅为指定的值得注意的事件运行
ALARMPROGRAM
指定在发生一个事件警报时执行的一个文件的位置

自定义 ALARMPROGRAM 脚本

按照以下步骤自定义 alarmprogram.[sh|bat] 脚本。您可以使用 alarmprogram.[sh|bat] 代替 log_full.[sh|bat] 来自动化日志备份。

  1. 将 ADMINMAIL 的值更改为数据库服务器管理员的电子邮件地址。
  2. 将 PAGERMAIL 的值更改为寻呼机服务电子邮件地址。
  3. 在 UNIX 和 Windows 中分别使用 /usr/bin/mail 和 $INFORMIXDIR/bin/ntmail.exe 设置参数 MAILUTILITY 的值。
  4. 要写入逻辑日志时自动备份它们,可将 BACKUP 更改为 yes。要停止自动日志备份,可将 BACKUP 更改为除 yes 外的任何值。
  5. 在 ONCONFIG 文件中,将 ALARMPROGRAM 设置为 alarmprogram.[sh|bat] 的完整路径名。
  6. 重新启动数据库服务器。

严重级别为 1 或 2 的警报不会向消息日志写入任何消息,也不会发送电子邮件。严重级别为 3 或更高级别的警报会向数据库管理员发送电子邮件。严重级别为 4 和 5 的警报也会通过电子邮件通知一个寻呼机。

警惕警报脚本中的前台操作

要确保连续的服务器可用性,不要在警报脚本中运行某些前台操作。当服务器调用一个警报脚本时,服务器有时会等待脚本完成之后再继续执行。例如:

  • 当由于一个致命错误而调用一个警报时,服务器会等待脚本将信息写入错误日志。在某些情形下,警报事件 5 和 6 会在前台运行。
  • 一些企业复制事件警报会在前台运行,比如事件警报 31、34、37 和 39。

因为服务器可能需要等待警报程序脚本完成,所以不要在前台运行警报脚本中的以下操作:

  • 强制用户与服务器断开连接的 onmode 命令,比如 onmode -u 或 onmode -yuk。这些类型的 onmode 命令可能导致服务器和警报脚本之间发生死锁,因为服务器可能会等待警报脚本完成,而执行 onmode 命令的警报脚本会等待用户会话关闭,并且那些会话的其中一个本身正在运行警报脚本。
  • 可能花较长事件完成的操作或具有高度可变的运行时间的操作。花较长时间才能完成的操作可能会导致服务器在操作运行时看起来好像无响应。

如果您需要在警报脚本中运行上述操作,可使用以下一种操作系统实用程序在后台运行它们:

  • 在 UNIX 上,具有 nohup onmode -yuk & 的 nohup 实用程序告诉 nohup 继续运行该命令,即使它的父命令终止。& 符号在后台运行命令,所以它不会阻止警报程序脚本本身的执行。
  • 在 Windows 上,使用 start 实用程序和 /B 标志,比如 start /B onmode -yuk。

解释事件警报消息

数据库服务器向消息日志报告的一些事件也会导致它调用警报程序。这类消息指示数据库服务器报告的事件。数据库服务器在消息日志中报告一个非零的退出代码。在警报程序中,将 EXIT_STATUS 变量设置为 0 表示成功完成,将该变量设置为另一个数字表示失败。例如,如果一个线程尝试获取一个锁,但已达到锁的最大数量,那么数据库服务器会向消息日志写入一条消息,如 清单 9 中所示。

清单 9. 消息日志中的示例错误消息
10:37:22 Checkpoint Completed: duration was 0 seconds.
10:51:08 Lock table overflow - user id 30032, rstcb 10132264
10:51:10 Lock table overflow - user id 30032, rstcb 10132264
10:51:12 Checkpoint Completed: duration was 1 seconds.

ph_alert 表中的事件

生成的所有事件警报会插入到 sysadmin 数据库中的 ph_alert 表中。您可以在本地或远程服务器上查询 ph_alert 表,以查看针对该服务器的最新事件警报。您可以基于 ph_alert 表编写 SQL 脚本来处理事件警报,而无需使用由 ALARMPROGRAM 配置参数控制的脚本。在默认情况下,警报会在 ph_alert 表中保留 15 日才清除。

清单 10 给出了 ph_alert 表中的一个事件警报:

清单 10. 查询 sysadmin 中的 ph_alerts 表
SELECT * FROM ph_alerts WHERE alert_object_type=ALARM;

清单 11 给出了最终输出。

清单 11. 查询 sysadmin 中的 ph_alerts 表的输出
id 34
alert_task_id 18
alert_task_seq 10
alert_type INFO
alert_color YELLOW
alert_time 2010-03-08 12:05:48
alert_state NEW
alert_state_chang+ 2010-03-08 12:05:48
alert_object_type ALARM
alert_object_name 23
alert_message Logical Log 12 Complete, timestamp: 0x8e6a1.
alert_action_dbs sysadmin
alert_action
alert_object_info 23001

使用 Informix 实用程序查看有关数据库服务器的信息

本节介绍收集有关数据库服务器活动信息的实用程序。

onstat 实用程序

onstat 实用程序提供了一种方式来从命令行监视数据库服务器共享内存。onstat 实用程序从共享内存读取数据并报告在执行命令期间准确的统计信息。onstat 提供有关会话、用户、锁、表配置文件、缓冲区等的信息。

系统监视接口表(SMI 表)还提供了有关数据库服务器的共享内存信息。

监视数据库服务器状态

onstat 输出头指示数据库服务器状态。所有 onstat 输出都包含一个头。onstat -option 仅显示输出头,它对检查数据库服务器模式很有用。部的格式如 清单 12 所示。

清单 12. 头的格式
version--mode (Type)--(Checkpnt)--Up uptime--shmem_size Kbytes

清单 13 给出了一个示例头。

清单 13. 示例头格式
IBM Informix Dynamic Server Version 11.70.FC1 -- On-Line -- Up 01:44:23 -- 3040  Kbytes

表 3 给出了最常用的 onstat 选项。

表 3. 最常用的 onstat 选项
选项用途
-- 打印帮助文本
-b 打印缓冲区
-B 打印所有缓冲区
-c 打印配置文件
-C 打印 B 树扫描仪请求
-d 打印空间和数据块
-D 打印空间和详细的数据块统计信息
-F 打印页面刷新进程
-g <option > 打印监视选项
-G 打印全局事务 ID
-k 打印锁
-l 打印日志
-m 打印消息日志
-p 打印配置文件
-P 打印分区缓冲区摘要
-R 打印 LRU 队列
-s 打印闩锁
-t 打印 TBLspace
-T 打印表空间信息
-u 打印用户线程
-x 打印事务
-X 打印缓冲区共享者和等待者的完整列表
-z 清零配置文件计数
-a 解释为 onstat -mcuxskbPFhRtdGflLpO; onstat -g all; onstat -XC

从源文件读取统计信息

onstat 实用程序可从一个源文件读取信息,而无需从共享内存读取。这个文件必需包含您使用 onstat -o 命令创建的一个共享内存段。

使用 $> onstat -o dmpfile 将共享内存段的一个副本复制到 dmpfile。使用 $> onstat -k dmpfile 从 dmpfile 打印锁。

交互式执行

要将 onstat 实用程序设置为交互式模式,可以使用 -i 选项。交互式模式允许您输入多个选项而不用退出程序。

连续的 onstat 命令执行

结合使用 onstat -r 选项和其他 onstat 选项会使其他选项在指定的时间间隔内重复执行。

在服务器离线时执行 Onstat

如果服务器离线,您可以运行 表 4 中列出的 onstat 命令。

表 4. 您可在服务器离线时运行的 onstat 命令
onstat 命令用途
onstat -c 显示 ONCONFIG 文件
onstat -m 显示数据库服务器消息日志的最新 20 行
onstat -g dis 显示一个计算机上的数据库服务器列表
onstat -g osi 显示有关您的操作系统资源和参数的信息

oncheck 实用程序

oncheck 实用程序显示有关数据库磁盘配置和使用的信息,比如用于一个表的页面数量、保留页面的内容以及表中盘区的数量。oncheck 实用程序可检测磁盘结构中的不一致性,可修复磁盘结构中的一些不一致性。

表 5 给出了 oncheck 选项。

表 5. oncheck 选项列表
选项用途
- cr 检查保留的页面
- cR 检查保留的页面,包括逻辑和物理日志
- ce 检查盘区
- cc 检查数据库目录
- ci 检查表索引
- cI 检查表索引和行 ID
- cd 检查 TBLspace 数据行,包括位图
- cD 检查 TBLspace 数据行,包括位图、剩余页面和 BLOB
- cs 检查 SBLOBspace 元数据分区
- cS 检查 SBLOBspace 元数据分区和 LO 盘区
- pr 打印保留的页面
- pR 打印保留的页面,包括逻辑和物理日志
- pe 打印盘区报告
- pc 打印目录报告
- pk 打印索引中的键
- pK 打印索引中的键和行 ID
- pl 仅打印叶节点键
- pL 打印叶节点键和行 ID
- pd 打印 TBLspace 数据行
- pD 打印 TBLspace 数据行,包括位图、剩余页面和 BLOB
- pt 打印 TBLspace 报告
- pT 打印 TBLspace 磁盘利用情况报告
- pp 打印给定表的转储页面
- pP 打印给定数据块编号和页码的转储页面
- pB 打印 BLOBspace 利用情况
- ps 打印 SBLOBspace 元数据分区
- pS 打印 SBLOBspace 元数据分区和 LO 盘区

Oncheck 检查和修复

oncheck 实用程序可修复以下类型的磁盘结构:

  • 分区页面统计信息
  • 位图页面
  • 分区 blobpage
  • blobspace blobpage
  • 索引
  • sbspace 页面
  • sbspace 的元数据分区

使用 -y 选项可告诉 oncheck 自动执行修复。如果不使用 -y 选项,oncheck 在遇到不一致处时会提示您,允许您请求一次修复。如果指定选项 -n,oncheck 不会执行修复。

Oncheck 和锁定

oncheck 实用程序会在执行以下操作期间将一个共享锁放在一个表上,以便检查完成之后,其他所有用户可以执行更新、插入或删除操作:

  • 当它检查数据时
  • 当它检查或打印索引时,以及当该表使用页面锁定时
  • 当她检查或打印索引时,以及当该表使用行锁定并且您指定 -x 选项时

如果该表没有使用页面锁定,数据库服务器不会在使用 oncheck -ci、-cI、-pk、-pK、-pl 或 -pL 选项检查索引时在表上放置共享锁。如果在检查索引期间表上没有共享锁,其他用户可在检查期间更新行。

当表使用行级锁定以及在索引检查期间存在共享锁时,oncheck 实用程序无法保证索引检查的准确性。要绝对保证完整的索引检查,可以使用 -x 选项执行 oncheck。使用 -x 选项,oncheck 在表上放置一个共享锁,在检查完成之前所有其他用户都无法执行更新、插入或删除操作。

在服务器离线时执行 Oncheck

表 6 给出了在服务器离线时可以运行的 oncheck 命令。

表 6. 在服务器离线时可以运行的 oncheck 命令列表
oncheck 命令用途
oncheck -pr 在检查保留的页面时显示保留页面信息
oncheck -cr 针对一些条件检查每个 root dbspace 保留页面
oncheck -pP 显示一个页面的内容;需要一个数据块编号和页码
oncheck -pp 显示一个逻辑页面的内容;需要一个 TBLspace 编号(分区编号)和一个页码

例如,命令 $ oncheck -pp 0x200560 3 会得到 清单 14 中的结果。

清单 14. 打印 TBLspace 0x200560 的第三页
$ oncheck -pp 0x200560 3 

shared memory not initialized for INFORMIXSERVER 'ids1170uc1shm'
addr             stamp    chksum nslots flag type  frptr frcnt next   prev
2:253535         13554146 f72    12     801  DATA  1563  433   0      0

        slot ptr   len   flg
        1    24    127   0
        2    151   128   0
        3    279   128   0
        4    407   128   0
        5    535   128   0
        6    663   126   0
        7    789   126   0
        8    915   127   0
        9    1042  129   0
        10   1171  129   0
        11   1300  132   0
        12   1432  131   0
slot   1:
    0:  9 73 79 73 74 61 62 6c 65 73 69 6e 66 6f 72 6d   .systablesinform
   16: 69 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20   ix
   32: 20 20 20 20 20 20 20 20 20 20  0 20  5 60  0  0             . .`..
   48:  0  1  1 f4  0 1a  0  2  0  0  0  0  0 40 50 40   ...t.........@P@
.......

Oncheck 返回代码

oncheck 实用程序在退出时返回一个代码,如 表 7 中所示。

表 7. 退出时 oncheck 返回代码的列表
返回代码返回代码的含义
-1GLS 失败
1连接数据库服务器时出现的错误
2Onconfig 访问错误
2无效的 onconfig 设置
2无效的 oncheck 参数
2oncheck 检测到的错误
0oncheck 未检测到的错误
1未正确安装(Windows 独有的错误)
2身份验证错误(Windows 独有的错误)

dbschema 实用程序

dbschema 实用程序使用 SQL 语言显示数据库中(模式)的数据库对象的相关信息。它还生成再现存储空间、数据块、逻辑日志和物理日志的命令。您可以将 dbschema 实用程序用于以下用途:

  • 显示 UPDATE STATISTICS 语句创建的分布。
  • 显示创建数据库、表、视图、序列、同义词、过程、角色和特权等对象的模式。
  • 显示创建存储空间、数据块和日志的命令。
  • 显示有关用户定义的数据类型和行类型的信息。

以下是 dbschema 选项的一些示例。

清单 15. 显示一个数据库的模式而不指定所有者
$> dbschema -d h1 -nw
清单 16. 显示创建存储空间的命令
$> dbschema -d h1 -c

--  Dbspace 1 -- Chunk 1
--  EXECUTE FUNCTION TASK
 ('create dbspace', 'rootdbs', '/dbspaces/rootdbs', '200000', '0', '2', '500', '400');

--  Dbspace 2 -- Chunk 2
EXECUTE FUNCTION TASK
 ('create dbspace', 'dbs1', '/dbspaces/c1', '200000', '0', '2', '100', '100');

--  Physical Log
EXECUTE FUNCTION TASK
 ('alter plog', 'dbs1', '50000');
清单 17. 显示 UPDATE STATISTICS HIGH 语句创建的分布
$> dbschema -hd customer -d stores7

Distribution for informix.customer.fname
Constructed on 2011-10-14 08:29:25.00000
High Mode, 0.500000 Resolution
--- DISTRIBUTION ---
     (          Alfred          )
  1: (  1,   1, Alfred          )
  2: (  1,   1, Anthony         )
  3: (  1,   1, Arnold          )
  4: (  1,   1, Bob             )
  5: (  1,   1, Carole          )
清单 18. 显示特定于服务器的信息
$> dbschema -d h1 -ss

create table "informix".tab1
  (
    c1 integer,
    c2 char(20)
  )
  fragment by round robin in dbs1 , dbs2 , dbs3
  extent size 16 next size 16 lock mode page;

使用调度程序和 SQL 管理 API 查看有关数据库服务器的信息

您可以使用调度程序和 SQL 管理 API 管理自动维护和监视管理任务。这些 Informix Dynamic Server 组件使您能够简化复杂系统中的信息收集和服务器维护。

调度程序

调度程序可运行管理和维护任务,或者可在预定义时间收集信息。您可以使用内置的任务和传感器,也可以编写自己的任务和传感器来自定义自动维护任务。调度程序由 sysadmin 数据库中的一组表和一组存储过程控制。要查看、修改调度程序的组件,或者向调度程序添加新组件,您必需以用户 informix 或另一个授权用户的身份连接到 sysadmin 数据库。

调度程序有 4 种不同的作业类型:

任务
在特定的时间和频率运行一个操作。
传感器
在特定的时间和特定的频率收集和保存信息。创建一个结果表来保存这些信息。
启动任务
定义一个仅在数据库服务器从休眠模式转换到在线模式时运行的任务。
启动传感器
定义一个仅在数据库服务器从休眠模式转换到在线模式时运行的传感器。

内置的任务和传感器

调度程序包含自动运行的内置任务和传感器,如 表 8 中所示。

表 8. 内置的任务和传感器
任务或传感器说明是否默认启用?
alert cleanup此任务从 ph_alert 表删除早于阈值(15 天)的所有警告条目。
auto_crsd此任务压缩、精简、重新打包表和碎片并对其进行碎片整理。
autoreg exe此任务会在首次使用数据库扩展时对它们进行注册。
autoreg vp此任务根据需要为数据库扩展创建专门的虚拟处理器。
auto_tune_cpu_vps此任务在分配的虚拟处理器数量少于计算机上的 CPU 处理器数量的一半时会自动添加 CPU 虚拟处理器。
auto update statistics evaluation此任务分析所有记录数据库中的所有表,识别需要更新其分布的表,并为这些表生成 UPDATE STATISTICS 语句。
auto update statistics refresh此任务运行由 auto update statistics evaluation 任务所生成的 UPDATE STATISTICS 语句。
bad_index_alert此任务检查损坏的索引。
check_backup此任务检查以确保自阈值指定的时间以来运行了备份。
check_for_ipa此任务检查表中未完成的就地调整操作。
idle_user_timeout此任务终止已空闲超过 60 分钟的用户会话。
mon_checkpoint此传感器保存有关检查点的信息。
mon_command_history此任务删除 command_history 表中早于 30 天阈值的行
mon_config此传感器保存 onconfig 文件中的每个配置参数的最新值。
mon_config_startup此传感器在服务器启动时保存 onconfig 文件中每个配置参数的值。
mon_low_storage此任务扫描 dbspace 列表以查找低于 SP_THRESHOLD 配置参数指定的阈值之下的空间。然后该任务通过扩展数据块或添加数据块来扩展这些空间。
mon_memory_system此传感器收集服务器内存使用信息。
mon_profile此传感器保存服务器配置文件信息。
mon_sysenv这个启动传感器保存数据库服务器启动环境。
mon_table_names此传感器保存表名称和它们的创建时间。
mon_table_profile此传感器保存表配置文件信息。
mon_users此传感器保存每个用户的配置文件信息。
mon_vps此传感器收集虚拟处理器信息。
online_log_rotate此任务轮换在 MSGPATH 配置参数中指定的在线消息日志文件。
post_alarm_message此任务发布警告。

您可以通过更新 ph_task 表来更改内置的任务和传感器属性。您可以通过更新 sysadmin 数据库下 ph_task 表中的 tk_enable 字段来启用或禁用任务。清单 19 给出了一个更新 ph_task 表的示例,展示了如何启用任务 check_for_ipa 来检查未完成的调整操作。

清单 19. 通过启用任务 check_for_ipa 来检查未完成的就地调整操作
UPDATE ph_task set tk_enable = "t" where tk_name = "check_for_ipa"

清单 20 展示了如何将任务 mon_profile 配置为每 10 小时运行一次(而不是每 4 小时运行一次)并删除结果表中早于 20 天的数据(而不是删除早于 30 天的数据)。

清单 20. 配置任务 mon_profile
UPDATE ph_task 
set (tk_frequency,  tk_delete) = 
          (INTERVAL (10) HOUR to HOUR,  INTERVAL (20) DAY TO DAY)
where tk_name = "mon_profile"

创建一个新任务或新传感器

每个任务需要以下要素:

  • 任务的名称
  • 任务的描述
  • 任务执行的一个操作,它可能是用户定义的函数或 SQL 语句

每个传感器需要以下要素:

  • 传感器的名称
  • 传感器的描述
  • 传感器执行的一个操作,它可能是用户定义的函数或 SQL 语句
  • 将保存结果数据的表的名称
  • 针对将保存结果数据的表的 CREATE TABLE 语句

要创建一个任务或传感器,可使用 INSERT 语句向 ph_task 表添加一个新行。例如,清单 21 展示了如何创建一个尝试在每天 10:00 释放共享内存的任务。

清单 21. 创建一个尝试在每天 10:00 释放共享内存的任务
insert into ph_task (tk_name, tk_description, tk_type, tk_execute, tk_start_time)
values
("Free Memory",
"free unused shared memory segments",
"TASK",
"EXECUTE FUNCTION task ('onmode', 'F');",
DATETIME (10) HOUR TO HOUR);

创建阈值

可将阈值与当前值进行对比来确定一个任务或传感器是否应该运行。要创建阈值,可使用 INSERT 语句向 ph_threshold 表添加一个新行。编写任务或一个传感器操作来使用该阈值。

创建警告

要创建警告,可使用 INSERT 语句向 ph_alert 表添加一个新行。编写任务或一个传感器操作来创建警告。

创建组

可以使用组来组织调度程序任务和传感器。要创建组,可使用 INSERT 语句向 ph_group 表添加一个新行。

修改调度程序

可以修改调度程序任务、传感器、警告、组或阈值的属性。可以修改内置属性和您所添加的属性。要修改属性,可为合适的调度程序表使用 UPDATE 语句。

监视调度程序

调度程序拥有以下两种类型的线程:

  • dbWorker 执行计划的任务和传感器
  • dbScheduler 准备下一个计划运行的任务或传感器

可使用 onstat -g dbc 命令查看当前正在运行的任务和传感器。清单 22 给出了结果输出的示例。

清单 22. onstat -g dbc 的输出
    	Worker Thread(0)    46fa6f80         
=====================================
Task:                4729fc18         
Task Name:           mon_sysenv
Task ID:             4
Task Type:           STARTUP SENSOR                                         
Task Execution:      insert into mon_sysenv select 1, env_name, env_value FROM 
                     sysmaster:sysenv


WORKER PROFILE
    Total Jobs Executed             3
    Sensors Executed                2
    Tasks Executed                  1
    Purge Requests                  2
    Rows Purged                     0


Scheduler Thread    46fa6f80         
=====================================
Run Queue
    Empty
Run Queue Size        0
Next Task             7
Next Task Waittime    57

可通过查询 ph_run 表来查看已完成的任务和传感器的相关信息,如 清单 23 中所示。

清单 23. 查询任务 Free Memory 的最后执行时间和返回代码
select ph_task.tk_name, ph_run.run_retcode, ph_run.run_time
from ph_run, ph_task
where ph_task.tk_name = "Free Memory"
and ph_run.run_task_id = ph_task.tk_id;

结果输出如 清单 24 中所示。

清单 24. 查询任务 Free Memory 的最后执行时间和返回代码
tk_name             run_retcode run_time
Free Memory                   0 2011-04-05 10:40:19
1 row(s) retrieved.

启动和停止调度程序

可使用 SQL 管理 API 启动和停止调度程序。使用 EXECUTE FUNCTION task("scheduler start"); 启动调度程序。使用 EXECUTE FUNCTION task("scheduler stop"); 停止调度程序。

自动优化数据存储

内置任务 auto_crsd 允许您执行表和盘区的自动压缩、精简、重新打包和碎片整理操作。此任务默认已禁用。要启用此任务,可更新表 ph_task 并将 tk_enable 设置为 t

可通过更新表 ph_threshold 中的行来控制此任务。如果此任务正在执行压缩、重新打包、精简或碎片整理,则更新 AUTOCOMPRESS_ENABLED、AUTOREPACK_ENABLED、AUTOSHRINK_ENABLED 和 AUTODEFRAG_ENABLED 控制。

例如,如果您希望任务执行压缩和碎片整理,但不执行重新打包和精简,那么对 ph_threshold 表执行 UPDATE 操作,如 清单 25 中所示。

清单 25. UPDATE 语句
UPDATE ph_threshold
  SET value = 'T'
  WHERE name = 'AUTOCOMPRESS_ENABLED';
UPDATE ph_threshold
  SET value = 'F'
  WHERE name = 'AUTOREPACK_ENABLED';
UPDATE ph_threshold
  SET value = 'F'
  WHERE name = 'AUTOSHRINK_ENABLED';
UPDATE ph_threshold
  SET value = 'T'
  WHERE name = 'AUTODEFRAG_ENABLED';

以下行是在发生压缩、重新打包、精简或碎片整理时的阈值:

  • AUTOCOMPRESS_ROWS 是一个表中未压缩的行数。
  • AUTOREPACK_SPACE 是一个表中不连续的空间所占百分比。
  • AUTOSHRINK_UNUSED 是一个表或一个碎片中已分配的未使用空间所占百分比。
  • AUTODEFRAG_EXTENTS 是一个表或碎片中的盘区数量。

自动的空间管理

内置任务 mon_low_storage 支持在需要更多空间时自动添加更多存储空间。此任务默认已启用。此任务使用来自存储池的信息自动扩展一个现有的 dbspace、临时 dbspace、sbspace、临时 sbspace 或 blobspace。

可以通过更改 onconfig 参数 SP_AUTOEXPAND 和 SP_THRESHOLD 来控制该任务。将 SP_AUTOEXPAND 设置为 0 或将 SP_THRESHOLD 设置为 0 可禁用存储空间的自动扩展。将 SP_THRESHOLD 设置为一个值,定义在该任务扩展一个存储空间之前,该空间中可以存在的最少自由空间量。

SQL 管理 API

SQL 管理 API 支持在客户端工具中使用 SQL 函数执行远程管理。您可以执行更新配置参数、检查数据和配置存储空间等管理任务。也可以使用各种 Informix 管理实用程序完成其中多数任务。

SQL 管理 API 包含两个内置函数:admin() 和 task(),它们在 sysadmin 数据库中定义并使用 EXECUTE FUNCTION 语句调用。必须连接到 sysadmin 数据库才能运行这些函数。

这些函数接受一个或多个参数来定义该操作,如 表 9 中所示。

表 9. 可使用 SQL 管理 API 执行的管理任务
管理任务实用程序
压缩数据和优化存储
更新配置参数onmode
管理数据、分区和盘区onmode、oncheck -c、oncheck -p、onspaces
管理企业复制cdr
管理高可用性复制onmode -d、ontape
控制监听线程onmode -P
管理逻辑和物理日志onparams、ondblog
管理内存onmode、onparams
管理镜像onspaces
管理 PDQonmode
更改服务器模式onmode
管理存储空间onspaces
从一个存储池管理存储空间
管理 SQL 语句缓存onmode
管理 SQL 跟踪SQLTRACE onconfig 参数
管理一个用户、一个会话或一个数据库的 SQL 跟踪

以下是一些使用 SQL 管理 API 的示例。

清单 26 给出了检查盘区的 SQL 语句。这等效于 oncheck -ce 命令。

清单 26. 检查盘区的 SQL 语句
EXECUTE  FUNCTION  admin("check  extents");

清单 27 给出了在 dbspace physdbs 中创建一个 100 MB 大的物理日志的 SQL 语句。这等效于 onparams -p 命令。

清单 27. 在 dbspace physdbs 中创建一个 100 MB 大的物理日志的 SQL 语句
EXECUTE FUNCTION task ("alter plog","physdbs","100 M");

清单 28 给出了将当前逻辑日志文件切换到下一个逻辑日志文件的 SQL 语句。这等效于 onmode -l 命令。

清单 28. 将当前逻辑日志文件切换到下一个逻辑日志文件的 SQL 语句
EXECUTE FUNCTION task ("onmode", "l");

命令历史表

sysadmin 数据库中的 command_history 表包含有关在此服务器上执行的所有 SQL 管理 API 命令的信息。command_history 表显示正在运行的每个 SQL 管理 API 函数,以及以下相关信息:运行该函数的用户、该函数运行的时间、该函数的主要参数,以及在数据库服务器完成运行该函数时返回的消息。

清单 29 给出了来自 command_history 表中与在 Free Memory 任务中执行的 onmode 命令相关的信息。

清单 29. 来自 command_history 表的信息
cmd_number      110
cmd_exec_time   2011-04-05 10:40:19
cmd_user        informix
cmd_hostname    NA
cmd_executed    onmode
cmd_ret_status  0
cmd_ret_msg     OK

内置任务 mon_command_history 控制该表的大小。此任务已默认启用,它会删除此表中早于 30 天的行。可以更新表 ph_threshold 来缩短此时间段。

清单 30 展示了如何更新 ph_threshold 表来删除所有早于 20 天的行。

清单 30. 更新 ph_threshold 表以删除所有早于 20 天的行
UPDATE ph_threshold
SET value = "20"
WHERE name = "COMMAND HISTORY RETENTION";

Sysadmin 数据库

sysadmin 数据库包含若干个表,这些表含有并组织调度程序任务和传感器,存储传感器收集的数据,以及记录调度程序作业和 SQL 管理 API 函数的结果。

sysadmin 数据库包含以下内容:

  • 调度程序表
  • 结果表
  • 存储池表
  • command_history 表
  • 内置的 task() 函数
  • 内置的 admin() 函数

表 10 给出了 sysadmin 数据库中的表并描述了它们的用途。

表 10. sysadmin 数据库中的表
说明
ph_alert包含了与必须监视任务相关联的一组错误、警告或信息消息。
ph_group包含一组组名称。
ph_run包含有关如何和何时运行每个任务和传感器的信息。
ph_task列出任务和传感器,包含有关如何和何时运行数据库服务器的信息。
ph_threshold包含一组与任务或传感器关联的阈值。
结果表提供多个含有传感器收集的历史数据的表。这些表的结构由 ph_task 表中的传感器定义中的 CREATE TABLE 语句确定。
storagepool包含有关存储池中的所有条目的信息。每个条目表示服务器在自动扩展一个存储空间时可使用的空闲空间。
command_history包含运行的所有 SQL 管理 API 函数的列表和结果。

调度程序表和传感器结果表可能会使用大量磁盘空间。可以使用 SQL 管理 API 将 sysadmin 数据库从它默认的 root dbspace 位置转移到一个不同的 dbspace,如 清单 31 中所示。移动 sysadmin 数据库会将该数据库重置回最初创建时的原始状态,这意味着所有数据、命令历史、结果表和用户定义的任务都会丢失。

清单 31. 将 sysadmin 表转移到 dbspaces dbs1
EXECUTE FUNCTION task("reset sysadmin","dbs1");

理解并发性和锁定

当使用一种多线程或多进程架构时,并发性至关重要。以一种单线程方式访问数据会导致瓶颈,因为进程或线程必须等待资源。这可能显著减缓处理速度。将多个应用程序并行连接到数据库会更有效。

数据库服务器实施了一个锁系统。锁是一个程序可以强加在一块数据上执行的声明或预定。数据库服务器可保证,只要数据被锁定,其他任何程序都无法修改它。当另一个程序请求该数据时,数据库服务器要么让改程序等待,要么向它返回一个错误。

表 11 给出了 Informix 数据库服务器在不同情形下支持的锁类型。

表 11. 锁类型及其用途
锁类型用途
共享共享锁以只读形式保存其对象。它在锁存在时阻止对该对象进行更改。多个程序可在同一个对象上放置共享锁。多个对象可在共享模式下锁定时读取该记录。
独占独占锁保留其对象供单个程序使用。此锁在程序打算更改对象时使用。不能在任何存在其他类型锁的地方放置独占锁。放置独占锁之后,无法在同一个对象上再放置另一个锁。
提升(或更新)提升(或更新)锁建立更新的意图。只能将它放在没有其他提升或独占锁存在的地方。可以将提升锁放在已拥有共享锁的记录上。当程序将要更改锁定的对象时,可以将提升锁转换为独占锁,但前提是在该锁从提升转换为独占时记录上不存在任何其他锁(包括共享锁)。如果在设置提升锁时,记录上存在一个共享锁,必需丢弃该共享锁,才能将提升锁转换为独占锁。

隔离级别

在一个 SELECT 语句执行期间数据上放置的锁数量和持续时间取决于用户设置的隔离级别。隔离类型可能影响整体性能,因为它会影响并发性。表 12 列出了隔离级别类型及其用途。

表 12. 隔离级别类型
隔离级别类型用途
脏读隔离 脏读隔离(或 ANSI 未提交读)级别不会在一个 SELECT 语句执行期间在所获取的任何行上放置任何锁。脏读隔离适用于(用于查询的)静态表。
已提交读隔离 具有已提交读隔离(或 ANSI 已提交读)隔离级别的读取程序会在返回一行之前检查锁。通过检查锁,该读取程序就无法返回任何未提交的行。
游标稳定性隔离 具有游标稳定性隔离级别的读取程序需要当前所获取行上放置一个共享锁。此操作可保证任何其他用户在未获取一个新行之前都无法更新该行。
可重复读隔离 可重复读隔离(ANSI 可序列化和 ANSI 可重复读)是最严格的隔离级别。使用可重复读,数据库服务器能够在事务执行期间锁定所有检查的(而不仅仅是获取的)行。

使用 WITH CONCURRENT TRANSACTION

WITH CONCURRENT TRANSACTION 子句使您能够在一个事务在当前连接中仍处于活动状态时切换到一个不同的连接。要在一个事务仍处于活动状态时切换到另一个数据库,必需拥有 WITH CONCURRENT TRANSACTION 子句。没有此子句,如果一个事务处于活动状态,您将无法切换到不同的连接;CONNECT 或 SET CONNECTION 语句会失败并返回一个错误。当前事务会继续在活动的连接中处于活动状态。

WITH CONCURRENT TRANSACTION 子句支持多个并发事务的概念。因此每个连接可拥有自己的事务。COMMIT WORK 和 ROLLBACK WORK 语句仅影响当前连接。WITH CONCURRENT TRANSACTION 子句不支持全局事务(一个事务通过多个连接贯穿多个数据库)。COMMIT WORK 和 ROLLBACK WORK 语句不会通过多个连接操作数据库。

并发性和锁

始终存在这样的可能,当一个客户端正在修改数据时,另一个客户端将读取或尝试修改相同的数据。两个或更多客户端尝试访问该数据的情形称为并发访问。多用户数据库系统需要高水平的并发性。如果没有某种方法来控制对该数据的访问,并发性可能导致各种问题。客户端可能读取已修改或可能已删除的数据,或者一次更新可能在整理过程中丢失。

取决于 SET LOCK MODE 设置,如果另一个客户端请求该数据,数据库服务器要么让另一个客户端等待,要么告诉该客户端该资源不可用并生成一个错误。要控制锁对数据访问的影响,可结合使用 SQL 语句 SET LOCK MODE 和 SET ISOLATION 或 SET TRANSACTION。

具有最后提交的隔离级别的已提交读

如果隔离级别是 COMMITTED READ(SET LOCK MODE 未设置为 WAIT),那么若当前会话无法获取一个锁,其他持有锁的会话可能导致 SQL 操作失败。将 SET LOCK MODE 设置为 WAIT 也无济于事的另一种情形是死锁。在两个用户都持有对方想要的锁时就会发生死锁。SQL 语句 SET ISOLATION COMMITTED READ 上的 LAST COMMITTED 关键字选项会减少锁冲突的风险。此语法告诉服务器返回最近提交的行版本,即使另一个并发会话持有一个独占锁。可以为 B 树索引、函数索引、日志表和没有页面级锁或独占锁的表使用 LAST COMMITTED 关键字选项。

USELASTCOMMITTED ONCONFIG PARAMETER

USELASTCOMMITTED 指定一种能使 COMMITTED READ 隔离级别的 LAST COMMITTED 功能隐性生效的隔离级别。以下是 USELASTCOMMITTED 的值:

None
未标识任何隔离级别
Committed read
来自一个已提交读隔离级别的所有事务
Dirty read
来自一个脏读隔离级别的所有事务
All
已提交读和脏读隔离级别

与 onconfig 参数一样,对其值的更改只有在重新初始化共享内存后才会生效。

使用 onmode 影响隔离级别

当数据库服务器处于在线模式时,可以使用 onmode -wm 和 onmode -wf 选项更改 USELASTCOMMITTED 配置参数的值。要为当前会话的一个配置参数执行一个新值,可使用 onmode -wm USELASTCOMMITTED=value

要更改 ONCONFIG 中的某个配置参数的值,可使用 onmode -wf USELASTCOMMITTED=value

SET ENVIRONMENT SQL 语句

SET ENVIRONMENT SQL 语句可在运行时修改影响同一个例程中提交的后续查询的选项。这是对 SQL 中的 ANSI/ISO 标准的一项扩展。以下是与 onconfig 参数对应的 USELASTCOMMITTED 设置:

None
未标识任何隔离级别
Committed read
来自一个已提交读隔离级别的所有事务
Dirty read
来自一个脏读隔离级别的所有事务
All
已提交读和脏读隔离级别

从属服务器上的已提交读和已提交读一次最后提交的隔离级别

所有类型的从属服务器都支持已提交读和已提交读最后提交的隔离级别。设置了已提交读隔离的从属服务器可读取在本地提交的数据。它们也可以读取在可用主服务器上提交的数据,以及在从属服务器上提交的数据。

如果 UPDATABLE_SECONDARY 配置参数被禁用,那么从属数据复制服务器为只读。在此情况下,已提交读和已提交读最后提交的隔离级别不可用于从属服务器。


特定于每种操作系统的浏览工具

UNIX 工具

本节介绍仅可用于 UNIX 操作系统的工具。

系统活动报告程序 (sar)

sar 命令对监视 CPU 利用率、磁盘活动和内存利用率很有用。清单 32 中的示例以 3 秒为间隔监视 CPU 利用率 10 次。

清单 32. sar 示例
sar -u 3 10

SunOS IFXSUN 5.10 Generic_118833-36 sun4u    04/08/2011

16:42:06    %usr    %sys    %wio   %idle
16:42:09      27      26       0      47
16:42:12      26      25       0      49
16:42:15      26      24       0      50
16:42:18      30      29       0      41

要识别潜在的或实际的性能瓶颈或问题,有必要持续监视您的系统并在延长时间段内采集这些数据点。UNIX sar 命令对创建和维护长期性能历史很有用。

sar 可用于 IBM Informix 支持的所有硬件平台。当对一个指定的输出文件运行时,会创建一个二进制编码文件,其中所有的 sar 报告均可在一段时间后从该文件生成。

time 或 timex

time 和 timex 命令可用于对进程的运行计时。time 和 timex 都报告真实时间,以及用户和系统 CPU 时间。

ps

进程状态 (ps) 命令是有关当前运行系统进程的快照信息的一个不错来源,如 清单 33 中所示。

清单 33. 进程状态 (ps)
ps -el

 F S    UID   PID  PPID   C PRI NI     ADDR     SZ    WCHAN TTY         TIME CMD
 1 T      0     0     0   0   0 SY        ?      0          ?           0:39 sched
 0 S      0     1     0   0  40 20        ?    300        ? ?           0:27 init
 1 S      0     2     0   0   0 SY        ?      0        ? ?           0:00 pageout
 1 S      0     3     0   0   0 SY        ?      0        ? ?         975:53 fsflush
 0 S      0   107     1   0  40 20        ?   1452        ? ?           1:20 snmpd
 0 S      0     7     1   0  40 20        ?   1575        ? ?           1:44 vc.star
 0 S      0     9     1   0  40 20        ?   1286        ? ?           1:51 vc.conf
 0 S      1   245     1   0  40 20        ?    332        ? ?           0:00 statd
 0 S      0  6244  6228   0  40 20        ?   7729        ? ?           0:52 oninit

iostat

iostat 命令提供吞吐量、利用率、队列长度、事务速率和服务时间的高度准确度量结果,如 清单 34 中所示。

清单 34. iostat 命令
iostat -x 5 1
                  extended device statistics                   
device       r/s    w/s   kr/s   kw/s wait actv  svc_t  %w  %b 
sd1          0.0    1.1    0.4    1.4  0.0  0.0   34.6   0   1 
sd2          0.0    0.9    0.6    9.8  0.0  0.0   19.4   0   1 
sd3          0.0    0.0    0.0    0.0  0.0  0.0   20.0   0   0 
sd4          0.0    0.0    0.2    0.7  0.0  0.0    7.3   0   0 
sd5          0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0 
nfs1         0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0

vmstat

vmstat 命令提供有关进程状态、内存利用率、分页统计信息、系统活动和 CPU 使用的信息,如 清单 35 中所示。

清单 35. iostat 命令
vmstat 3 5
 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s1 s2 s3 s4   in   sy   cs us sy id
 0 0 0 19930448 5681776 519 718 1 1 1 0  0  1  1  0  0  361 527535 598 10 10 80
 0 0 0 17964488 4777560 1 10 0  0  0  0  0  0  0  0  0  457 1597198 836 26 24 49
 0 0 0 17964488 4777560 0 0  0  0  0  0  0  0  0  0  0  451 1596260 824 26 24 49
 0 0 0 17955984 4773040 1698 2593 0 0 0 0 0 1  0  0  0  477 1598837 901 30 29 41
 0 0 0 17964488 4777560 0 0  0  0  0  0  0  0  1  0  0  461 1594752 823 26 25 49

Windows 工具

本节介绍仅可用于 Windows 操作系统的工具。

Windows 事件查看器

事件查看器显示操作系统、其他应用程序和数据库服务器的信息、警告和错误消息。要在 Windows 上显示数据库服务器消息,可执行以下操作:

  1. 选择 Administrative Tools > Event Viewer
  2. 选择 Log > Security
  3. 双击任何事件以获得更详细的消息。

以下 Informix 实用程序简化了 Windows 上的数据库服务器的管理。

ixpasswd.exe

ixpasswd.exe 实用程序更改以用户 informix 身份登录的所有服务的登录密码。可以通过交互式方式或者在命令上使用 -y 选项来更改该密码:ixpasswd [-y new_password]。这个实用程序避免了在每次更改 Informix 密码时手动更改每个服务的密码。

如果您在本地登录并运行 ixpasswd,它会更改以本地 Informix 用户身份登录服务的密码。如果您登录到域中并运行 ixpasswd,它会更改以 domain\informix 身份登录服务器的密码。

ixsu.exe

ixsu.exe 实用程序启动一个以指定用户身份运行的命令行窗口。该用户是一个本地用户,除非您以 ixsu [[domain\]username] 格式指定了一个域名。如果没有指定用户名,则默认用户为 informix。您不再需要以当前用户身份注销并以 informx 身份登录,即可执行需要以 informix 身份运行的数据库管理任务。ixsu 实用程序需要高级用户权限才能在操作系统中运行。

要在 Windows NT 上配置高级用户权限,可执行以下操作:

  1. 选择 User Manager > Policies > User Rights
  2. 勾选 Advanced User Rights 选项。

请注意,如果您更改当前用户的高级用户权限,需要注销并再次登录,新权限即可生效。

ixsu 实用程序等效于 Windows 2000 runas 命令。要使用 runas 以另一个用户身份运行一个命令 shell,可使用 runas /user:username cmd

ntchname.exe

ntchname.exe 实用程序将 Informix Dynamic Server 的注册表项从旧主机名更改为新主机名。在更改主机名后运行 ntchname。该实用程序不会更改用户环境变量。执行 ntchname 后,编辑 %INFORMIXDIR%\%INFORMIXSERVER%.cmd 文件并使用 ntchname old_name new_name 格式将 INFORMIXSQLHOSTS 条目更改为新主机名。


结束语

本教程介绍了 Informix 11.70 中的一些可用的监视工具。您了解了如何使用每个工具来监视数据库系统。数据库监视是一个至关重要的活动,它(定期执行)提供有关数据库系统健康状况的持续反馈。

SQL 管理 API 支持使用各种特定的 SQL 命令执行远程管理,完成管理空间、管理配置、运行例程作业和系统验证等任务。

调度程序管理并执行计划中的维护,执行监视并完成管理任务。此工具可用于监视活动(包括空间管理和 在指定时间间隔自动备份自上次日志备份以来任何新日志数据),以及创建自动运行的更正操作。

系统监视接口 (SMI) 表是由数据库服务器管理的特殊表,它们包含有关数据库服务器状态的动态信息。可以在它们之上使用 SELECT 语句来确定您希望知道的有关数据库服务器的几乎所有信息。

onstat 实用程序提供了一种方式来从命令行监视数据库服务器共享内存。onstat 实用程序从共享内存读取数据,并报告在该命令执行时刻间准确的统计信息。也就是说,onstat 提供在处理过程中动态更改的信息,包括缓冲区、锁、索引和用户的更改。

oncheck 实用程序显示有关数据库磁盘配置和使用情况的信息,比如用于一个表的页面数量、保留页面的内容和一个表中的盘区数量。

数据库服务器消息日志是一个操作系统文件。您可以读取数据库服务器消息日志获得数据库服务器处理情况的逐分钟报告,以捕获在问题发生之前的事件。

事件警报功能是一种基于数据库服务器环境中发生的事件而自动触发管理操作的机制。

本教程介绍了隔离级别、并发性和如何调整它们,这在具有多个数据库和数据库服务器的环境中很有用。

参考资料

学习

获得产品和技术

  • 下载 免费的软件,包括针对小型工作负载生产的 Informix Innovator-C Edition 和 Informix Ultimate Edition 的试用版。
  • 使用 IBM 产品评估试用版软件 构建您的下一个开发项目,可直接从 developerWorks 下载这些软件。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=829851
ArticleTitle=Informix 11.70 系统管理认证考试 919 准备教程,第 3 部分: 系统活动监视
publish-date=08092012