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。

时间: 2024-09-08 06:58:09

SQL0286N. DB2表空间的pagesize问题的相关文章

db2表空间页大小的问题的解决

db2表空间页大小的问题. 今天新建了一张表,表的字段大小及数目比较多,在执行sql遇到 [IBM][CLI Driver][DB2/NT] SQL0286N 找不到页大小至少为 "8192".特许使用权限标识 "IES" 的缺省表空间. SQLSTATE=42727 Execution Failed! 经查是db2初始表空间页大小是4K.无法存放.于是准备修改用户表空间,但db2 7.2又无法进行修改.所以,只有新建一个页大小为8K的用户表空间.USERSPACE

DB2表空间理论基础(原创)

在DB2 V9版本中表空间的管理方式有系统管理表空间(SMS),数据库管理表空间(DMS)和自动存储管理,下面就以表空间的管理方式来介绍DB2的表空间 系统管理空间概述  在SMS(系统管理空间)表空间中,操作系统的文件系统管理器分配和管理用于存储表的空间.该存储模型通常由存储在文件系统空间中的多个文件组成,这些文件表示表对象.用户决定文件的位置.DB2 数据库 Linux 版.UNIX 版和 Windows 版控制它们的名称,而文件系统负责管理它们.通过控制写入每个文件的数据量,数据库管理器均

DB2表空间管理详解(原创)

create tablespace语法树 >>-CREATE --+-----------------------+---------------------------->            +-LARGE-----------------+               +-REGULAR---------------+               | .-SYSTEM-.            |               '-+--------+--TEMPORARY-'  

跟屌丝一起学习 DB2 第三课 创建表空间

缓冲池(bufferpool) 是一个内存块的集合,这些内存块采用页面的形式.在首次创建数据库时,同时创建了一个默认的缓冲池 IBMDEFAULTBP.可以在创建表空间时,或者在 Buffer Pools 视图中使用 Create New Bufferpool 向导,创建新的缓冲池. 缓冲池最重要的作用是,在数据库读写硬盘上的数据时帮助减少 I/O 开销.这是通过 I/O 预获取和页面清理器实现的.预获取能够减少读取页面的 I/O 开销,其原理是:预先判断特定查询可能需要的页面,然后将这些页面读

DB2基础:表空间和缓冲池

本文专为 IBM DB2 Universal Database for Linux.UNIX 和 Windows 而撰写 简介 对于刚涉足 DB2 领域的 DBA 或未来的 DBA 而言,新数据库的设计和性能选择可能会很令人困惑.在本文中,我们将讨论 DBA 要做出重要选择的两个方面:表空间和缓冲池.表空间和缓冲池的设计和调优会对 DB2 服务器的性能产生深远的影响,因此我们将着重讨论这些活动. 在我们的示例中,我们将使用 DB2 V8.1 企业服务器版.大多数示例也适用于低级版本.我们会让您知

【DB2学习】查看一个数据的表空间详情

db2 => list tablespaces show detail            当前数据库的表空间  表空间标识                        = 0  名称                       = SYSCATSPACE  类型                                       = 数据库管理空间  内容                                = 所有持久数据.常规表空间.  状态             

【DB2 学习】在复原过程中重定义表空间

      在备份数据库的时候,备份的表空间使用的所有表空间容器都将保存在一个记录中.在复原过程中,备份中列出的所有表空间将被检查是否可以访问.如果因为其他的一些原因有一个或多个容器不可使用,复原将失败.解决办法是在复原过程中重新定向表空间容器.包括了添加,修改,删除表空间的容器.         另外一种情况是在备份中所选列的容器在系统中并不存在,但用户仍然需要在这些容器中复原.比如在备份之外的地方进行恢复,新的系统中可能没有定义所需的容器 .解决办法:在复原时重定向表空间容器到另外一个支持的

使用DB2DART降低DB2数据库管理表空间高水位标记

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;本文介绍如何通过使用 DB2DART 工具降低 DB2 数据库管理表空间的高水位标记.      对于 DB2 数据库管理(DMS)表空间的高水位标记(HWM)是指该表空间曾经使用到的最大数据页数.如果使用: db2 list tablespaces show detail 看到某个 DMS 表空间的已用页数低于高水位标记,则有可能通过如下方法降低高水位标记: 重组表

db2 restore之后,三个表空间重定向失败,如何恢复

问题描述 db2 restore之后,三个表空间重定向失败,如何恢复 原镜像的表空间容器类型是deceive 恢复的时候用 set tablespace containes for 4 using (FILE '/data/temp.dat' 131072);容器类型用了File 并且改变了大小,这三个表空间用命令还原不成功,没法查询数据,后来在qc上找到相应表空间,alter修改表空间,依旧是修改为file容器类型,其中一个成功了,另外两个不能alter 有没有人能帮忙解释下,如何改变容器类型