如何扩展DB2表空间

如何扩展DB2表空间,第1张

查看表空间使用情况

db2pd

-d

dbname

-tablespaces

扩大表空间有3种方法:

扩展容器50G

db2

"alter

tablespace

tablespace_name

extend

(file

'/data1/ts2/con0'

50G,file

'/data1/ts2/con1'

50G)"

2.增加容器,不过会rebalance,影响系统性能

db2

"alter

tablespace

tablespacename

add

(file

'/data1/ts2/con2'

50G)"

3.通过alter

tablespace

begin

new

stripe

set

选项,该选项不rebalance,不会对系统性能造成影响,但它会造成数据偏移。

db2

"alter

tablespace

tablespace_name

begin

new

stripe

set

(file

'/data1/ts2/con3'

10G)"

根据表空间的类型不同,扩容方法不同。DB2一般分SMS和DMS两种类型表空间,一个是系统管理表空间,一个是数据库管理表空间。

1、SMS表空间的container是文件系统目录或文件,一般container是自动扩展的,这种情况下你需要扩容文件系统。

查看表空间类型和container

$db2 list tablespaces show detail

$db2 list tablespace containers for <tablespaceid>

2、DMS表空间也有自动扩展类型和使用裸设备的情况(container是文件或裸设备),如果是自动扩展则扩容文件系统。非自动扩展的扩容方式是增加container。

DMS+文件

$db2 connect to <dbname>

$db2 "alter tablespace <tablespaceName> begin new stripe set (file '<filePath>/<fileName>' 655360)"

DMS+裸设备

$db2 connect to <dbname>

$db2 "alter tablespace <tablespaceName> begin new stripe set (device '/dev/rLR_XXXXXX' 671088640)"

语句中使用了begin new stripe set,表示新的数据直接写到新的container上,不进行数据reblance。否则替换为add,表示在container间进行数据reblance(会在后台执行,可用list utilities查看进度)

括号中的数字表示container的page个数(表空间pagesize×这个数字即是container的大小)。

     表分区可扩展表的存储能力、对于大量数据表使用分区字段可提高查询效率。

   create table IXP.ESBTLOG(

     UUID VARCHAR(32),

     UUID_POS VARCHAR(20),

     MSG_ID VARCHAR(100),

     ESB_CODE VARCHAR(20) ,

     CLI_ID CHAR(3),

     CLI_ID_BOCS CHAR(2),

     SERV_ID CHAR(3),

     SERV_TRAN_CODE VARCHAR(20),

     SERV_TCODE VARCHAR(20),

     ESB_RET_CODE VARCHAR(20),

     ERR_MSG VARCHAR(200),

     TRACE_NO VARCHAR(32),

     TRAN_DATE CHAR(8),

     TRAN_TIME CHAR(6),

     TXN_STATUS CHAR(1),

     JOURNAL_NO VARCHAR(32),

     EXT_UUID VARCHAR(32),

     TXN_TOKEN VARCHAR(32),

     NODE_NAME VARCHAR(32),

     TRAN_BEGIN_TIME TIMESTAMP,

     TRAN_END_TIME TIMESTAMP,   

     SP1_BEGIN_TIME TIMESTAMP, 

     SP1_END_TIME TIMESTAMP,

     USER_BOCS VARCHAR(20),  

     WKSTATION VARCHAR(20),   

     RET_TRAN_DATE VARCHAR(20),  

     RET_TRAN_TIME VARCHAR(20),   

     RET_AC_DATE VARCHAR(20),   

     RET_TRACE_NO VARCHAR(20),   

     AP_TRACE_NO VARCHAR(20),   

     BR_NO VARCHAR(20),

     TM_SMP TIMESTAMP default current timestamp

  )PARTITION BY RANGE(TM_SMP)

  (

   PARTITION PARTMAX starting '9999-12-31-00.00.00.000000' INCLUSIVE ending MAXVALUE EXCLUSIVE

  )in USERSPACE1

注意:倒数三行是创建分区表的关键,此例中此TM_SMP为分区字段,第一个分区名为PARTMAX,从'9999-12-31-00.00.00.000000'到无穷大都是它的分区范围。我们还可以在EXCLUSIVE后面继  续定义其它的分区,定义规则与定义PARTMAX分区相同,当然定义每个分区需以逗号分隔。最后一行in USERSPACE1表示分区表创建在USERSPACE1表空间中。我们还能添加,删除表分区。

 db2 "alter table ESBTLOG add partition part20181118 STARTING '2018-11-18-00.00.00.000000' INCLUSIVE ENDING '2018-11-19-00.00.00.000000' EXCLUSIVE"

    其思路是:detach分区到一张临时表(该 *** 作会创建临时表,临时表已存在会报错,detach是分离分区的意思),再将临时表删除。

    db2 "alter table ixp.esbtlog detach partition PART20181118 into table tb_temp"

    db2 "drop table tb_temp"

    A. 查询该表共有多少分区

        db2 "select substr(TABNAME ,1,11) t_name,substr(DATAPARTITIONNAME ,1,12) part_name,DATAPARTITIONID ,substr(LOWVALUE,1,28) low_value,substr(HIGHVALUE,1,28) high_value from syscat.datapartitions where tabname='ESBTLOG' order by datapartitionid"

    B. 显示每个分区有多少数据(没有数据的不会显示) 

        db2 "select substr(tm_smp,1,10) as tran_day,count(*) from esbtlog where 1=1 group by substr(tm_smp,1,10)"

    C. 查询某个分区有多少数据量

        db2 "select count(*) from ixp.esbtlog where substr(tm_smp,1,10)='2019-01-08'"

 1. 请注意上方例子中的名称和分区范围。

2. 要想将一个已存在的表改成分区表,需要先将原表数据保存下来,删除表。再新建分区表,设定好表的分区及其范围,将原数据导入进去。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11832189.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存