SQL0286N. DB2表空间的pagesize问题

 今天在一个DB2环境中导入一批表结构,结果在中途报错退出

SQL0286N  A default table space could not be found with a page size of at 
least "16384" that authorization ID "DB2INST1" is authorized to use. 

 由于对DB2也不是很熟悉,首先根据报错上文找到DDL脚本中的SQL语句,大概是这样的

CREATE TABLE BOND_BASE_INFO ( ... BACK_MEMO VARCHAR(500), CCY_NET_FULL_CN_NM VARCHAR(1024), ERLY_RDM_CNDTN VARCHAR(4000), ERLY_CASH_CNDTN VARCHAR(4000), ...)

 那么其实报错说的很清楚了,表空间的pagesize不够,而创建这张表至少需要16K的page。

查看了一下当前database的表空间

db2 => select TBSPACE, OWNER, PAGESIZE from syscat.tablespaces

TBSPACE                        OWNER                          PAGESIZE   
------------------------------ ------------------------------ -----------
SYSCATSPACE                    SYSIBM                                4096
TEMPSPACE1                     SYSIBM                                4096
USERSPACE1                     SYSIBM                                4096
SYSTOOLSPACE                   DB2INST1                              4096
SYSTOOLSTMPSPACE               DB2INST1                              4096

 从这里可以看到,所有的表空间都是系统默认创建的,并且使用的pagesize也是默认的4K

官方文档相关内容如下:

 When a database is created, three table spaces are defined: (1) SYSCATSPACE for the system catalog tables, (2) TEMPSPACE1 for system temporary tables created during database processing, and (3) USERSPACE1 for user-defined tables and indexes. You can also create additional user table spaces at the same time.
 Using the CREATE DATABASE command, you can specify the page size for the default buffer pool and the initial table spaces. This default also represents the default page size for all future CREATE BUFFERPOOL and CREATE TABLESPACE statements. If you do not specify the page size when creating the database, the default page size is 4 KB.

 那么在实例创建时(即create database),系统会默认为此database创建三个表空间,并且在不指定任意参数的情况下,所有参数都会使用默认值。并且除了文档提到的SYSCATSPACE、TEMPSPACE1、USERSPACE1这三个表空间外,本例中还出现了两个systool表空间,这是在实例中第一次使用管理调度工具的时候创建的。另外这里需要特别注意的是,pagesize默认值为4KB。
 首先我尝试通过DDL指令来更改定义,不过V9.7貌似是不支持直接更改pagesize.

 To alter a table space using the command line, use the ALTER TABLESPACE statement.

 Depending on the type of table space, you can do things such as:
● Increasing the size of the table space by adding additional containers
● Resizing existing containers
● Dropping containers
● Rebalance the table space to start making use of new containers, or to move data out of dropped containers
● Lower the high water mark for the table space
● Reduce the overall size of the table space.

 看来是只支持容器大小调整删除,以及碎片清理操作。
 既然不能修改表空间的话,那就只能新建database或者tablespace了,由于受到Oracle的影响,认为用户和tablespace是存在绑定关系的,那么对于oracle的思维,需要新建个用户,然后将老的数据导过来?

 不过在这点上,DB2的机制还是有很大差别的。DB2里,我的理解是,表空间是和实例绑定的,实例也就是databases,用户只需有使用database的相关权限就行了,物理存储方面不做严格的区分,不过DB2里建表语句可以通过in子句来选择自己想要使用的表空间。那么其实在管理上,分的不像oracle那么细,oracle里同一个实例的不同schema是可以使用自己单独的表空间的,并且用户必须绑定一个表空间。

 解决方式其实是很简单的,在这个database里新创建一个满足要求的表空间就够了,不过这里需要注意的是,buffer pool和表空间的pagesize大小需要对应。

#创建pagesize为32K的bufferpool
db2 => create BUFFERPOOL bigbuffer SIZE 5000 PAGESIZE 32K
DB20000I  The SQL command completed successfully.

#创建pagesize为32K的tablespace,同时使用新创建的bufferpool
db2 => CREATE TABLESPACE bigtablespace PAGESIZE 32K BUFFERPOOL bigbuffer
DB20000I  The SQL command completed successfully.

现在再来看一下表空间的情况

db2 => select TBSPACE, OWNER, PAGESIZE from syscat.tablespaces

TBSPACE                       OWNER                          PAGESIZE   
-------------------    ------ --------------           ----- -----------
SYSCATSPACE                   SYSIBM                                4096
TEMPSPACE1                    SYSIBM                                4096
USERSPACE1                    SYSIBM                                4096
SYSTOOLSPACE                  DB2INST1                              4096
SYSTOOLSTMPSPACE              DB2INST1                              4096
BIGTABLESPACE                 DB2INST1                             32768

接下来再来创建这张表,就OK了

db2 => CREATE TABLE BOND_BASE_INFO ( SRNO INTEGER NOT NULL , ANCMNT_DATE DATE,  ...)
DB20000I  The SQL command completed successfully.

 不过,如果你不想要使用多个表空间的话,也可以将之前tablespace中的数据导入到新的tablespace中,这里DB2支持直接导入到指定的tablespace,db2 databasename import -ts tablespace_name。

上一篇:银行存取款模型的线程同步问题


下一篇:从一个案例看mysqldump的复制选项