数据库分区管理相关命令
确定编目分区
在 DB2 数据库分区环境中, ROLLFORWARD DATABASE 等命令需要在编目分区上执行。我们可以通过 LIST DATABASE DIRECTORY 命令来确定编目分区。
db2 LIST DATABASE DIRECTORY |
分区切换
在 DB2 数据库分区环境中,我们可以通过设置 DB2NODE 环境变量 或使用 set client 命令进行分区间的切换。
export DB2NODE=2 |
增加数据库分区
该命令会自动在 db2nodes.cfg 中增加新定义的分区信息,并在新的数据库分区上创建
TEMPSPACE1 表空间。
我们也可以用如下命令增加数据库分区:
export DB2NODE=4 |
使用该命令时,必须事先修改 db2nodes.cfg 文件包含新定义的分区信息,并在新增加的数据库分区上执行该命令。
删除数据库分区
在删除数据库分区时,只有那些不包含数据的分区才可以被删除。因此,在删除分区时,必须要先执行 DROP PARTITIONNUM VERIFY 命令检查一下该分区是否可以被删除。如果某一个分区正在被使用,要先执行 REDISTRIBUTE DATABASE PARTITION GROUP 命令将该分区上的数据分布到其他分区上。
export DB2NODE=4 |
如果数据库分区 4 上有数据,则执行下述命令:
redistribute database partition group pg123 uniform drop dbpartitionnum (4) |
查看数据库分区组
db2 LIST DATABASE PARTITION GROUPS SHOW DETAIL |
重新分布数据库分区组数据
db2 "REDISTRIBUTE DATABASE PARTITION GROUP pg123 UNIFORM" |
增加数据库分区到数据库分区组中
db2 "ALTER DATABASE PARTITION GROUP pg123 ADD DBPARTITIONNUMS (4) WITHOUT TABLESPACES" |
从数据库分区组中删除数据库分区
db2 drop dbpartitionnum verify |
删除数据库分区组
db2 "DROP DATABASE PARTITION GROUP pg123" |
查看表中的数据在各分区的分布情况
SELECT DBPARTITIONNUM(distribution key), COUNT( * ) |
查看表中的数据在分区图(partition map)中的分布情况
SELECT HASHEDVALUE(distribution key), COUNT( * ) |
DB2 分区数据库相关实用程序
db2_all 命令
在 DB2 分区环境下,很多操作都需要在各个分区上分别执行,如果每次都要到各个分区上单独执行,对用户来说非常繁琐。在 DB2 中,可以使用 db2_all 命令,它可以在指定的所有数据库分区服务器上运行该命令。
db2_all "db2 UPDATE DB CFG FOR TESTDB USING LOGRETAIN ON" |
rah 命令
它指定在所有计算机上运行该命令。
如果想为多台物理机器创建一个目录,那么可以发出下面的命令
rah ")mkdir /tmp/$USER“ |
数据库备份
要备份分区数据库,您必须要首先在编目分区上调用备份实用程序,然后在其他数据库分区上调用备份实用程序。
db2_all "<<+0< db2 BACKUP DB testdb to /home/db2inst1/BACKUPS" |
其中,“+0”表示只在 0 号分区上执行,“-0”表示在除了 0 号分区之外的所有分区上执行。
在版本 9.5 之前,您必须一次一个数据库分区地备份分区数据库。一次一个数据库分区地备份多个数据库分区可能会出错并且费时。如果一次一个数据库分区地备份分区数据库,那么您无法在备份映像中包括复原和恢复所需要的日志文件。在版本 9.5 中,您可以通过在 b 编目数据库分区上执行单一系统视图(SSV)备份同时备份多个数据库分区。您从编目数据库分区执行备份操作时,可以使用 ON DBPARTITIONNUMS 选项来指定要在备份中包含哪些分区。它将同时备份指定的分区,并且与指定的分区相关联的备份时间戳记将相同。此外,您还可以在 SSV 备份中包含数据库日志。
db2 BACKUP DATABASE testdb ON DBPARTITIONNUMS (1, 2) \ |
监控数据库备份命令执行情况
export DB2NODE=0 |
数据库恢复
要恢复分区数据库,您必须要首先在编目分区上调用恢复实用程序,然后在其他数据库分区上调用恢复实用程序。
db2_all "<<+0< db2 RESTORE DATABASE testdb \ |
前滚恢复(ROLLFORWARD DATABASE)
在分区数据库中,ROLLFORWARD DATABASE 命令只能在编目分区上运行。如果需要前滚恢复数据库或表空间到某一时间点(point in time ),则该命令会涉及到db2nodes.cfg 文件中定义的所有数据库分区上的数据。如果需要根据整个事务日志(to the end of logs)来前滚恢复数据库或表空间, 则该命令会涉及到所有指定的数据库分区上的数据。如果没有指定数据库分区,该命令会涉及到db2nodes.cfg 文件中定义的所有数据库分区上的数据。如果某一分区不需要执行前滚恢复,则该分区会被忽略掉。
当数据库处于一致状态时(当数据库目录中列示的对象与磁盘中实际存在的对象匹配时),最小恢复时间是前滚期间的最早时间点。手动确定要将数据库前滚至的正确时间点比较困难,尤其是对于分区数据库更是如此。在版本 9.5 中,通过在 ROLLFORWARD DATABASE 命令中使用 TO END OF BACKUP 参数,可以将数据库前滚至由数据库管理器确定的最小恢复时间。
前滚恢复分区 0 及分区 2 上的表空间TBS1:
db2 rollforward db testdb to end of logs on dbpartitionnums (0, 2) tablespace(TBS1) |
前滚恢复分区 6 上的 6 个小表:
db2 rollforward database testdb to end of logs on dbpartitionnum (6) \ |
前滚至由数据库管理器确定的最小恢复时间:
db2 rollforward db testdb to end of backup and complete |
EXPORT 命令
export 用于将表中的数据卸载到文件中。
db2 "EXPORT TO lineitem.del OF DEL SELECT * FROM db2inst1.lineitem" |
在分区数据库环境下,import 或 LOAD 命令不支持 IFX 文件格式。
IMPORT 命令
用于将外部文件中的数据插入到表中。
db2 "IMPORT FROM lineitem.tbl OF DEL MODIFIED BY COLDEL| \ |
LOAD 命令
在多分区数据库环境中,大量的数据放在多个数据库分区中。分区键用来确定每部分数据所在的数据库分区。必须先分布数据,然后才能将该数据装入到正确的数据库分区中。
在多分区数据库中装入表时,load 实用程序可以:
并行地分布输入数据
同时在各个相应数据库分区中装入数据
将数据装入到多分区数据库中分两阶段完成:第一阶段为设置阶段,在此阶段获取数据库分区资源(如表锁定);第二阶段为装入阶段,在此阶段将数据装入到数据库分区中。在将数据装入多分区数据库时,可以使用下列其中一种方式:
PARTITION_AND_LOAD
对数据进行分布(有可能以并行方式进行分布),并且同时在各个相应数据库分区上装入数据。
PARTITION_ONLY
对数据进行分布(有可能以并行方式进行分布),并将输出写入每个装入数据库分区上指定位置中的文件。每个文件都包含分区头,该分区头指定数据在数据库分区上的分布方式,并指定可以使用 LOAD_ONLY 方式将该文件装入到数据库中。
LOAD_ONLY
假定数据已分布在数据库分区上;将跳过分布过程,并且在相应的数据库分区上同时装入数据。
ANALYZE
生成最佳分布图(在所有数据库分区之间均匀地分布数据)。
下边是 LOAD 命令的一些示例:
要将 load.del 中的数据装入到所有定义了 TABLE1 的数据库分区中,请发出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 |
要在数据分布在数据库分区 3 和数据库分区 4 上的位置执行装入操作,请发出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 PARTITIONED DB \ |
在使用数据库分区 3 和数据库分区 4 的情况下,要将 load.del 分布(而不装入)到所有定义 TABLE1 的数据库分区中,请发出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 PARTITIONED DB |
如果已经以 PARTITION_ONLY 方式执行了装入操作,并且要将每个装入数据库分区的 /db2/data 目录中的分区文件装入到所有定义了 TABLE1 的数据库分区中,请发出以下命令:
LOAD FROM LOAD.DEL OF DEL REPLACE INTO TABLE1 PARTITIONED |
要仅装入到数据库分区 4 中,请发出以下命令:
LOAD FROM LOAD.DEL OF DEL REPLACE INTO TABLE1 PARTITIONED |
REORG 命令
在分区数据库中,同样使用DB2 REORG 命令重组表及索引。
db2 "REORG INDEXES ALL FOR TABLE lineitem ALLOW WRITE ACCESS" |
RUNSTATS 命令
在分区数据库中,同样使用RUNSTATS命令收集统计信息。
db2 "RUNSTATS ON TABLE db2inst1.lineitem WITH DISTRIBUTION AND \ |
在分区数据库中,RUNSTATS 命令运行时所在分区的统计信息才会被收集,再对这些统计信息加以推断(前提是行在各分区上是均匀分布的)以反映整个数据库。这意味着,SYSCAT.TABLES 中的 CARD 列可能不包含该表中确切的行数。我们要尽量让数据均匀地分布在各分区上。
结论
本文以 Balanced Warehouse E7100 为例,为大家介绍了数据库分区设计、实现及管理的基本方法。希望大家能够对 DB2 数据库分区技术及使用有一个比较全面的了解。另外,关于数据库分区监控及性能调优等方面内容,大家可以参考 DB2 信息中心相关内容。
db2start DBPARTITIONNUM 4 ADD DBPARTITIONNUM HOSTNAME Clyde PORT 4 |