DB2数据库中,复制已经存在的表的结构及其数据。我们采用两步走方式:第一步先复制表结构,第二部拷贝数据。
第一步:复制表结构
方法一:
Create table test_Rate as (select * from t_Rate) Definition only;
--test_Rate是新表,t_Rate是老表
方法二:
Create table test_Rate like t_Rate;
--test_Rate 是新表,t_Rate是老表
说明:上述方式创建的新表不复制老表的主键,约束,索引,非空,默认值,数据。且创建的新表放在用户的临时表空间中。
有时候需改变数据库的表结构,但执行了alter语句后,现有的表结构还是没发生变化。
所以一般在修改表结构的后面需加上重构表结构语句。
如:db2 "REORG TABLE SCHEMA.TABLENAME";
--索引生效
CALL sysproc.admin_cmd ('runstats on table TABLE_xxxxxxxx on all columns and indexes all allow read access');
--重构表
CALL SYSPROC.ADMIN_CMD('REORG TABLE TABLE_xxxxxxxx');
/*----查询新表test_Rate的主键,表空间----*/
select keycolumns,keyindexid,tbspace from syscat.tables where tabname='TEST_RATE'
--keycolumns:表示有几个字段组成联合主键,keyindexid:等于0表示没有主键
/*----查询新表test_Rate的索引----*/
select * from syscat.indexes where tabname='TEST_RATE';
--上述查询有记录表示表有索引,反之没有
/*----查询新表test_Rate的记录条数----*/
select count(1) from test_Rate
第二步:插入数据
insert into test_Rate select * from t_Rate where '条件';
通过以上操作,会拷贝t_Rate的表结构及数据至test_Rate表上。
比对新建表与原表是否一致
###查询表索引(表明大写)
select * from syscat.indexes where tabname='TABLENAME'
###查看主键
describe indexes for table tablename
5、导出原数据
time db2 "export to tablename.del of del select * from tablename1"
导入数据(每次提交10000)
time db2"import from tablename.del of del commitcount 10000 insert into tablename"
REORGを実行
実行コマンドは簡単
db2 reorg table ${テーブル名}
並べ替え基準をインデックスにしたい場合。
db2 reorg table ${テーブル名} index ${インデックス名}
インデックスを再編成したい場合
db2 reorg indexes all for table ${テーブル名}
データベースに定義されている表の一覧を取得する
タイプ列の記号の主なものは、以下のとおり。
T:表
A:別名(ALIAS)
V:ビュー
S:マテリアライズ照会表(MQT)
$ db2 list tables
表/ビュー スキーマ タイプ 作成時刻
------------------------------- --------------- ----- --------------------------
ACT DB2I115 T 2021-06-28-19.54.17.007059
ADEFUSR DB2I115 S 2021-06-28-19.54.18.872658
CATALOG DB2I115 T 2021-06-28-19.54.33.845894
CL_SCHED DB2I115 T 2021-06-28-19.54.14.648341
CUSTOMER DB2I115 T 2021-06-28-19.54.21.277008
DEPARTMENT DB2I115 T 2021-06-28-19.54.14.813984
DEPT DB2I115 A 2021-06-28-19.54.15.077674
EMP DB2I115 A 2021-06-28-19.54.15.327167
EMPACT DB2I115 A 2021-06-28-19.54.17.005861
EMPLOYEE DB2I115 T 2021-06-28-19.54.15.078994
EMPMDC DB2I115 T 2021-06-28-19.54.19.157375
EMPPROJACT DB2I115 T 2021-06-28-19.54.16.851764
EMP_ACT DB2I115 A 2021-06-28-19.54.17.006552
:
以下略
特定のスキーマ名の表の一覧を取得する
以下の例は、SYSCATスキーマのもの、つまりシステムカタログビューをリストしている。
$ db2 list tables for schema syscat
表/ビュー スキーマ タイプ 作成時刻
------------------------------- --------------- ----- --------------------------
ATTRIBUTES SYSCAT V 2021-06-28-19.52.59.697655
AUDITPOLICIES SYSCAT V 2021-06-28-19.52.59.730695
AUDITUSE SYSCAT V 2021-06-28-19.52.59.746300
BUFFERPOOLDBPARTITIONS SYSCAT V 2021-06-28-19.52.59.767614
BUFFERPOOLEXCEPTIONS SYSCAT V 2021-06-28-19.52.59.778816
BUFFERPOOLNODES SYSCAT V 2021-06-28-19.52.59.788100
BUFFERPOOLS SYSCAT V 2021-06-28-19.52.59.796748
CASTFUNCTIONS SYSCAT V 2021-06-28-19.52.59.809168
CHECKS SYSCAT V 2021-06-28-19.52.59.823562
COLAUTH SYSCAT V 2021-06-28-19.52.59.834614
COLCHECKS SYSCAT V 2021-06-28-19.52.59.846397
COLDIST SYSCAT V 2021-06-28-19.52.59.861894
:
以下略
ある表の列定義情報を表示する
スキーマ名を省略した場合は、ユーザー名がデフォルトのスキーマ名となる。
$ db2 describe table db2i115.employee
データ・タイ データ・ 列の スケ
列名 プ・スキーマ タイプ名 長さ ール NULL
--------------------------- --------- ------------------- ---------- ----- ------
EMPNO SYSIBM CHARACTER 6 0 いいえ
FIRSTNME SYSIBM VARCHAR 12 0 いいえ
MIDINIT SYSIBM CHARACTER 1 0 はい
LASTNAME SYSIBM VARCHAR 15 0 いいえ
WORKDEPT SYSIBM CHARACTER 3 0 はい
PHONENO SYSIBM CHARACTER 4 0 はい
HIREDATE SYSIBM DATE 4 0 はい
JOB SYSIBM CHARACTER 8 0 はい
EDLEVEL SYSIBM SMALLINT 2 0 いいえ
SEX SYSIBM CHARACTER 1 0 はい
BIRTHDATE SYSIBM DATE 4 0 はい
SALARY SYSIBM DECIMAL 9 2 はい
BONUS SYSIBM DECIMAL 9 2 はい
COMM SYSIBM DECIMAL 9 2 はい
14 レコードが選択されました。
ある表に定義された索引の情報を取得する
$ db2 describe indexes for table employee
索引 索引 ユニーク 索引 索引 パーティ NULL
スキーマ 名 規則 列数 タイプ ョニング キー
------------- -------------- ---------- --------- ---------------- -------------- ------
DB2I115 PK_EMPLOYEE P 1 RELATIONAL DATA - Y
DB2I115 XEMP2 D 1 RELATIONAL DATA - Y
2 レコードが選択されました。
describe indexes for table 表名 show detail のように show detail オプションをつけると、索引の定義された列名などの情報も表示される。
以上、マニュアルを見れば書いてあることだが、簡単なことは意外と見つけにくいので、まとめておいた。
Step2. スキーマコピー
db2moveコマンドを実行します。
db2move <移行元DB名> COPY -sn <コピー対象スキーマ名>
-co TARGET_DB <ターゲットDB名> user <ターゲットDB接続ユーザ> using <パスワード>
owner <オブジェクト所有者名>
-u <ソースDB接続ユーザ> -p <パスワード>
C:\IBM\Db2_11.5.7\BIN>db2move TESTDB COPY -sn MOVTEST -co TARGET_DB MYDB user db2admin using xxxxxx owner movtest -u db2inst1 -p xxxxxx
Application code page not determined, using ANSI codepage 943
***** DB2MOVE *****
Action: COPY
Start time: Fri Feb 24 20:22:22 2023
All schema names matching: MOVTEST;
Connecting to database TESTDB ... successful! Server : DB2 Common Server V11.5.6
Copy schema MOVTEST to MOVTEST on the target database MYDB
Create DMT : "SYSTOOLS"."DMT_641ad043d5fa1"
Binding package automatically ... C:\IBM\Db2_11.5.7\BND\DB2MOVE.BND ... successful!
Start Load Phase :
db2move finished successfully
Files generated:
-----------------
COPYSCHEMA.20230224202222.msg
LOADTABLE.20230224202222.MSG
Please delete these files when they are no longer needed.
End time: Fri Feb 24 20:22:31 2023
C:\IBM\Db2_11.5.7\BIN>
"db2move finished successfully"と出力され、スキーマコピーが成功していることがわかります。
問題が起きた場合はエラー有と出力され、拡張子".ERR" ファイルも生成されます。
これで移行作業完了です!
Step3. 移行オブジェクト / データ確認
表
想定通りコピーされ、Valid(STATUS N=正常)状態となっています。
db2 "select tabschema, tabname, owner, type, status from syscat.tables where tabschema='MOVTEST' and type='T'"
step4索引
索引も移行されています
db2 "select indschema, indname, owner, tabschema, tabname from syscat.indexes where indschema='MOVTEST'"
シーケンス
シーケンスもターゲットDBに移行されています。
また、次に払い出される順序値も、カタログへの照会で確認することができます。
db2 "select seqschema, seqname, owner, nextcachefirstvalue from syscat.sequences where seqschema='MOVTEST'"