Informix 中的存储配置
使用自动存储空间管理简化您的 DBA 工作负载
免费下载:IBM® Informix® 11.7 试用版(包括 Ultimate Edition、Developer Edition 和 Innovator-C Edition) |
---|
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。 |
概述
Database System Administrator (DBA) 在管理分配给 Informix 服务器的磁盘空间时面临大量挑战。以前的 Informix 版本有很大帮助,添加了大块(Informix 9.40)、动态日志分配(Informix 9.30)、可配置表空间(Informix 10.00)等特性。然而,如果表空间意外填满,Informix 仍然会产生错误,DBM 必须手动添加更多空间来缓和问题。可能会出现存储空间分配不足或超额分配的情况,因为很难预测数据库对象的空间需求。从 Informix 11.70.xC1 开始,存储配置特性便简化了 DBA 的生活,因为 Informix 在需要时自动分配更多磁盘空间给存储空间,而无需 DBA 的直接(手动)干预。存储配置特性添加了新的术语 —存储池— 到 Informix 存储空间和块(Chunk)的概念中。存储池是未使用的磁盘空间,Informix 可在需要更多空间时使用它。它受到需要额外空间的存储空间的控制,也受到存储池条目本身的控制。
术语
存储空间 指一个 Informix 存储空间,包括永久或临时的 dbspace、blobspace 或 smartblob 空间。
存储配置概念
可扩展块
早期版本的 Informix( 11.70xC1 之前)总是有固定长度的块,如果现有块耗尽空间,就无法向其添加更多空间。从 Informix 11.70xC1 开始,当一个块耗尽其当前分配的磁盘空间时,Informix 可添加更多空间到现有块(截至块的最大大小),无需向包含块的存储空间分配新块。具有这种特征的块称为可扩展块。
可扩展存储空间
当存储空间耗尽时,Informix 可以自动扩展存储空间。可通过两种方式自动扩展存储空间:
- 可扩展其中一个块(一个块必须标记为可扩展),或
- 可将新块添加到存储空间
Informix 会首先尝试扩展标记为可扩展的其中一个现有块。如果当前块都不可扩展,Informix 可以使用存储池自动分配新块给存储空间。
存储池
存储池是包含原始设备、熟文件(cooked file)或目录的一个或多个条目的集合。它是 DBA 指定的未使用磁盘空间,Informix 可在需要空间时使用它。Informix 允许您手动向该池添加空间,并在块被删除时自动返回空间给该池。每个 Informix 实例仅有一个存储池,且不能在 Informix 实例间共享存储池。
主动和被动触发机制
根据您的配置,可在耗尽空间之前自动扩展空间。这称为主动扩展。如果因为几乎没有空闲页面可用而扩展空间,这称为被动扩展。
在主动机制中,一个 sysadmin 任务会监控现有存储空间,并在剩余空间低于特定阈值时自动扩展存储空间。可使用 SP_THRESHOLD onconfig
参数控制该阈值。尽管监控任务会自动运行,默认禁用主动分配。
在被动机制中,当一个事务即将因为空间不足而失败时,Informix 通过扩展现有块或添加新块增加即将用尽的存储空间。需要额外存储来完成的事务在等待分配额外存储时停止。如果存储空间不配置为自动扩展,会向客户端返回一个 ENOFREE 错误,如同在之前的 Informix 版本中。
尽管可同时禁用主动和被动触发机制,手动存储空间扩展和块扩展仍然可行。
控制块、存储空间和存储池
DBA 可控制是否可以增长给定块或存储空间,以便 DBA 告诉 Informix 对特定存储空间使用的空间执行硬限制。DBA 还可限制存储池中的空间量,或让 Informix 使用所有可用空间。在 Informix 自动添加存储给容器时,DBA 将能够配置分配量,即当前空间的百分比或千字节的绝对值。而且 DBA 可以配置将由主动触发器使用的实例范围内的阈值。
配置存储配置
本节阐述存储配置特性不同级别的配置。
实例级配置参数
Informix 11.70.xC1 引入以下三个新的 onconfig
配置参数:
SP_AUTOEXPAND
<0 | 1> (default - 1): 该参数启用或禁用对块扩展的自动创建。默认设置为 1(启用)。可使用onmode -wm
或onmode -wf command
动态修改该参数。不管此参数设置如何,所有手动操作仍然可行。
注意,如果存储空间为空或您的实例不包含可扩展块,那么启用自动扩展没有效果(两种情况下都是默认状态)。SP_THRESHOLD
<percentage or kilobytes> (default - 0):该参数用于定义在 Informix 运行任务扩展空间(通过扩展空间中的现有块或添加新块)之前存储空间中可存在的空闲千字节最小数量。该参数接受百分比数或千字节数。如果任何存储容器中的空闲空间量低于该阈值,‘mon_low_storage’ sysadmin 任务会尝试在下次运行时扩展空间。如果该值为 50 或更低,Informix 将其解译为百分比(例如,10 = 10% 且 2.84 = 2.84%)。如果该值为 1000 或更高,Informix 将其解译为一定数量的千字节。介于 50 和 1000 之间的值被视为无效。
默认设置为 0,表示禁用主动触发。可使用onmode -wm
或onmode -wf command
动态修改该参数。
示例及其含义:SP_THRESHOLD 7.5
- 阈值设为 7.5%。如果容器中空闲空间量低于总空间量的 7.5%,它就被视为低于阈值。SP_THRESHOLD 10000
- 阈值设为 10000KB 或大约 10MB。如果容器中空闲空间量低于 10MB,它就被视为低于阈值。
SP_WAITTIME
<number of seconds> (default - 30 seconds): 该参数设置为秒数。它是一个用户线程等待另一个线程扩展空间时在超时并返回 ENOFREE 之前的最少时间量。默认设置为 30 秒。可使用onmode -wm
或onmode -wf
命令动态修改该参数。
存储空间级配置
每个 Informix 存储空间将有以下两个可配置值:
create size
- 这是 Informix 可在空间中自动创建的块的最小大小。create size
的默认值是空间当前大小的 10%。extend size
- 这是空间中可自动扩展的块的最小分配大小。extend size
的默认值是 10MB。
这些值都不会影响人工块创建或块扩展。(参见 “扩展 Informix 存储空间” 一节了解更多信息。)
存储池条目级配置
对于存储池中的每个条目,可以配置可从该条目分配的块的最小大小。您还可以配置需要空间时考虑这些条目的优先级。(参见 “管理存储池” 一节了解更多信息。)
表 1. 启用/禁用功能快速参考
功能 | 控制参数 | 描述 | 范围 |
---|---|---|---|
存储空间的自动扩展 | SP_AUTOEXPAND | 1 = Enabled(默认);0 = Disabled。例如:
onmode -wm
SP_AUTOEXPAND=1 ,
或修改 onconfig 文件,或通过 Open Admin Tool 更新它。 | 实例级 |
用于添加空间的自动触发器 | SP_THRESHOLD | 0 = Disabled(默认),0 到 50 以及 1000 到块最大大小为有效值,例如:
onmode -wm
SP_THRESHOLD=20 ,
or modify the onconfig file, or update it through Open Admin Tool. | 实例级 |
自动块创建 | create size | 要为特定存储空间禁用自动块创建,将创建大小设置为 0。默认值为空间当前大小的 10%。(例如,参见 “扩展 Informix 存储空间” 一节。) | 单个存储空间级别 |
自动块扩展 | extend size | 要为特定存储空间禁用自动块扩展,将该空间的扩展大小设置为 0。默认值为 10MB。(例如,参见 “扩展 Informix 存储空间” 一节。) | 单个存储空间级别 |
管理块可扩展性
可手动或自动扩展一个块;但是,必须首先将其标记为 “可扩展”。可使用 modify chunk extendable sysadmin task()
命令将块标记为可扩展或不可扩展:
EXECUTE FUNCTION task("modify chunk extendable [on]", <chunk
number>);
EXECUTE FUNCTION task("modify chunk extendable off", <chunk
number>);
示例
- 将块号 4 标记为可扩展(关键字 “on” 可选)。
清单 1. 将块标记为可扩展
EXECUTE FUNCTION task("modify chunk extendable", 4);
- 将块号 13 标记为不可扩展。
清单 2. 将块标记为不可扩展
EXECUTE FUNCTION task("modify chunk extendable off", 13);
注意,默认情况下块是不可扩展的。但是熟的和原始的块可扩展。对于熟块,扩展可能会使熟文件越来越大。但是扩展原始块不会让原始设备变大;它仅将块的结束偏移量进一步移动到原始设备。如果原始设备对于新块结束偏移量不够大,扩展就会失败。Informix 将不允许创建或扩展块来重叠同一实例中的现有块,不管是手动还是自动执行操作。
了解
onstat -d
output
onstat -d
输出中有两个新标志:一个用于 dbspaces,一个用于块。当将 SP_AUTOEXPAND
设置为 1(默认值)时,像 dbspace 这样的存储空间具有一个非零的创建大小或扩展大小,该存储空间被视为可自动扩展,且将在位置 5 中有一个 ‘A’ 标志,如清单 3 所示。如果将 SP_AUTOEXPAND
设置为 0(禁用),或将特定空间的创建大小和扩展大小都设置为 0,该存储空间不被认为可自动扩展,且在 onstat -d
输出中不会有一个 ‘A’ 标志。
清单 3. onstat -d 输出:存储空间清单
Dbspaces address number flags fchunk nchunks pgsize flags owner name 4e108028 1 0x60001 1 1 2048 N BA informix rootdbs 5075ddf8 2 0x60001 2 1 2048 N B informix dbspace1 50810800 3 0x60001 3 1 2048 N BA informix dbspace2 50526d90 4 0x60011 4 1 4096 N BBA informix blbsp1 5075d4f0 5 0x68001 5 1 2048 N SBA informix sbspace1
在同一输出的块部分,位置 5 处的 ‘E’ 标志表示块标记为可扩展。
清单 4. onstat -d 输出:块清单
Chunks address chunk/dbs offset size free bpages flags pathname 4e1081d0 1 1 0 100000 37373 PO-BE- /informix/rootdbs 508d5df0 2 2 0 5000 4947 PO-B-- /informix/dbspace1 508109a8 3 3 0 2500 2447 PO-BE- /informix/dbspace2 50810d70 4 4 0 5000 ~2494 2500 POBB-- /informix/blobsp1 5075fd10 5 5 0 5000 4587 4587 POSB-- /informix/sbspace1 Metadata 360 268 360 5 active, 32766 maximum
注意,之前在位置 5 处的块标志(分别用于并发 I/O 和直接 I/O)移到了位置 6。
手动扩展块
可以使用 modify
chunk extend
命令手动增加或扩展一个可扩展块。
一般语法如下:
EXECUTE FUNCTION task("modify chunk extend", <chunk number> ,
<extend amount>);
该命令立即扩展一个块。“extend amount” 具有默认的千字节数,但可表达为 “10 MB”、“32 GB” 等等。用于手动扩展一个块的该命令不受存储空间的 ‘扩展大小’ 值的影响。
示例
- 将块号 6 扩展 400MB。
清单 5. 将一个块扩展 400MB
EXECUTE FUNCTION task("modify chunk extend", 6, "400 MB");
- 将块号 4 扩展 10KB。
清单 6. 将一个块扩展 10KB
EXECUTE FUNCTION task('modify chunk extend', 4, '10 KB');
Informix 会自动将扩展量四舍五入为本页面大小的最接近倍数。以下块不能标记为可扩展,因而无法扩展:
- Blobspace 块
- Smartblob 空间块
- 镜像块
扩展 Informix 存储空间
每个 dbspace、blobspace 和 sbspace 都有一个 ‘创建大小’ 和一个 ‘扩展大小’。创建大小是 Informix 可在该空间中自动创建的一个块的最小大小。扩展大小是该空间中一个块可自动扩展的最小分配大小。创建大小和扩展大小都不影响手动块创建或块扩展。
您可以使用 sysadmin
task
命令以绝对千字节数或当前大小百分比为单位指定两个大小。为特定存储空间将创建大小和扩展大小都设置为 0 可有效禁用对该空间的自动扩展。事实上,仅仅将扩展大小设置为 0 会为该空间中的所有块消除可扩展标志。但是,可再次将该空间中的块标记为可扩展。只有未镜像的 dbspaces 和临时 dbspaces 可以有一个非零 extend
size,因为不能在任何其他类型的空间中扩展块。创建大小的默认值是 10%。扩展大小的默认值是 10MB。您可以使用以下 task
命令修改这些大小:
EXECUTE FUNCTION task("modify space sp_sizes", < space name >,
< new create size >, < new extend size >);
示例
- 对于 dbspace8,将创建大小和扩展大小分别设置为 60MB 和 10MB。
清单 7. 设置创建大小和扩展大小
EXECUTE FUNCTION task("modify space sp_sizes", "dbspace8", 60000, 10000);
- 对于 dbspace8,将创建大小和扩展大小分别设置为 20% 和 1.5%。
清单 8. 设置创建大小和扩展大小
EXECUTE FUNCTION task("modify space sp_sizes", "dbspace8", 20, 1.5);
- 为 dbspace8 禁用自动块创建,但是启用自动块扩展。
清单 9. 禁用自动块创建;启用自动块扩展
EXECUTE FUNCTION task("modify space sp_sizes", "dbspace8", 0, 1.5);
- 禁用自动块扩展,但是启用自动块创建。
清单 10. 禁用自动块扩展;启用自动块创建
EXECUTE FUNCTION task("modify space sp_sizes", "dbspace8", 20, 0);
手动扩展存储空间
如果您不想等待 Informix 自动扩展空间,可以使用以下 sysadmin
task
命令自动扩展它:
EXECUTE FUNCTION task("modify space expand", < space name >,
< size >);
该命令通过扩展现有块或添加新块直接扩展空间。(如果空间不包含可扩展块且存储池不包含请求的空间,命令会失败。)在这种情况下,‘size’ 是您希望扩展的最小空间大小。向空间添加的实际千字节数可能超过该最小值,具体取决于多个因素,比如空间的页面大小和存储池中可用条目的最小块大小设置。
该手动操作不受 dbspace 的创建大小或其扩展大小的影响。
示例
- 将 dbspace4 至少扩展 10MB。
清单 11. 扩展 dbspace4
EXECUTE FUNCTION task("modify space expand", "dbspace4", "10 MB");
存储池的组件
sysadmin:storagepool 表模式
sysadmin 数据库中的新存储池表跟踪存储池条目。其模式如下:
清单 12. 存储池模式
create table storagepool ( entry_id serial not null, path varchar(255) not null, beg_offset bigint not null, end_offset bigint not null, chunk_size bigint not null, status varchar(255), priority int default 2, last_alloc datetime year to second, logid int, logused int ) lock mode row; create unique index ix_storagepool_1 ON storagepool(entry_id);
表 2. 存储池表
列名 | 描述 |
---|---|
entry_id | 用于识别条目的序列号。 |
path | 设备/目录/文件的路径。 |
beg_offset | 条目的起始偏移量。 |
end_offset | 条目的结束偏移量。 |
chunk_size | 该条目上分配的最小大小。 |
status | 以下三种之一:Active,Full,Error。 |
priority | 影响考虑该条目的次序。 有效的优先级值是: 1 = High 2 = Medium (default) 3 = Low |
last_alloc | 该条目上最后一次分配的日期/时间。这在添加条目时被初始化为 null,且在修改条目时被重置为 null。 |
logid | 在内部使用,以确定最近最少使用的条目。 |
logused | 在内部使用,以确定最近最少使用的条目。 |
该表中的一个条目存储目录、熟文件或原始设备,供存储配置特性使用。对目录与文件/设备的区分由 Informix 在内部完成。
所有条目均可分成两类:固定长度和可扩展长度。在其中三列中存储的信息对于两种类型的条目不同:
- 固定长度:
- beg_offset - 到设备的起始偏移量。
- end_offset - 到设备的结束偏移量。
- chunk_size - 从该设备上分配的块的最小大小。
- 可扩展长度:
- beg_offset - 到设备的起始偏移量,对于目录是 0。
- end_offset - 0.
- chunk_size - 设备或目录内熟块的初始大小。
状态
sysadmin:storagepool 表中的一个正常条目被认为是 ‘活动的’。其状态栏将包括 “Active” 单词。
由于从一个活跃的、固定长度的存储池条目分配了块,最终该条目中的空间耗尽。当发生这种情况时,条目保留在池中,但是其状态更新为 “Full”。Informix 不会试图使用完整的条目。
如果向池成功添加了条目或随后修改条目,但稍后在 Informix 试图使用它时生成了某类错误,条目保留在池中(可能稍后由管理员 ‘修复’),但其状态被更新 “Error”。Informix 不会试图使用任何错误条目。
管理存储池
以下是可用于管理存储池的 sysadmin task
命令:
storagepool add
storagepool modify
storagepool delete
storagepool purge
每个原始设备、熟文件或存储池中的目录称为一个 ‘实体’。可以使用 sysadmin:task()
或
sysadmin:admin()
函数从池中添加、修改和删除条目。
storagepool add
添加条目时,您必须提供路径、Informix 可以开始分配块空间所依据的偏移量、条目中 Informix 可用的总空间量、可从该新条目分配的块的最小大小,以及优先级。该命令的语法如下:
EXECUTE FUNCTION task("storagepool add", <path>, <begin offset>, <total size>, <chunk size>, <priority>);
路径必须是带引号的字符串。<path> 中可能使用环境变量,且它存在于调用 oninit 的 shell 中。
清单 13. 示例
EXECUTE FUNCTION task("storagepool add", "$DBSDIR/chunk1", 0, 100000, 20000, 2);
如果其他参数是纯粹的数字,那么无需引用它们。但是,如果参数值是一个包含单位的数字,比如 “100 MB”,就必须引用它。
对于大小和偏移量,如上所示包含单位是有效的。默认单位是千字节,但以下示例都是可以接受的:
- 100000
- "100000 K"
- "100 MB"
- "100 GB"
- "0.6 TB"
有效的优先级值是 1(High)、2(Medium)或 3(Low)。当 Informix 到存储池寻找空间时,这个优先级影响考虑条目的顺序。
让我们来看看几个示例:
- 将原始设备的一部分添加到池。Informix 可从该设备上总共分配 10GB 的空间,初始偏移量为 50MB。Informix 可从该空间块腾出的块的最小大小是 100MB。赋予该条目一个高优先级。
清单 14. 将原始设备的一部分添加到池
EXECUTE FUNCTION task("storagepool add", "/dev/rawdevice1", "50 MB", "10 GB", "100 MB", 1);
- 将目录添加到池中。Informix 可在该目录中创建的块的最小大小是 200MB。赋予该条目一个中等优先级。
清单 15. 将目录添加到池中
EXECUTE FUNCTION task("storagepool add", "/informix/STORAGE_DIR", 0, 0, "200 MB", 2);
- 将熟文件添加到池中。Informix 可从该设备上总共分配 3GB 的空间,初始偏移量为 0。Informix 可从该空间快腾出的块的最小大小是 10MB。赋予该条目一个低优先级。
清单 16. 将熟文件添加到池中
EXECUTE FUNCTION task("storagepool add", "/ifmx/CHUNKFILES/cooked1", 0,3000000, "10 MB", 3);
- 将可扩展熟文件添加到池中。如果被使用,那么仅能从该文件创建一个块。其初始大小将是 4GB,且它会自动被标记为可扩展。赋予该条目一个中等优先级。
清单 17. 将可扩展熟文件添加到池中
EXECUTE FUNCTION task("storagepool add", "/ifmx/CHUNKFILES/cooked2", 0, 0, "4 GB", 2);
storagepool modify
存储池中的每个条目有一个惟一 ID,存储在 entry_id 列。该命令需要修改现有条目的条目 ID。您可以修改条目的总大小、最小块大小和优先级。您不能修改路径或偏移量。如果需要更改两个值中的任何一个,就需要删除条目并重新添加新路径、偏移量或两者。修改命令的语法如下:
EXECUTE FUNCTION task("storagepool modify", <entry ID>, <new total size>, <new chunk size>, <new priority>);
我们来看一个例子。将存储池条目 4 的总大小、块大小和优先级分别改为 10GB、10MB 和 2。
清单 18. 更改存储池的总大小、块大小和优先级
EXECUTE FUNCTION task("storagepool modify", 4, "10 GB", 10000, 2);
- storagepool delete
该命令需要删除条目的条目 ID。删除命令的语法如下:
EXECUTE FUNCTION task("storagepool delete", <entry ID>);
我们来看一个例子。删除存储池条目 14。
清单 19. 删除存储池条目 14
EXECUTE FUNCTION task("storagepool delete", 14);
storagepool purge
可使用清除命令删除存储池条目:
EXECUTE FUNCTION task("storagepool purge <all|full|errors>");
使用 'all' 关键字将删除存储池表中的所有行;‘full’ 仅删除状态为 “Full” 的那些条目;而 ‘errors’ 仅删除状态为 “Error” 的那些条目。
清单 20. 示例
EXECUTE FUNCTION task("storagepool purge all"); EXECUTE FUNCTION task("storagepool purge full"); EXECUTE FUNCTION task("storagepool purge errors");
使用存储池创建空间
存储池不止用于向现有空间添加块;它还可用于从头开始创建空间。每个空间类型都有其自己的创建命令,但一般格式是
create
<object> from storagepool
。
命令集描述如下。
create dbspace from storagepool
该命令使用存储池中的条目创建一个 dbspace。可选页面大小参数以千字节为单位给定,且可选镜像标志是 1(镜像) 或 0(无镜像)。该命令的语法如下:
EXECUTE FUNCTION task("create dbspace from storagepool", <space name>, <size>, [<page size> [, <mirror flag>]]);
让我们看看几个示例:
- 创建一个镜像的 1GB 的数据库空间,命名为 “dbspace3”,页面大小为 6k。
清单 21. 创建镜像的 dbspace
EXECUTE FUNCTION task("create dbspace from storagepool", "dbspace3", "1 GB", 6, 1);
- 创建一个无镜像的 5MB dbspace,命名为 “dbspace4”,使用默认页面大小。
清单 22. 创建无镜像的 dbspace
EXECUTE FUNCTION task("create dbspace from storagepool", "dbspace4", 50000);
- 创建一个镜像的 1GB 的数据库空间,命名为 “dbspace3”,页面大小为 6k。
create tempdbspace from storagepool
该命令使用存储池中的条目创建一个临时的 dbspace。可选页面大小参数以千字节为单位给定。该命令的语法如下:
EXECUTE FUNCTION task("create tempdbspace from storagepool", <space name>, <size>, [<page size>]);
让我们看一个例子。创建一个 1GB 的临时 dbspace,命名为 “tempdbspace1”,页面大小为 12k。
清单 23. 创建一个临时 dbspace
EXECUTE FUNCTION task("create tempdbspace from storagepool", "tempdbspace1", "1 GB", 12);
create blobspace from storagepool
该命令使用存储池中的条目创建一个临时的 blobspace。注意,可选 blobpage 大小参数以基页(而非千字节)为单位给定。这与提供给 onspaces 命令的页面大小单位一致。且可选镜像标志是 1(镜像) 或 0(无镜像)。该命令的语法如下:
EXECUTE FUNCTION task("create blobspace from storagepool", <space name>, <size>, [<blobpage size> [, <mirror flag>]]);
让我们来看看几个例子。
- 创建一个镜像的 100GB blobspace,命名为 “blobspace1”,blobpage 大小为 100 个基页。
清单 24. 创建镜像的 blobspace
EXECUTE FUNCTION task("create blobspace from storagepool", "blobspace1", "100 GB", 100, 1);
- 创建一个镜像的 5MB blobspace,命名为 “blobspace2”,使用默认 blobpage 大小(1 个基页)。
清单 25. 创建无镜像的 blobspace
EXECUTE FUNCTION task("create blobspace from storagepool", "blobspace2", 5000);
- 创建一个镜像的 100GB blobspace,命名为 “blobspace1”,blobpage 大小为 100 个基页。
create sbspace from storagepool
该命令使用存储池中的条目创建一个智能 blobspace。可选日志标志是 1(有日志记录) 或 0(无日志记录)。可选镜像标志是 1(镜像) 或 0(无镜像)。该命令的语法如下:
EXECUTE FUNCTION task("create sbspace from storagepool", <space name>, <size>, [<log flag> [,<mirror flag>]]);
让我们来看看几个例子。
- 创建一个镜像的 240MB 智能 blobspace,命名为 “sbspace1”,带日志记录。
清单 26. 创建一个镜像的 blobspace
EXECUTE FUNCTION task("create sbspace from storagepool", "sbspace1", "240 MB", 1, 1);
- 创建一个无镜像的 5GB 智能 blobspace,命名为 “sbspace2”,不带日志记录。
清单 27. 创建一个无镜像的 blobspace
EXECUTE FUNCTION task("create sbspace from storagepool", "sbspace2", "5 GB");
- 创建一个镜像的 240MB 智能 blobspace,命名为 “sbspace1”,带日志记录。
create tempsbspace from storagepool
该命令使用存储池中的条目创建一个临时的智能 blobspace。在本例中,无日志标志或镜像标志参数。该命令的语法如下:
EXECUTE FUNCTION task("create tempsbspace from storagepool", <space name>, <size>);
让我们看一个例子。创建 100MB 的临时智能 blobspace。
清单 28. 创建一个临时的智能 blobspace
EXECUTE FUNCTION task("create tempsbspace from storagepool", "temp_sbspace1", "100 MB");
使用存储池创建块
要使用存储池手动将块添加到空间中,可使用以下命令。
EXECUTE FUNCTION task("create chunk from storagepool", < space name
>, < size >);
注意,modify space expand
命令可能也从存储池创建一个块并将其添加到指定空间。但是如果空间有可扩展的块,它也可扩展块,而非创建新块。create chunk from storagepool
命令强制添加块。
让我们看一个例子。将一个 200MB 的块添加到 “logdbs” 空间。
清单 29. 将块添加到空间
EXECUTE FUNCTION task("create chunk from storagepool", "logdbs", "200 MB");
添加或返回删除的块空间到存储池
在删除空白空间时,可以自动将删除的块添加到存储池。空间最初是否来自于存储池并不重要。该命令的一般语法如下:
EXECUTE FUNCTION task("drop dbspace | tempdbspace | blobspace |
sbspace | tempsbspace to storagepool", <space name>);
让我们看一个例子。删除一个名为 “mydbs3” 的空白 dbspace,将所有释放的块空间添加到存储池。
清单 30. 删除空白 dbspace;添加释放的块空间
EXECUTE FUNCTION task("drop dbspace to storagepool", "mydbs3");
您还可以删除个别块,并使用以下命令将其空间添加到存储池:
EXECUTE FUNCTION task("drop chunk to storagepool", <space
name>, <path>, <offset>);
清单 31. 示例
EXECUTE FUNCTION task("drop chunk to storagepool", "bigdbs", "/dev/rawdisk23", "100 KB");
在块删除期间返回或添加空间到存储池时,Informix 将空间与任何现有条目结合起来。但是,在手动输入 storagepool add
或
storagepool modify
命令期间不会有该串联。
管理任务命令快速参考
表 3. 管理块可扩展性
命令 | 参数 | 用途 |
---|---|---|
modify chunk extendable [on] | off | <chunk number> | 将块标记为可扩展。 |
modify chunk extend | <chunk number> ,
<extend amount> | 根据给定值手动扩展块。 |
表 4. 管理存储空间
命令 | 参数 | 用途 |
---|---|---|
modify space sp_sizes | <space
name> ,<new create
size> ,
<new
extend size> | 更新存储空间的自动扩展特征。
创建大小是自动创建的块的最小大小。 扩展大小是空间中一个块可自动扩展的最小分配大小。 |
modify space expand | <space
name> ,<expand size> | 根据给定值手动扩展块。 |
表 5. 管理存储池
命令 | 参数 | 用途 |
---|---|---|
storage pool add | <path> ,<begin offset> ,
<total
size> ,<chunk size> ,
<priority> | 将新条目添加到存储池。 |
storage pool modify | <entry
id> ,<new total size> ,
<new chunk
size> ,<new
priority> | 修改现有存储池条目。 |
storage pool delete | <entry id> | 删除现有存储池条目。 |
storage pool purge <all |
full | errors> | 无 | 删除所有现有存储池条目。 |
表 6. 使用存储池创建和删除存储空间
命令 | 参数 | 用途 |
---|---|---|
create dbspace from
storagepool | <space
name> ,<size> ,
[<page
size>[ ,
<mirror
flag>]] | 使用存储池中的条目创建 dbspace。 |
create tempdbspace from
storagepool | <space name> ,
<size> ,
[<page size>] | 使用存储池中的条目创建临时 dbspace。 |
create blobspace from
storagepool | <space
name> ,<size> ,
[<blobpage
size>[ ,
<mirror
flag>]] | 使用存储池中的条目创建 blobspace。 |
create sbspace from
storagepool | <space name> ,
<size> ,
[<log
flag>[ ,
<mirror
flag>]] | 使用存储池中的条目创建智能 blobspace。 |
create tempsbspace from
storagepool | <space name> ,
<size> | 使用存储池中的条目创建临时智能 blobspace。 |
create chunk from
storagepool | <space name> ,
<size> | 使用存储池将块添加到指定的存储空间。 |
drop dbspace | tempdbspace |
blobspace | sbspace | tempsbspace to storagepool | <space name> | 删除空白存储空间并将其添加到存储池。 |
有用信息
块路径命名约定
使用存储池中的条目从头创建一个块时,其名称采用以下格式:
<server name>_<space name>_<p or m>_<counter>
其中:
- <server name> = DBSERVERNAME 的值
- <space name>= 向其中添加块的空间的名称
- <p or m> = ‘p’ 表示主块,‘m’ 表示镜像块
- <counter> = 确保我们生成惟一文件名的整数
让我们看看几个例子。
- ifmx1_dbspace4_p_1
- ifmx1_logdbs_p_4
- ifmx1_logdbs_m_1
sysmaster 表中的信息
- sysmaster:syschunks 视图现在有一个名为 ‘is_extendable’ 的附加列,指示块是否可扩展。
- sysmaster:sysdbstab 表有两个新列:‘create_size’ 和 ‘extend_size’。
内部管理 API
有很多管理任务可供 Informix 在内部使用。这里介绍它们是仅作参考之用。DBA 不应试图手动执行这些任务。
add_storage
- 该任务添加块到 DBSpace、临时 DBSpace、BlobSpace、SBSpace 或临时 SBSpace。如果 Informix 存储池未填满,或出于其他原因不能成功添加块,则任务失败。mon_low_storage
- 这是一个定期运行的传感器任务,监控 DBSpace 空闲空间。当某个存储池中的空闲空间低于特定阈值时,mon_low_storage
任务尝试扩展空间。该传感器执行的频率可由管理员使用以下 SQL 设置,其中 <minutes> 应以分钟数取代:清单 32. 设置
mon_low_storage
频率DATABASE sysadmin; UPDATE ph_task set tk_frequency = INTERVAL (<minutes>) MINUTE TO MINUTE WHERE tk_name = "mon_low_storage";
转换/还原考虑因素
值得注意的是,如果您将服务器还原为早期版本的 Informix(11.70xC1 之前),您会丢掉所有存储配置设置和功能。重新恢复为 11.70.xC1 或更高版本也不会恢复任何设置。但是,在 11.70 中创建的任何块或空间,不管使用什么方法,在还原过程中保持不变。
复制考虑因素
当为主服务器分配一个目录以便在存储池中使用时,这一目录必须也存在于所有 HDR 和 RSS 辅助服务器上。在将目录添加到存储池时,Informix 会验证辅助服务器上是否存在该目录,如果不存在,则主服务器上的添加操作失败。
结束语
使用存储配置特性,您可以配置服务器,在需要更多空间时自动管理存储空间。存储配置特性允许您更有效地使用空间,确保按需分配空间,同时减少空间不足错误和人工监控空间(确定哪个存储空间将耗尽空闲空间以及何时耗尽)所需的时间。您还可以配置服务器,在空间变满之前以及空闲页面低于指定阈值时扩展空间。即使配置和启用了自动存储配置,还是可以手动扩展空间或块。
相关主题
- 在 Information Center 了解有关 Informix 特性的更多信息。
- 在 developerWorks 的 Informix 专区,获取提高您的 Informix 技能所需的资源。
- 随时关注 developerWorks 技术活动 和 网络广播,了解各种 IBM 产品和 IT 行业话题。
- 下载 Informix 试用版。
- 以最适合您的方式 IBM 产品评估试用版软件:下载产品试用版,在线试用产品,在云环境下试用产品,或者在 IBM SOA 人员沙箱 中花费几个小时来学习如何高效实现面向服务架构。