简介
随着包含重要信息系统的生产数据库的快速增长,自动化空间管理变得越来越重要。 虽然 Informix Dynamic Server (IDS) 目前还没有提供集成的空间管理特性, 但是它已经有一些工具和功能可用于避免因磁盘空间溢出导致的停机。
为获得这种功能,需要执行一些任务,以下是对其中的关键任务的概述:
安排一个定期任务,用于监视所有数据库空间中的可用空闲空间。
将空间检查功能实现为一个 SQL 存储过程。
如果数据库空间的空闲空间大小低于指定的阈值,则通过 ADD CHUNK 管理命令调用 admin() 函数自动扩展空间。
[size=1em]可以使用 下载 小节中的示例 RAWDEVSIZE 程序确定所有已有 RAW 设备空闲空间的大小和偏移量(offset)参数,并将该信息存储在一个数据库表中。 执行 ADD CHUNK 命令的 SQL 存储过程将读取这些结果。
持续监视数据库空间
为了实现持续监视数据库空间,添加一行到 ph_task 表中,安排一个定期任务。
图 1 显示一个例子,其中一个执行 SQL 存储过程的任务被安排为每 30 秒运行一次。 如果该任务发现某个数据库空间的空闲空间低于某个阈值,那么它可以扩展该数据库空间。 在本文的例子中,该阈值是在 ph_threshold 系统表中定义的。
参考资料 小节提供了相关链接,通过这些链接可以获得关于 ph_task 表和 ph_threahold 表的详细信息。
图 1. 对数据库空间的持续监视
[size=1.166em]回页首
为数据库空间增加一个块
[size=1.166em]可以使用随 SYSADMIN 数据库提供的 admin() 管理函数使用 SQL 扩展数据库空间。
[size=1.166em]下面是为数据库空间增加块的一个例子(这里使用原始设备):
EXECUTE FUNCTION admin ("ADD CHUNK", "dbs1a", "/dev/raw1/", "2GB", "1GB");
[size=1.166em]表 1 描述以上命令中使用的参数。
表 1. 用于增加块的参数参数值意义
dbs1a
数据库空间名称
/dev/raw1/
路径名称
2GB
大小
1GB
偏移量
[size=1.166em]回页首
示例 RAWDEVSIZE 程序
[size=1.166em]为了扩展数据库空间,首先必须确定已有原始设备上空闲块的路径、大小和偏移量参数。 在本文描述的例子中,使用一个名为 RAWDEVSIZE 的可执行程序完成该任务。
[size=1.166em]下载 小节包含 RAWDEVSIZE 程序源代码的链接。 该程序是用 C 语言编写的。 下载示例程序源代码后,可以在任何 UNIX® 平台上编译它。
[size=1.166em]RAWDEVSIZE 程序分析可用原始设备,并将空闲块的偏移量、大小和路径信息存储到一个名为 free_chunks 的数据库表中。 SQL 存储过程在 free_chunks 表中搜索匹配的空闲块,并将该信息用于 ADD CHUNK 函数调用。 每当发生空间扩展时,需要更新关于空闲块的信息。 因此,每次发生空间扩展后,SQL 存储过程中会调用 RAWDEVSIZE 程序。
free_chunks 表
[size=1.166em]RAWDEVSIZE 程序计算所有可用于 Informix 数据库的原始设备的大小:
正在使用的原始设备大小,不包含任何空闲空间
正在使用的原始设备大小,仍包含空闲部分
完全空闲的原始设备大小
[size=1.166em]收集到的关于空余块的数据被存储在一个名为 free_chunks 的数据库表中,该表的格式如下:
表 2. free_chunks 表的格式
name as LVARCHAR (1024)
offset as INT8
freesize as INT8
[size=1.166em]图 2 显示包含 3 个原始设备的一组原始设备,这 3 个原始设备都既包括空闲块,又包含正在使用的块。 这些设备分别名为 RD1、RD2 和 RD3,都在 /chunks 目录中。 对于每个块,该图标出块的偏移量值(单位为 GB)。对于空闲块,该图还显示块的大小(单位为 MB)。
图 2. 原始设备分析
[size=1.166em]对图 2 所示原始设备运行 RAWDEVSIZE 程序将产生以下数据,并将这些数据放到 free_chunks 表中:
表 3. 结果表 free_chunks/chunks/RD10 GB100 MB
/chunks/RD1
0,4 GB
700 MB
/chunks/RD1
1,6 GB
400 MB
/chunks/RD2
0 GB
700 MB
/chunks/RD2
1,4 GB
600 MB
/chunks/RD3
0 GB
300 MB
/chunks/RD3
1,2 GB
800 MB
[size=1.166em]free_chunks 表按块的 freesize 排序。 名为 CHECK_DBSPACE_RD 的 SQL 存储过程确定 free_chunks 表中列出的哪个块应该用于扩展数据库空间。
RAWDEVSIZE 原始设备链接
[size=1.166em]RAWDEVSIZE 程序最初是为 SAP 系统环境开发的,所以源代码原型基于特定于 SAP 的原始设备链接惯例。
清单 1. RAWDEVSIZE 程序原始设备链接${SAPDBA_RAWDEV} =/informix/QI1/sapdata | | |--- physdev1 | | | | | |----- data1 -> /dev/rlvINF1 | | | | | ----- data2 -> /dev/rlvINF2 | | |--- physdev2 | | | | | |----- data1 -> /dev/rlvINF3 | | | | | ----- data2 -> /dev/rlvINF4 | | --- physdev3 | | |----- data1 -> /dev/rlvINF5 | | ----- data2 -> /dev/rlvINF6
[size=1.166em]该程序首先扫描 $SAPDBA_RAWDEV 下的子目录结构,查找原始设备的链接,确定所有可用原始设备的列表。 接着,查询 Informix 数据库,确定原始设备上已经在使用的块的位置。 然后,计算空闲块的位置和大小。
[size=1.166em]注意: 在其他环境中,上述确定原始设备的机制可能不适用。 但是,也许有其他方式来确定原始设备。
RAWDEVSIZE 处理步骤概述
[size=1.166em]以下是对 RAWDEVSIZE 程序中发生的处理步骤的概述:
检查环境中的 $SAPDBA_RAWDEV 变量,搜索它下面的目录和文件。
检查发现的数据文件是否为原始(字符特殊)设备的链接。
检查原始设备的大小,将结果保存到 raw_devs.unl 文件中。
从 Informix SYSCHUNKS 系统表中读数据,并根据以下标准包括镜像块: SELECT... like '%sapdata/physdev%/data%'
将之前步骤得到的结果保存到 syschk.unl 文件中。
计算空闲(可用)原始设备的大小,将结果保存到 free_chunks.unl 文件中。
通过装载 free_chunks.unl 文件,创建 free_chunks 结果表的内容。
[size=1.166em]回页首
在 Linux 和 Windows 上使用 cooked 文件
[size=1.166em]如果在 Linux® 或 Windows® 环境中使用 cooked 文件, 那么偏移量信息没有意义。 因此,SQL 存储过程必须为添加的每个块创建一个惟一的路径名。 例如,可以使用与一个惟一编号关联的数据库空间名称:
EXECUTE FUNCTION admin ("ADD CHUNK", "mydbspace", \n "c:/Informix/chunks/mydbspace.001", "2GB");
[size=1.166em]回页首
创建空间管理例子
[size=1.166em]经过上述步骤后,本节创建空间管理例子。
创建结果表。
[size=1em]以用户 Informix 在 SYSADMIN 数据库中创建用于 RAWDEVSIZE 的结果表,如清单 2 所示:
清单 2. 创建结果表CREATE TABLE raw_devs(name LVARCHAR (1024),size INT8);CREATE TABLE free_chunks(name LVARCHAR (1024),offset INT8,freesize INT8);
填充调度器的系统表。
[size=1em]在 SYSADMIN 数据库中的 ph_threshold 系统表中插入一行,以定义数据库空间中空余空间的示例阈值,如清单 3 所示:
清单 3. 在 ph_threshold 系统表中插入值INSERT INTO ph_threshold(name, task_name, value, value_type, description)VALUES('DBSPACE ALERT','check_dbspace','10000','NUMERIC','A dbspace should be extended if free space lower than 10 MB.');
通过在 SYSADMIN 数据库中的 ph_task 系统表中插入一行,安排一个定期任务,如清单 4 所示:清单 4. 在 ph_task 系统表中插入一行INSERT INTO ph_task(tk_name, tk_type, tk_group, tk_description,tk_execute, tk_frequency, tk_delete)VALUES('check_dbspace','TASK','SERVER','Checking of dbspaces, which should be min. 10 MB free.','check_dbspace_rd', <-- Name of the SQL stored procedure that should be called'0 0:00:30', <-- Calling interval - every 30 sec。'7 0:00:00');
创建一个 SQL 存储过程。
[size=1em]在 SYSADMIN 数据库中创建一个名为 check_dbspace_rd 的存储过程,如清单 5 所示:
清单 5. 创建 check_dbspace_rd SQL 存储过程CREATE PROCEDURE check_dbspace_rd (task_id INTEGER, task_seq INTEGER) DEFINE dbs_min_size INTEGER; DEFINE dbspace_name VARCHAR(128); DEFINE dbspace_free INT8; DEFINE i INTEGER; DEFINE path LVARCHAR(1024); DEFINE offs VARCHAR(64); SELECT value::INTEGER INTO dbs_min_size FROM ph_threshold WHERE name = 'DBSPACE ALERT'; FOREACH SELECT db.name, TRUNC (SUM (ch.nfree * ch.pagesize) / 1024, 0) free_size_KB INTO dbspace_name, dbspace_free FROM sysmaster:sysdbspaces db, sysmaster:syschunks ch WHERE db.dbsnum = ch.dbsnum AND db.name NOT IN ('logdbs', 'physdbs', 'rootdbs', 'psapsystem') AND db.name NOT LIKE 'tmpdbs%' GROUP BY 1 IF dbspace_free < dbs_min_size THEN INSERT INTO ph_alert (alert_task_id, alert_task_seq, alert_type, alert_color, alert_state, alert_object_type, alert_object_name, alert_message, alert_action) VALUES (task_id, task_seq, 'ERROR', 'red', 'ADDRESSED', 'DBSPACE', dbspace_name, 'Dbspace ['||TRIM (dbspace_name) ||' - '||dbspace_free::INTEGER ||' KB free] should be extended!', NULL ); FOREACH SELECT FIRST 1 name, offset INTO path, offs FROM free_chunks ORDER BY freesize LET offs = offs ||' B'; EXECUTE FUNCTION admin ('ADD CHUNK', dbspace_name, path, '200 MB', offs) INTO i; SYSTEM '/informix/QI1/etc/sysadmin/rawdevsize/rawdevsize.sh'; END FOREACH END IF END FOREACHEND PROCEDURE;
为 RAWDEVSIZE 程序创建一个包装器。
[size=1em]例如,创建一个名为 rawdevsize.sh 的脚本作为包装器,它在 SQL 存储过程中调用 RAWDEVSIZE 程序,如清单 6 所示。
清单 6. 创建一个包装器#!/bin/shSAPDBA_RAWDEV=/informix/QI1/sapdata;export SAPDBA_RAWDEV;DIR=/informix/QI1/etc/sysadmin/rawdevsize;export DIR;cd ${DIR};${DIR}/rawdevsize.exe > ${DIR}/rawdevsize.txt
[size=1.166em]回页首
结束语
[size=1.166em]本文描述一个用于在 IDS 11.5 中自动扩展 Informix 数据库空间的过程。 该过程利用 IDS 11.5 中的 sysadmin 数据库, 监视空闲空间,并自动为即将耗尽的数据库空间增加块。 通过实现这种机制,可以确保不会遇到 “数据库空间已满” 的问题。 DB2 提供了几种机制用于必要时自动为表空间增加空间,但是目前 IDS 还没有任何类似的集成特性。 本文描述的过程可以帮助您解决这个烦恼。