DB2重建分区表推荐步骤

目标:
假设有如下大分区表 A ,该表因为某些原因变得只读?如果用最快的方式重建?

db2inst1@NODE01:~> db2look -d sample -a -e -t a
 
CREATE TABLE "DB2INST1  "."A"  (
                  "ID" INTEGER , 
                  "NAME" CHAR(10 OCTETS) )   
                 PARTITION BY RANGE("ID") 
                 (PART "PART0" STARTING(0) ENDING(9) IN "TBS_DATA1" INDEX IN "TBS_IDX1", 
                 PART "PART1" STARTING(10) ENDING(19) IN "TBS_DATA1" INDEX IN "TBS_IDX1", 
                 PART "PART2" STARTING(20) ENDING(29) IN "TBS_DATA1" INDEX IN "TBS_IDX1") 
                 ORGANIZE BY ROW; 

CREATE INDEX "DB2INST1  "."IDX_ID" ON "DB2INST1  "."A" ;
CREATE INDEX "DB2INST1  "."IDX_NAME" ON "DB2INST1  "."A";


以下是整理的步骤:

1. 导出A的定义
db2inst1@NODE01:~> db2look -d sample -a -e -t a > db2look_a.sql
-- Generate statistics for all creators 
-- The db2look utility will consider only the specified tables 
-- Creating DDL for table(s)


2. 将A重命名为 A_BAK
db2inst1@NODE01:~> db2 rename a to a_bak
DB20000I  The SQL command completed successfully.

3. 重建表A
修改db2look_a.sql,主要将改一下索引的名子,不能和原来的一样,修改过程略。
另外注意一点,如果原来的定义中没有指定每个分区的IN和INDEX IN,那么要指定上。

db2inst1@NODE01:~> db2 -tvf db2look_a.sql
CONNECT TO SAMPLE

   Database Connection Information

 Database server        = DB2/LINUXX8664 10.5.10
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLE


CREATE TABLE "DB2INST1  "."A"  ( "ID" INTEGER , "NAME" CHAR(10 OCTETS) ) PARTITION BY RANGE("ID") (PART "PART0" STARTING(0) ENDING(9) IN "TBS_DATA1" INDEX IN "TBS_IDX1", PART "PART1" STARTING(10) ENDING(19) IN "TBS_DATA1" INDEX IN "TBS_IDX1", PART "PART2" STARTING(20) ENDING(29) IN "TBS_DATA1" INDEX IN "TBS_IDX1") ORGANIZE BY ROW
DB20000I  The SQL command completed successfully.

SET SYSIBM.NLS_STRING_UNITS = 'SYSTEM'
DB20000I  The SQL command completed successfully.

CREATE INDEX "DB2INST1  "."IDX_ID_NEW" ON "DB2INST1  "."A" ("ID" ASC) PARTITIONED COMPRESS NO INCLUDE NULL KEYS ALLOW REVERSE SCANS
DB20000I  The SQL command completed successfully.

SET SYSIBM.NLS_STRING_UNITS = 'SYSTEM'
DB20000I  The SQL command completed successfully.

CREATE INDEX "DB2INST1  "."IDX_NAME_NEW" ON "DB2INST1  "."A" ("NAME" ASC) PARTITIONED COMPRESS NO INCLUDE NULL KEYS ALLOW REVERSE SCANS
DB20000I  The SQL command completed successfully.

COMMIT WORK
DB20000I  The SQL command completed successfully.

CONNECT RESET
DB20000I  The SQL command completed successfully.

TERMINATE
DB20000I  The TERMINATE command completed successfully.

4. 将表A拆分成子表

db2inst1@NODE01:~> db2 "alter table A DETACH PARTITION PART0 INTO TABLE A_PART0"
DB20000I  The SQL command completed successfully.
db2inst1@NODE01:~> db2 "alter table A DETACH PARTITION PART1 INTO TABLE A_PART1"
DB20000I  The SQL command completed successfully.
db2inst1@NODE01:~> db2 "alter table A DETACH PARTITION PART2 INTO TABLE A_PART2"
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL20251N  The last data partition cannot be detached from the table 
"DB2INST1.A".  SQLSTATE=428G2

最后一个分区不能拆,拆完之后可以看一下子表的定义:
db2inst1@NODE01:~> db2look -d sample -a -e -t A_PART0
db2inst1@NODE01:~> db2look -d sample -a -e -t A_PART1
db2inst1@NODE01:~> db2look -d sample -a -e -t A

5. 子表并发导入

可以写多个脚本,同时放到后台运行,命令如下:

db2inst1@NODE01:~> db2 "declare c0 cursor for select * from A_BAK where id >=0 and id <= 9"
db2inst1@NODE01:~> db2 "load from c0 of cursor messages 0.out insert into A_PART0 nonrecoverable"

db2inst1@NODE01:~> db2 "declare c1 cursor for select * from A_BAK where id >=10 and id <= 19"
db2inst1@NODE01:~> db2 "load from c1 of cursor messages 1.out insert into A_PART1 nonrecoverable"

db2inst1@NODE01:~> db2 "declare c2 cursor for select * from A_BAK where id >=20"
db2inst1@NODE01:~> db2 "load from c2 of cursor messages 2.out insert into A nonrecoverable"


6. 带数据的子表合并到A中

等上述子表导入完成后

db2inst1@NODE01:~> db2 "alter table A ATTACH PARTITION PART0 STARTING(0) ENDING(9) FROM A_PART0 REQUIRE MATCHING INDEXES "
SQL3601W  The statement caused one or more tables to automatically be placed 
in the Set Integrity Pending state.  SQLSTATE=01586
db2inst1@NODE01:~> db2 "alter table A ATTACH PARTITION PART1 STARTING(10) ENDING(19) FROM A_PART1 REQUIRE MATCHING INDEXES "
DB20000I  The SQL command completed successfully.

7. Set integrity
db2inst1@NODE01:~> db2 "set integrity for A all immediate unchecked"
DB20000I  The SQL command completed successfully.

至此,完结

8. runstats操作
建议放后台
db2inst1@NODE01:~> db2 "runstats on table A ON ALL COLUMNS AND SAMPLED DETAILED INDEXES ALL "

猜你喜欢

转载自blog.csdn.net/qingsong3333/article/details/101473745