db2haodb
作者db2haodb·2016-09-27 00:24
数据库开发工程师·IGI

DPF单server多个逻辑分区测试

字数 18974阅读 1398评论 0赞 1

DPF一直在项目中使用,这次参考一些资料做了一些操作。

1.

server中保留一个实例,一个DB(情况1) , 或者创建一个db(情况2):

db2 create database dpfdb

 

2.

db2set DB2FCMCOMM=TCPIP4

3.

创建其他3个逻辑分区1/2/3

db2start DBPARTITIONNUM 1 add DBPARTITIONNUM hostnamedb2awse port 1

db2start DBPARTITIONNUM 2 add DBPARTITIONNUM hostnamedb2awse port 2

db2start DBPARTITIONNUM 3 add DBPARTITIONNUM hostnamedb2awse port 3

db2stop

db2start

(执行过上面命令之后,db2nodes.cfg中会自动添加node的信息,也可以直接修改db2nodes.cfg文件然后重启实例)

4.切换实例到1、2、3上,发现他们db处于BACKUPPENDING state(仅限情况1才会出现)

db2inst1@db2awse:~> export DB2NODE=1

db2inst1@db2awse:~> db2 terminate

db2inst1@db2awse:~> db2 connect to sam_tst

SQL1116N  A connectionto or activation of database "SAM_TST" failed because

the database is in BACKUP PENDING state.  SQLSTATE=57019

在1、2、3node上对db执行backup:

db2inst1@db2awse:~>  db2 backup db sam_tst to  /dev/null

 

5. 重启实例:db2stop/ db2start

发现重启的时候非常慢,超过十分钟,查看诊断日志:

Warning:waiting for the FCM shared memory set to be created seems to be taking longerthan expected. Will continue to wait for another minute. Check to ensure that yourconfiguration will in fact create an FCM shared memory segment.

 这是因为在DPF中FCM的共享内存是由DBM的共享内存所分配的,虚拟机内存只有2G,导致了而dbm自动分配的的内存太小,进而导致了FCM的内存太小。

Global instance memory (4KB)          (INSTANCE_MEMORY) = AUTOMATIC(97732)

db2set DB2_FCM_SETTINGS=FCM_MAXIMIZE_SET_SIZE:NO这样就可以预分配和FCM最大可设置内存一样大的4G的内存给FCM(或者调整虚拟机的内存)。Kill掉一直启动不起来的实例,再次启动很快就起来了,问题解决。

 

 

 

6. 创建数据库分区组:

db2 "create database partition group dbgroup1 onDBPARTITIONNUMS(0,1)"

db2 “create database  partitiongroup dbgroup2 on DBPARTITIONNUMS (0,1,2,3)”

notes:

因为虚拟机内存设置太小只有2G,导致了报SQL1224N  错,调整为4G就没事了。

 

等效于:

db2 "create database partition groupdbgroup1 on DBPARTITIONNUMS (0 to 1)"

 db2"createdatabase partition group dbgroup2 on DBPARTITIONNUMS (0 to 3)"

 

查询分区组:

db2 list db partition groups [show detail]

7. 在分区组上创建表空间

db2 "create tablespace tbsp1 in database partitiongroup dbgroup1  managed by automaticstorage"

db2 "create tablespace tbsp2 in database partitiongroup dbgroup2  managed by automaticstorage"

 

8.分别在两个表空间中创建DPF表:

create table table_a

 (

 id int,

 name char(10)

 )DISTRIBUTE BYHASH(id) in tbsp1 ;

 create table table_b

 (

 id int,

 name char(10)

 )DISTRIBUTE BYHASH(id) in tbsp2;

 

9.利用shell脚本插入测试数据:

插入测试数据

 db2connect to dpfdb

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(3,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(4,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(5,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(6,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(7,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(8,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(9,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(10,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_a values(1,'$num') "

        num=$(($num+1))

 done

 num=1

 while [ $num -le 1000 ]

 do

        db2 "insert into table_avalues (2,'$num') "

        num=$(($num+1))

 done

 

10. 查看 table_a 数据分

 

db2 "select distinct id,dbpartitionnum(id) dbpartitionnum,hashedvalue(id) hashedvalue from table_a " 

 

db2"select distinct id,dbpartitionnum(id) dbpartitionnum,hashedvalue(id)hashedvalue from table_a "

ID          DBPARTITIONNUM HASHEDVALUE

------------------------- -----------

         10              0       19732

          7              0       24650

          5              0       25322

          6              1        4541

          8              1       16343

          4              1       17383

          9              1       20201

          1              1       22135

          3              1       25831

          2              1       25879

 

  10 record(s) selected.

 

11.扩展分区,将分区组dbgroup1 数据分区扩展至(0 到 3)db2inst1@db2awse:~/backup_restore/test> db2 "ALTER DATABASEPARTITION GROUP dbgroup1 add DBPARTITIONNUMS  (2 to 3) like DBPARTITIONNUM 0"SQL1759W  Redistribute databasepartition group is required to change database partitioning for objects in database partition group "DBGROUP1"to include some added database partitions or exclude some dropped databasepartitions.  SQLSTATE=01618 12.分发数据,在0节点上执行db2 "REDISTRIBUTE DATABASE PARTITION GROUP dbgroup1 NOT  ROLLFORWARD RECOVERABLEUNIFORM"notes: 加了NOTROLLFORWARD RECOVERABLE选项之后,在数据分发期间,表所在的表空间会被置于backup  pending状态,直到数据分发结束。13. 再次查看结果:

db2"select distinct id,dbpartitionnum(id) dbpartitionnum,hashedvalue(id)hashedvalue from table_a "

 

ID          DBPARTITIONNUM HASHEDVALUE

------------------------- -----------

         10              0       19732

          7              3       24650

          5              3       25322

          8              1       16343

          9              1       20201

          6              2        4541

          4              2      17383

          1              2       22135

          3              2       25831

          2              2       25879

 

  10 record(s) selected.

 

db2"select dbpartitionnum(id), count(*) from table_a  group by dbpartitionnum(id)"

 

1           2         

----------------------

          1        2000

          0        1000

          3        2000

          2        5000

 

  4 record(s) selected

 

从上面结果可以看到,数据已经分布到节点0 到节点3 上了。但是细心的朋友可能会发现,由于我们的测试数据是每个id 的数据量都为1000 条,也就是说db2 按照hash 分布的数据在各个节点上并不平均,上面这个示例中,2号节点的数据明显多于其他几个节点。对于有些情况,良好的数据分布可能对于性能有至关重要的影响。让我们接下来讨论如何将数据插入到指定节点及重新分配现 有数据的情况。

 

 

二、添加数据指定到指定节点

添加数据到指定节点分为两种情况:

1. 将文件中的数据添加到指定节点

2. 将表中的数据更改到其他节点

测试第1种方法:将文件中的数据添加到指定节点

2.1 导出数据

由于table_a,table_b 表结构一样,故将 table_a 的数据导出,作为 table_b 的导入数据文件。

导入数据

 export to table_c.del of del select * from table_a
 
2.1.1.导入数据到指定节点

生成分发到 (1,3) 节点的数据文件

生成分发文件

db2 "LOAD FROM table_c.del OF DEL REPLACE INTO table_b PARTITIONED DB CONFIG MODE PARTITION_ONLY PART_FILE_LOCATION ./ OUTPUT_DBPARTNUMS (1,3)"

执行上面命令后,实际没有导入任何数据,但是会生成一些数据文件table_c.del.00x。

这时候我们可以看到生成的文件中,第一行为节点号,接下来是hash map,最后才是实际的数据。

下面将刚才生成的数据文件装入到table_b 表中:

db2"LOAD FROM table_c.del OF DEL REPLACE INTO table_b PARTITIONED DB CONFIGMODE LOAD_ONLY  PART_FILE_LOCATION . / OUTPUT_DBPARTNUMS(1)  "

db2"LOAD FROM table_c.del OF DEL REPLACE INTO table_b PARTITIONED DB CONFIGMODE LOAD_ONLY  PART_FILE_LOCATION . / OUTPUT_DBPARTNUMS(3)  "

 

 
2.2. 将表中的数据更改到其他节点

如果想table_b 中的数据更改到其他节点上,则需要更改系统中生成的pmap。

步骤如下:

下面仅仅更改id 为 6 的数据作为示例。

2.2.1. 查看pmap

查看、更改pmap 需要用到db2gpmap 工具,语法如下:

db2gpmap 语法

 >>-db2gpmap--+------------------------+-------------------------> 
             '- -d--+---------------+-'   
                    '-database-name-'     
 
 >--+------------------------+-----------------------------------> 
   '- -m--+---------------+-'   
          '-map-file-name-'     
 
 >--+----------------------------------------+-------------------> 
   '- -g--+-------------------------------+-'   
          '-database-partition-group-name-'     
 
 >--+-----------------+--+-----+---------------------------------> 
   '- -t--table-name-'  '- -h-'

直接查看table_b 对应的pmap:

查看pmap

 capa1:/DPFDBA/usr >db2gpmap -d dpfdb -m dbgroup2.map -t table_b 
 Connect to dpfdb. 
 Successfully connected to database. 
 Retrieving the partition map ID using table TABLE_B. 
 The partition map has been sent to dbgroup2.map. 
 
> more dbgroup2.map
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
 
 
其中 0123 代表着 table_b 中各个的 hash 值对应的分区组。
 
>  db2 "select distinct id,dbpartitionnum(id),hashedvalue(id) from table_b " 
 
ID          2           3          
----------- ----------- -----------
          6           1        4541
          9           1       20201
          8           3       16343
          4           3       17383
          1           3       22135
          3           3       25831
          2           3       25879
 
  7 record(s) selected.

可以看到6对应的hash值为4541(说明id为6的值在第1个分区上,对应的hash值为4541,),打开dbgroup2.map文件将第4541个值改为2(151行第11个),将其放到第2个分区。

重新分布数据:

db2 "REDISTRIBUTE DATABASE PARTITION GROUP dbgroup2USING  TARGETMAP dbgroup2.maptable(table_b) only"

 

 

三、对于重新分布数据的监控

重新分布数据时可进行实时监控,也可以在完成后查看重新分发事件日志检验是否成功执行。

3.1 实时监控

重新分发数据可以用以下方式进行实时监控。

#db2pd – uti

#db2 list utilities show detail

3.2 重新分发事件日志文件

在数据重新分发期间将执行事件日志记录。事件信息将记录至事件日志文件,以便日后用于执行错误恢复。 事件日志文件名的格式如下:database-name.database-partition-group-name.timestamp.log。日志文件的位置如下: 在基于 Linux 和 UNIX 的系统上为 homeinst/sqllib/redist 目录。 在 Windows 操作系统上为 DB2INSTPROFinstanceredist目录,其中DB2INSTPROF 是DB2INSTPROF 注册表变量的值。 以下是事件日志文件名的示例: DB819.NG1.2007062419415651.log 此事件日志文件用于数据库上的重新分发操作,该数据库名称为DB819,数据库分区组名称为NG1(创建于当地时间2007 年 6月 24 日下午 7:41)。 事件日志文件的三个主要用途为如下所示:

提供有关重新分发操作的一般信息,例如,旧的分发映射和新的分发映射。

为用户提供一些信息,以帮助他们对迄今为止实用程序已经重新分发了哪些表保持跟踪。

提供有关已经重新分发的每个表的信息,这些信息包括:用于该表的建立索引方式、指示是否已成功重新分发该表以及对该表执行重新分发操作的开始时间和结束时间。

3.3 从与数据重新分发相关的错误中恢复

从数据重新分发期间发生的故障和错误进行恢复通常要求您查看重新分发事件日志文件(它们包含有关问题可能原因的有用信息),然后重新发出该命令。通常,在使用其他重新分发接口时不能进行恢复。 如果分发数据发生错误,可以用下面语句进行终止分发。

REDISTRIBUTE DATABASE PARTITION GROUP DBGROUP ABORT

继续分发, 需要执行以下命令:

REDISTRIBUTE DATABASE PARTITION GROUP DBGROUP CONTINUE

总结

DPF 环境下对数据分发进行详细的规划及管理,可以避免一部分性能问题,以保证系统正常稳定运行。

From: http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1304hongye/

 

备份恢复

===========================备份:

方法一:加关键字on all dbpartitionnums

db2"backup db dpfdb on all dbpartitionnums  to . compress without prompting"

方法二:用db2_all对各节点备份:

(1)先对协调节点(0节点):

db2_all"<<+0< db2 backup db dpfdb to /home/db2inst1/backup_restore/test  compress without prompting"

(2)然后对其他节点备份:

db2_all "|<<-0<db2 backup db dpfdb to /home/db2inst1/backup_restore/db2backup/bkup_rstore_test  compress without prompting"

方法三:在每个节点都做备份(不推荐,麻烦)

db2 "backup db dpfdb  to . compress without prompting"

 

 

===================================恢复:

方法一:在各个节点都恢复,但是必须先做编目节点(一般是0节点)

db2 query client, 确保是-1,即catalog节点

db2  “restore db dpfdb from  /home/db2inst1/backup_restore/test taken at20160926080018 WITHOUT ROLLING FORWARD"

在做其他节点,各个节点都要做:

export DB2NODE=1

db2  terminate

db2  “restore db dpfdb from  /home/db2inst1/backup_restore/test taken at20160926080018 WITHOUT ROLLING FORWARD"

export DB2NODE=2

……………………..

 

方法二:用db2_all

(1)先恢复catalog节点

这样做直接被打断而报错:

db2inst1@db2awse:~/backup_restore/test> db2_all "<<+0<db2restore db dpfdb from  /home/db2inst1/backup_restore/testtaken at 20160926080018 WITHOUT ROLLING FORWARD"

 

SQL2539W  The specified name ofthe backup image to restore is the same as the

name of the target database. Restoring to an existing database that is the

same as the backup image database will cause the current database to be

overwritten by the backup version.

Do you want to continue ? (y/n) SQL2001N  The utility was interrupted.  The output data may be incomplete.

db2awse: db2 restore db dpfdb ... completed rc=4

这是因为db2_all不支持交互,所以一定要加上without prompting,如果改名字需要带into的需要加上REPLACE EXISTING。

正确的做法是:

db2_all "<<+0< db2 restore db dpfdb from /home/db2inst1/backup_restore/test taken at 20160922141409 into dpfdb REPLACEEXISTING WITHOUT ROLLING  FORWARD withoutprompting"

(2)恢复除了catalog节点之外的其他节点:

db2_all "<<-0< db2 restore db dpfdb from . taken at20160922141409 into dpfdb REPLACE EXISTING WITHOUT ROLLING  FORWARD without prompting"

tips:

1)对于以上恢复的方法一和方法二都可以使用与备份的方法一和方法二配合使用,推荐使用:备份的方法一和恢复的方法二,因为操作简单不易出错。

2)因为db2_all不支持交互,所以恢复的时候一定要加上without prompting,如果改名字需要带into的需要加上REPLACE EXISTING。如果忘记加without prompting可能恢复会被异常打断报错而处于inconsistent状态,需要重启所有节点db:

db2_all "db2 restart database dpfdb"

 

 

 

 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

  • db2trc用法
    评论 0 · 赞 0
  • DB2 9.7单物理节点配置4逻辑节点的DPF
    评论 0 · 赞 1
  • DPF双server搭建测试
    评论 0 · 赞 0
  • 配置NFS
    评论 0 · 赞 0
  • db2dart
    评论 0 · 赞 0
  • 相关文章

    相关问题

    相关资料

    X社区推广