DB2 模拟常见的表状态异常以及如何查看异常的表

DB2 模拟常见的表状态异常,包括 set integrity pending, reorg pending, load pending, 不可用等。

1. set integrity pending

db2 "drop table t2023a"
db2 "drop table t2023b"
db2 "drop table t2023c"
db2 "create table t2023a(id int not null primary key)"
db2 "create table t2023b(id int not null primary key)"
db2 "create table t2023c(id int not null primary key)"

db2 "alter table t2023b add  constraint cons1 check (id < 100000000)"
db2 "alter table t2023b add  foreign key(id) REFERENCES t2023a"
db2 "alter table t2023c add  foreign key(id) REFERENCES t2023b"

seq 1 10 > t1.del

db2 "load from t1.del of del replace into t2023a nonrecoverable"
db2 "load from t1.del of del replace into t2023b nonrecoverable"
db2 "load from t1.del of del replace into t2023c nonrecoverable"

这里只所以用3张表,是为了展示表的依赖关系,这时候如果直接对 t2023c 做 set integrity 操作,是解除不了表的状态的

2. load pending

db2 "drop table t2023d"
db2 "create table t2023d(id int not null primary key)"
seq 1 1000000 > t2.del

db2 "load from t2.del of del replace into t2023d nonrecoverable"
Ctrl+C <--中断load作业

3. reorg pending

db2 "drop table t2023e"
db2 "create table t2023e(name char(10))"
db2 "alter table t2023e alter column name set data type char(21)"

4. Unavailable

db2 "drop table t2023f"
db2 "create table t2023f(name char(10))"
db2 +c "alter table t2023f activate not logged initially"
db2 "rollback"

查询状态异常的表SQL如下:

db2 "select varchar(tabschema,40) as tabschema, varchar(tabname,80) as tabname, 'SetIntegrityPending' as status from syscat.tables where STATUS='C'
union select varchar(tabschema,40) as tabschema, varchar(tabname,80) as tabname, 'ReorgPending' as status from SYSIBMADM.ADMINTABINFO where REORG_PENDING='Y'
union select varchar(tabschema,40) as tabschema, varchar(tabname,80) as tabname, 'LoadPending' as status from SYSIBMADM.ADMINTABINFO where LOAD_STATUS='PENDING'
union select varchar(tabschema,40) as tabschema, varchar(tabname,80) as tabname, 'Unavailable' as status from SYSIBMADM.ADMINTABINFO where AVAILABLE='N'
 with ur"
 

TABSCHEMA      TABNAME           STATUS             
-------------- ----------------- -------------------
DB2INST1       T2023A            SetIntegrityPending
DB2INST1       T2023B            SetIntegrityPending
DB2INST1       T2023C            SetIntegrityPending
DB2INST1       T2023D            LoadPending        
DB2INST1       T2023E            ReorgPending       
DB2INST1       T2023F            Unavailable        

  6 record(s) selected.

### 关于逻辑与物理之间的快照关系或实现方式 在数据库设计中,逻辑和物理的概念区分非常重要。逻辑是指应用程序所看到的数据结构形式,而物理则是指存储在磁盘上的实际数据布局。 #### 逻辑与物理的关系 逻辑通常是对最终用户的抽象示,它可能由多个物理组合而成。这种分离允许数据库管理系统(DBMS)通过复杂的询优化技术来提高性能[^1]。例如,在DB2中使用的贪婪算法和动态规划算法可以用于决定如何最有效地访问这些物理以满足特定的询需求。 #### 快照机制概述 快照(snapshot)是一种常见数据库特性, 它提供了某个时间点上数据的一致视图。对于支持事务隔离级别的数据库来说,快照可以帮助解决读写冲突问题并提供一致性的只读副本给并发运行的操作使用。具体到逻辑与物理之间: - **一致性保障**: 当创建一个基于某一时刻状态下的快照时,即使基础数据发生变化(即更新了某些记录),该快照仍能反映原始的状态直到其生命周期结束为止。 - **实现方法**: - **Copy-On-Write (COW)**: 这种策略下只有当某条记录被修改时才会复制一份新的版本放入快照区域;未更改部分则继续指向原有的位置从而节省空间开销。 - **Redirected Writes**: 另一种常见做法是在每次写入操作发生之前先判断当前是否处于活动快照期间内——如果是,则将新值存放到专门分配的位置而不是覆盖原地址内容,以此维持旧版不变供现有快照调用之需。 #### 示例代码展示 COW 的简单模拟过程如下所示: ```python class SnapshotManager: def __init__(self): self.data = {} self.snapshots = [] def set_value(self, key, value): if not self.snapshots or id(self.snapshots[-1]) != id(self.data): # 如果存在活跃快照或者即将改变的是最新层之外的内容才执行拷贝动作 temp_copy = dict(self.data) self.data[key] = value return True else: raise Exception("Cannot modify data while snapshot is active.") def create_snapshot(self): copied_data_at_time_t = dict(self.data) self.snapshots.append(copied_data_at_time_t) manager = SnapshotManager() manager.set_value('A', 10) manager.create_snapshot() # 创建第一个快照 print(manager.snapshots[0]['A']) # 输出应该是 '10' try: manager.set_value('B', 20) # 尝试直接新增键 B 应抛异常因有激活中的快照保护着底层数据不被随意篡改 except Exception as e: print(e.message) # 打印错误消息明无法在此状态下进行变更 ``` 上述例子仅作为概念演示用途,并不代真实世界里复杂环境下完整的解决方案。 ### 数据库设计考量因素 考虑到以上提到的各种技术和原理,在进行大型企业级应用系统的数据库架构规划阶段就必须充分权衡以下几个方面: - 性能 vs 存储成本; - 并发控制强度及其带来的锁等待现象频率高低程度评估; - 高可用性和灾难恢复能力构建等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值