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 "

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章