博客园丁

我是博客园的一丁,我会永不停顿,不停创新。
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

阐明表和表空间的状态

Posted on 2008-05-14 00:03  Jason.Jiang  阅读(926)  评论(0编辑  收藏  举报
DB2 使用表和表空间状态来控制对数据的访问,或帮助保护数据库的完整性。本文描述了这些状态,并以工作示例的方式,展示了出现这些状态的典型条件和如何对其做出响应。目前,IBM® DB2® Universal Database™(DB2 UDB)至少支持 25 种表或表空间状态。这些状态在某些情况下被用来控制对数据的访问,或者在必要时被用来引出特定用户动作,以保护数据库的完整性。大多数状态产生于与某个 DB2 实用程序的操作相关的事件,例如加载实用程序,或者备份和恢复实用程序。

本文描述了每个受支持的表或表空间状态(见表 1;单击状态名跳至其描述,该描述位于后面的某个表中)。本文还提供了一些工作示例,以便准确地展示如何解释和响应管理数据库时可能碰到的状态。这些示例取自于 AIX® 上运行的命令脚本;您可以复制、粘贴并亲自运行它们。如果您在非 UNIX® 的系统上运行 DB2 UDB,请确保所有的路径名都是适合系统的正确格式。大多数示例都是以 SAMPLE 数据库中的表为基础的,该数据库是 DB2 UDB 附带的。也存在少数需要 SAMPLE 数据库中没有包含的场景的情况,但是,您可以将到 SAMPLE 数据库的连接用作为一个起始点。

表 2 和表 3 中描述了这些状态。 表 2描述了受支持的表空间状态,而 表 3 则描述了目前支持的表状态。

表 1. 到版本 8.1.4 为止的 DB2 UDB 所有支持版本中定义的表和表空间状态

状态 范围 状态 范围
Backup Pending 表空间 Quiesced Update 表空间
Backup in Progress 表空间 Read Access Only
Check Pending Reorg in Progress 表空间
DMS Rebalance in Progress 表空间 Restore Pending 表空间
Disable Pending 表空间 Restore in Progress 表空间
Drop Pending 表空间 Roll Forward Pending 表空间
Load Pending Roll Forward in Progress 表空间
Load in Progress 表空间或 表 Storage May be Defined 表空间
Normal 表空间或 表 Storage Must be Defined 表空间
Not Load Restartable Table Space Creation in Progress 表空间
Offline and Not Accessible 表空间 Table Space Deletion in Progress 表空间
Quiesced Exclusive 表空间 Unavailable
Quiesced Share 表空间

表空间状态

db2tbst 命令接收十六进制的状态值,并返回相应的表空间状态(参见图 1)。例如,命令 db2tbst 0x0008 返回 State = Load Pending 。而该十六进制的状态值反过来又是 LIST TABLESPACES 命令输出的组成部分(参见图 2)。

图 1. db2tbst 命令接收十六进制的表空间状态值并返回其状态。

图 1

表空间的外部可见状态是由单个状态值的十六进制总和构成的。例如,如果表空间的状态是 Backup Pending和 Load in Progress,那么所返回的十六进制值就是 0x20020(0x00020 + 0x20000)。本例中,命令 db2tbst 0x20020 返回:


            State = Backup Pending
            + Load in Progress
            

图 2. 可以使用 LIST TABLESPACES 命令确定连接数据库中表空间的当前状态。

图 2

 

表 2. 受支持的表空间状态

状态 十六进制状态值 描述 示例
Backup Pending 0x20 在执行指定时间点的(point-in-time)表空间前滚操作之后,或者在执行指定了 COPY NO 选项的 LOAD 操作(针对可恢复的数据库)之后,表空间处于这种状态。在使用该表空间之前,必须备份该表空间(或者是整个数据库)。如果没有备份这个表空间,那么只能对其中包含的表进行查询,而无法更新它们。注意:在启用数据库进行前滚恢复之后,还必须立即对该数据库进行备份。如果 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;
Backup in Progress 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 返回的信息显示,该表空间处于 Backup in Progress 状态。
DMS Rebalance in Progress 0x10000000 这是一种只在执行数据重新平衡操作期间才有效的临时状态。当向定义为数据库管理空间(DMS)的表空间添加新的容器时,或者当扩展现有的容器时,就可能发生表空间数据的重新调整。 重新调整(Rebalancing)是指将表空间区段(extent)从某一位置移动到另一位置,试图保持数据成一整块的过程。一个 区段(extent)就是一个容器空间单元(以页面为单位),而一个 条带(stripe)就是用于表空间的 跨容器集的一层区段。 已知载入的输入文件 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 Rebalance in Progress 状态。
Disable Pending 0x200 在执行数据库前滚操作期间,表空间可能处于这种状态,但在前滚操作结束之时,就不应再处于该状态。当出现表空间脱机以及对没有被写入硬盘的事务补偿日志记录时,就可能触发这种状态。该表空间状态的出现以及随后状态的消失对用户都是透明的。 至于说明该表空间状态的示例,已经超出了本文的范围。
Drop Pending 0x8000 在重新启动数据库时,如果发现该数据库的一个或多个容器有问题,那么表空间就会处于这种状态。(如果数据库的前一会话异常终止,例如停电时,就必须重新启动数据库。)如果表空间处于 Drop Pending 状态,就不再可用,只能将其删除。 至于说明该表空间状态的示例,已经超出了本文的范围。
Load in Progress 0x20000 这是一种只在执行指定了 COPY NO 选项的载入操作(针对可恢复的数据库)时才有效的临时状态。 已知载入的输入文件 staffdata.del 有大量数据(例如,20000 条或更多记录):
update db cfg for sample using logretain recovery;
connect to sample;
load from staffdata.del of del insert into newstaff copy no;
在执行载入操作时,从另一会话执行下列脚本:
connect to sample;
list tablespaces;
connect reset;
Information returned for USERSPACE1 返回的信息显示,该表空间处于 Load in Progress(和 Backup Pending)状态。
Normal 0x0 如果表空间不是处于任何其他(异常的)表空间状态,那么该表空间的状态就为 Normal 状态。Normal 状态是表空间被创建之后的初始状态。 connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc1' 1024);
list tablespaces show detail;
Offline and Not Accessible 0x4000 如果表空间的一个或多个容器存在问题,那么表空间就处于这种状态。容器偶然可能会被重命名、移动或损坏。在该问题被纠正,且再次可以访问与该表空间相关的容器之后,可以通过断开数据库与应用程序的连接,然后重新连接数据库来消除该异常状态。或者,您可以执行一条 ALTER TABLESPACE 语句,指定 SWITCH ONLINE 子句来消除表空间的 Offline and Not Accessible 状态,从而无需断开其他应用程序与该数据库的连接。 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(Offline and Not Accessible)。将表空间容器 tsc3 再次命名为 tsc1。这一次,该查询将运行成功。
Quiesced Exclusive 0x4 当调用表空间静默(quiesce)功能的应用程序独占(读或写)访问表空间时,该表空间就处于这种状态。您可以通过执行一条 QUIESCE TABLESPACES FOR TABLE 命令,将表空间置于 Quiesced Exclusive 状态。 在将表空间设置为 Quiesced Exclusive 之前,要确保它处于 Normal状态。
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;
Information returned for USERSPACE1 返回的信息显示,该表空间处于 Quiesced Exclusive 状态。
Quiesced Share 0x1 当调用表空间静默(quiesce)功能的应用程序和并发应用程序都可以读(但不能写)访问表空间时,该表空间就处于这种状态。您可以通过执行一条 QUIESCE TABLESPACES FOR TABLE 命令,将表空间显式地置于 Quiesced Share 状态。 在将表空间设置为 Quiesced Share 之前,要确保它处于 Normal状态。
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 返回的信息显示,该表空间处于 Quiesced Share 状态。
Quiesced Update 0x2 当调用表空间静默(quiesce)功能的应用程序独占写访问表空间时,该表空间就处于这种状态。您可以通过执行一条 QUIESCE TABLESPACES FOR TABLE 命令,将表空间显式地置于 Quiesced Update 状态。 在将表空间设置为 Quiesced Update 之前,要确保它处于 Normal状态。
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 返回的信息显示,该表空间处于 Quiesced Update 状态。
Reorg in Progress 0x400 这是一种只在进行重组(reorg)操作期间才有效的临时状态。 执行一条 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 返回的信息显示,该表空间处于 Reorg in Progress 状态。注意:涉及 SAMPLE 数据库的表重组操作很可能在极短的时间内就可以完成,因此,使用这种方法来观察 Reorg in Progress 状态可能比较困难。
Restore Pending 0x100 在执行了重定向恢复操作的第一部分之后(即在发出 SET TABLESPACE CONTAINERS 命令之前),数据库的表空间就处于这种状态。在使用表空间之前,必须恢复表空间(或者是整个数据库)。直到成功完成恢复操作,您才可以连接到数据库,此时, restore_pending信息数据库配置参数的值被设为 NO。 当处于 Storage May be Defined中的重定向恢复操作的第一部分完成时,所有的表空间都将处于 Restore Pending 状态。
Restore in Progress 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 返回的信息显示,该表空间处于 Restore in Progress 状态。
Roll Forward Pending 0x80 在对可恢复的数据库执行恢复操作之后,表空间就处于这种状态。在使用表空间之前,必须前滚该表空间(或是整个数据库)。如果 logretain数据库配置参数被设为 RECOVERY,或者 userexit数据库配置参数被设为 YES,那么该数据库是可恢复的。直到前滚操作成功完成,您才可以激活或连接到该数据库,此时, rollfwd_pending信息数据库配置参数被设为 NO。 当处于 Restore in Progress中的在线表空间完成恢复操作时,表空间 USERSPACE1 处于 Roll Forward Pending 状态。
Roll Forward in Progress 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 返回的信息显示,该表空间处于 Roll Forward in Progress 状态。
Storage May be Defined 0x2000000 在执行了重定向恢复操作的第一部分之后(即在发出 SET TABLESPACE CONTAINERS 命令之前),数据库的表空间就处于这种状态。 backup db sample;
假定该备份映像的时间戳为:20040613204955
restore db sample taken at 20040613204955 redirect;
list tablespaces;
Information returned by the LIST TABLESPACES 命令返回的信息显示,所有的表空间都处于 Storage May be Defined 和 Restore Pending状态。
Storage Must be Defined 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 都处于 Storage Must be Defined、 Storage May be Defined和 Restore Pending状态。Storage Must be Defined 状态比 Storage May be Defined 状态更重要。
Table Space Creation in Progress 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; or
2.get snapshot for tablespaces on sample;
connect reset;
TS1、TS2 和 TS3 返回的信息显示,这些表空间处于 Table Space Creation in Progress 状态。
Table Space Deletion in Progress 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 返回的信息显示,这些表空间处于 Table Space Deletion in Progress 状态。