最近,搭建了一个DB2的测试环境,装完系统后,发现有一个美国带的样例数据无法导入,详细环境如下:
桌面:Desktop 10.3.1
DB2: V97 FP8 X64 For NT
从错误信息上得不到任何的提示,继续做测试
导入数据的时候出了空间字段,属性字段全部删除,可以导入进去,说明出问题出在这些属性字段上,但是仍然查不出原因。
继续测试,由于原数据存储在FileGDB中因此可以使用拷贝粘贴的功能进行数据录入,在粘贴中报如下错误:
报SQL0268错误,查询SQL0268具体信息如下:
SQL0268N 当正在重新分发数据库分区组时,不能执行 "<操作>"。 说明: 下列其中一项适用,由 "<操作>" 指示: * 正在重新分发数据库分区组,在完成当前操作之前,不能再次改变、删除或重 新分发该数据库分区组。 * 当正在重新分发表的数据库分区组时,不能删除该表的分区键。 * 不能创建新对象,因为 REDISTRIBUTE 正在删除此数据库分区组中所有旧的数 据库分区。 * 不能通过 ALTER TABLE 来添加新列,因为 REDISTRIBUTE 正在删除此数据库 分区组中所有旧的数据库分区。 无法处理该语句。 用户响应: 等到完成重新分发之后再次尝试该请求。 sqlcode:-268 sqlstate:55038
这个错误就非常明确了,是因为创建表需要16k页的表空间,但是现有的数据库默认表空间的页大小为4k,不够。
为什么需要16k的表空间呢,继续查看源数据,发现数据的几个Text类型的字段设置的最大大小都是2048,一个是6个字段,大小为12k,由于DB2数据库记录不能跨页存储(oracle是可以的,因此在oracle数据库上不存在这个问题),因此需要一个16k页面的表空间才可以,这也是为什么不录入属性字段就能录入进去的原因。
知道原因解决就容易多了,可以有以下几种解决方案。
- 导入的时候重新设置字段的最大大小
- 创建一个16k的表空间,并将数据导入其中,具体可以参考下面的流程
创建page为16k的表空间
C:\Program Files\IBM\SQLLIB\BIN>db2 CREATE BUFFERPOOL BUFBP16K IMMEDIATE SIZE 2 50 PAGESIZE 16 K DB20000I SQL 命令成功完成。 C:\Program Files\IBM\SQLLIB\BIN>db2 CREATE REGULAR TABLESPACE SDETBS16K PAGESI ZE 16 K MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 16 OVERHEAD 10.5 PREFETCHSIZE 1 6 TRANSFERRATE 0.14 BUFFERPOOL BUFBP16K DROPPED TABLE RECOVERY ON DB20000I SQL 命令成功完成。
将SDE的关键字导出出来
编辑export .ext
将##DEFALUTS关键字的B_STORAGE 修改成
DEFAULTS
A_INDEX_ROWID “”
A_INDEX_SHAPE “”
A_INDEX_STATEID “”
A_INDEX_USER “”
A_STORAGE “”
AUX_STORAGE “”
B_INDEX_ROWID “”
B_INDEX_SHAPE “”
B_INDEX_TO_DATE “”
B_INDEX_USER “”
B_RUNSTATS “YES”
B_STORAGE “”
BLK_BLOB_OPTION “LOGGED NOT COMPACT”
BLK_INDEX_COMPOSITE “”
BLK_STORAGE “in sdetbs16k”
接着导入到SDE库中
重新拷贝粘贴即可。