DB2 V9.7 for Linux, UNIX, and Windows

表空间状态

本主题提供有关受支持表空间状态的信息。

IBM® DB2® 数据库产品当前至少支持 25 种表或表空间状态。在特定情况下,这些状态用于控制对数据的访问权,或者根据需要触发特定的用户操作以保护数据库的完整性。它们中的大部分来自与某个 DB2 数据库实用程序(例如,装入实用程序或者备份和复原实用程序)的操作有关的事件。 下表描述了各种受支持的表空间状态。另外,该表还提供了一些工作示例以说明如何对管理数据库时可能遇到的各种状态作出解释和响应。这些示例均摘自曾在 AIX® 上运行的命令脚本;您可以单独复制、粘贴并运行这些示例。如果您是在非 UNIX 系统上运行 DB2 数据库产品,请确保所有路径名均采用适合于您的系统的正确格式。其中的大多数示例均基于随 DB2 数据库产品附带的 SAMPLE 数据库中的表。少数示例需要某些不属于 SAMPLE 数据库的方案,但您可以使用与 SAMPLE 数据库的连接作为起始点。

表 1. 受支持的表空间状态
State 十六进制状态值 描述 示例
备份暂挂 0x20 在执行时间点表空间前滚操作后,或者在对可恢复的数据库执行指定了 COPY NO 选项的装入操作后,表空间将处于此状态。必须备份表空间(或者整个数据库),然后才能使用该表空间。如果未备份表空间,那么可以对该表空间中的表执行查询,但不能进行更新。
注: 另外,在启用数据库以执行前滚恢复操作后,还必须立即备份该数据库。如果 logretain 数据库配置参数已设置为 RECOVERY 或者 userexit 数据库配置参数已设置为 YES,那么数据库是可恢复的。在备份数据库前,不能激活或连接至此类数据库。完成数据库备份时,backup_pending 信息数据库配置参数的值将设置为 NO。

1. 如果装入输入文件 staff_data.del 包含以下内容:

11,"Melnyk",20,"Sales",10,70000,15000:

update db cfg for sample using logretain recovery;
backup db sample;
connect to sample;
load from staff_data.del of del messages load.msg
 insert into staff copy no; 
update staff set salary = 69000 where id = 11;
2.
update db cfg for sample using logretain recovery;
connect to sample;
正在备份 0x800 这是一种瞬态状态,仅在执行备份操作期间有效。 发出联机 BACKUP DATABASE 命令:
backup db sample online;
运行备份操作时,请从其他会话执行以下脚本:
connect to sample;
1.
list tablespaces show detail;
或者
2.
get snapshot for tablespaces on sample; 
connect reset;
返回的 USERSPACE1 信息显示此表空间处于“正在备份”状态。
正在进行 DMS 重新平衡 0x10000000 这是一种瞬态状态,仅在执行数据重新平衡操作期间有效。如果将新容器添加至一个定义为数据库管理的空间 (DMS) 的表空间,或者扩展了现有容器,那么可能会对表空间数据进行重新平衡。重新平衡是将表空间扩展数据块从一个位置移到另一个位置以尝试保持数据条带化的过程。扩展数据块是容器空间的单位(以页计),而条带是跨表空间的容器集的扩展数据块层。 如果装入输入文件 staffdata.del 包含大量数据(例如 20000 或更多记录):
connect to sample;
create tablespace ts1 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/ts1c1' 1024); 
create table newstaff like staff in ts1; 
load from staffdata.del of del insert into newstaff
 nonrecoverable; 
alter tablespace ts1 add (file '/home/melnyk/melnyk
/NODE0000/SQL00001/ts1c2' 1024); 
list tablespaces; 
connect reset; 
返回的 TS1 信息显示此表空间处于“正在进行 DMS 重新平衡”状态。
禁用暂挂 0x200 在执行数据库前滚操作期间,表空间可能处于此状态,但在前滚操作结束时,表空间不应该处于此状态。表空间脱机及事务的补偿日志记录未写入所导致的情况将触发此状态。此表空间状态的出现和后续消失对于用户是透明的。 对此表空间状态的说明不在本文档的范围内,因此未给出示例。
删除暂挂 0x8000 在执行数据库重新启动操作期间,如果发现表空间的一个或多个容器出现问题,那么该表空间将处于此状态。如果数据库的前一个会话异常终止(例如,在电源发生故障期间异常终止),那么必须重新启动此数据库。如果表空间处于“删除暂挂”状态,那么表空间将不可用并且只能删除。 对此表空间状态的说明不在本文档的范围内,因此未给出示例。
正在装入 0x20000 这是一种瞬态状态,仅在对可恢复数据库执行指定了 COPY NO 选项的装入操作期间有效。另请参阅“正在装入”表状态。 如果装入输入文件 staffdata.del 包含大量数据(例如 20000 或更多记录):
update db cfg for sample using logretain recovery;
backup db sample; 
connect to sample; 
create table newstaff like staff; 
load from staffdata.del of del insert into newstaff
 copy no; 
connect reset;
运行装入操作时,请从其他会话执行以下脚本:
connect to sample; 
list tablespaces; 
connect reset;
返回的 USERSPACE1 信息显示此表空间处于“正在装入”状态(及“备份暂挂”)状态。
正常 0x0 如果表空间未处于任何其他(异常)表空间状态,那么该表空间处于“正常”状态。“正常”状态是创建表空间后该表空间的初始状态。
connect to sample;
create tablespace ts1 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc1' 1024); 
list tablespaces show detail;
脱机且不可访问 0x4000 如果表空间的一个或多个容器出现问题,那么该表空间将处于此状态。容器可能意外重命名、移动或损坏。修正问题并且与该表空间相关联的容器可再次访问后,可通过从数据库断开所有应用程序的连接,然后重新连接至该数据库,来除去此异常状态。另外,还可以发出 ALTER TABLESPACE 语句并指定 SWITCH ONLINE 子句,以从表空间中除去“脱机且不可访问”状态,而不必从数据库断开其他应用程序的连接。
connect to sample;
create tablespace ts1 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc1' 1024); 
alter tablespace ts1 add (file '/home/melnyk/melnyk
/NODE0000/SQL00001/tsc2' 1024); 
export to st_data.del of del select * from staff; 
create table stafftemp like staff in ts1; 
import from st_data.del of del insert into stafftemp; 
connect reset; 
将表空间容器 tsc1 重命名为 tsc3,然后尝试查询 STAFFTEMP 表:
connect to sample; 
select * from stafftemp; 
该查询会返回 SQL0290N(不允许进行表空间访问),并且 LIST TABLESPACES 命令会返回 TS1 的状态值 0x4000(脱机且不可访问)。将表空间容器 tsc3 重命名为 tsc1。此时,查询可成功运行。
停顿互斥 0x4 对表空间停顿函数进行调用的应用程序对表空间具有互斥(读或写)访问权时,该表空间将处于此状态。可通过发出 QUIESCE TABLESPACES FOR TABLE 命令将表空间显式地置于“停顿互斥”状态。 将表空间设置为“停顿互斥”状态前,请确保表空间处于“正常”状态。
connect to sample;
quiesce tablespaces for table staff reset; 
quiesce tablespaces for table staff exclusive; 
connect reset; 
从其他会话执行以下脚本:
connect to sample; 
select * from staff where id=60; 
update staff set salary=50000 where id=60; 
list tablespaces; 
connect reset; 
返回的 USERSPACE1 信息显示此表空间处于“停顿互斥”状态。
停顿共享 0x1 对表空间停顿函数进行调用的应用程序及并行应用程序对表空间都具有读访问权(但没有写访问权)时,该表空间将处于此状态。可通过发出 QUIESCE TABLESPACES FOR TABLE 命令将表空间显式地置于“停顿共享”状态。 将表空间设置为“停顿共享”状态前,请确保表空间处于“正常”状态。
connect to sample; 
quiesce tablespaces for table staff reset; 
quiesce tablespaces for table staff share; 
connect reset;
从其他会话执行以下脚本:
connect to sample; 
select * from staff where id=40; 
update staff set salary=50000 where id=40; 
list tablespaces; 
connect reset;
返回的 USERSPACE1 信息显示此表空间处于“停顿共享”状态。
停顿更新 0x2 对表空间停顿函数进行调用的应用程序对表空间具有互斥写访问权时,该表空间将处于此状态。可通过发出 QUIESCE TABLESPACES FOR TABLE 命令将表空间显式地置于“停顿更新”状态。 将表空间设置为“停顿更新”状态前,请确保表空间处于“正常”状态。
connect to sample;
quiesce tablespaces for table staff reset; 
quiesce tablespaces for table staff intent to update; 
connect reset; 
从其他会话执行以下脚本:
connect to sample; 
select * from staff where id=50; 
update staff set salary=50000 where id=50; 
list tablespaces; 
connect reset; 
返回的 USERSPACE1 信息显示此表空间处于“停顿更新”状态。
正在重组 0x400 这是一种瞬态状态,仅在执行重组操作期间有效。 发出 REORG TABLE 命令:
connect to sample; 
reorg table staff; 
connect reset;
运行重组操作时,请从其他会话执行以下脚本:
connect to sample;
1.
list tablespaces show detail;
或者
2.
get snapshot for tablespaces on sample; 
connect reset;
返回的 USERSPACE1 信息显示此表空间处于“正在重组”状态。
注: 涉及到 SAMPLE 数据库的“重组表”操作可能在很短时间内完成,因此,使用此方法可能很难察看到“重组进度”状态。
复原暂挂 0x100 在“重定向复原”操作的第一部分之后(即,在发出 SET TABLESPACE CONTAINERS 命令之前),数据库的表空间将处于此状态。必须复原表空间(或整个数据库),然后才能使用该表空间。在成功完成复原操作前,不能连接至数据库。在成功完成复原操作时,restore_pending 信息数据库配置参数的值将设置为 NO。 在“可定义存储器”状态下完成“重定向复原”操作的第一部分时,所有表空间都将处于“复原暂挂”状态。
正在复原 0x2000 这是一种瞬态状态,仅在执行复原操作期间有效。
update db cfg for sample using logretain recovery; 
backup db sample; 
backup db sample tablespace (userspace1); 
此备份映像的时间戳记为:

20040611174124

restore db sample tablespace (userspace1) online
 taken at 20040611174124; 
运行复原操作时,请从其他会话执行以下脚本:
connect to sample;
1.
list tablespaces show detail; 
或者
2.
get snapshot for tablespaces on sample; 
connect reset;
返回的 USERSPACE1 信息显示此表空间处于“正在复原”状态。
前滚暂挂 0x80 对可恢复数据库执行复原操作后,表空间将处于此状态。必须前滚表空间(或整个数据库),然后才能使用该表空间。如果 logretain 数据库配置参数已设置为 RECOVERY 或者 userexit 数据库配置参数已设置为 YES,那么数据库是可恢复的。在成功完成前滚操作前,不能激活或连接至数据库。在成功完成前滚操作时,rollfwd_pending 信息数据库配置参数的值将设置为 NO。 在“正在复原”状态下完成联机表空间复原操作时,表空间 USERSPACE1 将处于“前滚暂挂”状态。
正在前滚 0x40 这是一种瞬态状态,仅在执行前滚操作期间有效。 如果装入输入文件 staffdata.del 包含大量数据(例如 20000 条或更多记录):
update db cfg for sample using logretain recovery;
backup db sample; 
connect to sample; 
create tablespace ts1 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/ts1c1' 1024); 
create table newstaff like staff in ts1; 
connect reset; 
backup db sample tablespace (ts1) online; 
此备份映像的时间戳记为:

20040630000715

connect to sample; 
load from staffdata.del of del insert into newstaff
 copy yes to /home/melnyk/backups; 
connect reset; 
restore db sample tablespace (ts1) online taken at
 20040630000715; 
rollforward db sample to end of logs and stop
 tablespace (ts1) online; 
运行前滚操作时,请从其他会话执行以下脚本:
connect to sample;
1.
list tablespaces show detail; 
或者
2.
get snapshot for tablespaces on sample; 
connect reset;
返回的 TS1 信息显示此表空间处于“正在前滚”状态。
可定义存储器 0x2000000 在“重定向复原”操作的第一部分之后(即,在发出 SET TABLESPACE CONTAINERS 命令之前),数据库的表空间将处于此状态。这允许您根据需要重定义容器。
backup db sample;
假定此备份映像的时间戳记是 20040613204955:
restore db sample taken at 20040613204955 redirect; 
list tablespaces;
LIST TABLESPACES 命令返回的信息显示所有表空间都处于“可定义存储器”和“复原暂挂”状态。
必须定义存储器 0x1000 如果在执行“重定向到新数据库复原”操作期间省略了“设置表空间容器”阶段,或者如果在“设置表空间容器”阶段无法获取指定的容器,那么数据库的表空间将处于此状态。在“设置表空间容器”阶段无法获取指定容器的原因可能是指定的路径名无效或磁盘空间不足等。
backup db sample;
假定此备份映像的时间戳记是 20040613204955:
restore db sample taken at 20040613204955 into
 mydb redirect; 
set tablespace containers for 2 using
 (path 'ts2c1'); 
list tablespaces; 
LIST TABLESPACES 命令返回的信息显示表空间 SYSCATSPACE 和表空间 TEMPSPACE1 处于“必须定义存储器”、“可定义存储器”和“复原暂挂”状态。“必须定义存储器”状态优先于“可定义存储器”状态。
暂挂写入 0x10000 写入操作暂挂后,表空间将处于此状态。 对此表空间状态的说明不在本文档的范围内,因此未给出示例。
正在创建表空间 0x40000000 这是一种瞬态状态,仅在执行“创建表空间”操作期间有效。
connect to sample;
create tablespace ts1 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc1' 1024); 
create tablespace ts2 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc2' 1024); 
create tablespace ts3 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc3' 1024); 
运行“创建表空间”操作时,请从其他会话执行以下脚本:
connect to sample;
1.
list tablespaces show detail;
或者
2.
get snapshot for tablespaces on sample; 
connect reset;
返回的 TS1、TS2 和 TS3 信息说明这些表空间处于“正在创建表空间”状态。
正在删除表空间 0x20000000 这是一种瞬态状态,仅在执行“删除表空间”操作期间有效。
connect to sample; 
create tablespace ts1 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc1' 1024); 
create tablespace ts2 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc2' 1024); 
create tablespace ts3 managed by database using
 (file '/home/melnyk/melnyk/NODE0000/SQL00001
/tsc3' 1024); 
drop tablespace ts1; 
drop tablespace ts2; 
drop tablespace ts3; 
运行“删除表空间”操作时,请从其他会话执行以下脚本:
connect to sample;
1.
list tablespaces show detail;
或者
2.
get snapshot for tablespaces on sample; 
connect reset; 
返回的 TS1、TS2 和 TS3 信息说明这些表空间处于“正在删除表空间”状态。