DB2 Universal Database™(DB2 UDB) 有一對非常有用的工具,可以幫助您實現這種跨平台的備份與恢複功能。db2move 工具利用了 DB2 的數據移動工具(export 和 import 或load)來移動數據庫表。然而,由于數據庫的內容遠遠不止于用戶表,因此您需要使用其他方法在不同的數據庫之間遷移其他數據庫對象,例如約束、觸發器、索引、序列、表空間、緩沖池等。這就是db2look工具出現的原因。使用這個工具,您可以在源數據庫中捕獲到定義這些對象使用的數據定義語言(DDL),並在目標數據庫中使用這些數據定義語言重新創建這些對象。
1、環境說明:
遷移的DB2 數據庫的名字叫 sample , SCHEMA也是oatest ,用戶名是 oatest
2、導出步驟:
(1) 建立新目錄,如果是在 linux 下要注意目錄的權限問題,目錄應該可以被 db2inst1 用戶寫訪問
[db2inst1@devsvr2 db2inst1]$ pwd
/home/db2inst1
[db2inst1@devsvr2 db2inst1]$ mkdir oatest0303
[db2inst1@devsvr2 db2inst1]$ ls
db2inst1 db2test Desktop oatest0303 sqllib
(2)進入該目錄
[db2inst1@devsvr2 db2inst1]$ cd oatest0303/
[db2inst1@devsvr2 oatest0303]$
(3)用數據庫抽取工具 db2look 導出數據庫結構
主要命令
db2look -d sample -e -z oatest -l -o oatest.sql
[db2inst1@devsvr2 oatest0303]$ db2look -d sample -e -z oatest -l -o oatest.sql
-- 未指定用戶標識,db2look 試圖使用環境變量 USER
-- USER 是: DB2INST1
-- 指定的模式爲: OATEST
-- 創建表的 DDL
-- 聯合部分的模式名被忽略
-- 輸出被發送到文件: oatest.sql
腳本中包括建立 bufferpool 以及tablespace的 DDL 語句
(4)用 db2move 工具導出數據庫數據
主要命令
db2move sample export
[db2inst1@devsvr2 oatest0303]$ db2move sample export
***** DB2MOVE *****
Action: EXPORT
Start time: Sun Mar 5 11:00:52 2006
Connecting to database SAMPLE ... successful! Server: DB2 Common Server V8.2.0
EXPORT: 0 rows from table "OATEST "."ATTACHFILE"
EXPORT: 0 rows from table "OATEST "."BASE"
……
(5)打包壓縮該目錄 oatest0303/
主要命令:
tar zcvf oatest0303.tar.gz oatest0303/
[db2inst1@devsvr2 oatest0303]$ cd ..
[db2inst1@devsvr2 db2inst1]$ tar zcvf oatest0303.tar.gz oatest0303/
oatest0303/
oatest0303/oatest.sql
oatest0303/EXPORT.out
oatest0303/db2move.lst
oatest0303/tab1.msg
oatest0303/tab1.ixf
……
3、導入步驟
(1)解壓
主要命令:
tar zxfv oatest0303.tar.gz
[db2inst1@devsvr2 db2inst1]$ tar zxfv oatest0303.tar.gz
oatest0303/
oatest0303/oatest.sql
oatest0303/EXPORT.out
oatest0303/db2move.lst
……
(2)建立新數據庫 db2 create db sample
主要命令:
db2 create db sample
[db2inst1@devsvr2 db2inst1]$ db2 create db sample
DB20000I CREATE DATABASE 命令成功完成。
(3)執行 oatest.sql 腳本建立數據庫
主要命令:
db2 -tvf oatest.sql
[db2inst1@devsvr2 db2inst1]$ cd oatest0303
[db2inst1@devsvr2 oatest0303]$ db2 -tvf oatest.sql
……
(4)執行 db2move 導入數據
主要命令:
db2move sample load
[db2inst1@devsvr2 oatest0303]$ db2move sample load
……
* LOAD: table "OATEST "."UM_USER"
-Rows read: 1529
-Loaded: 1529
-Rejected: 0
-Deleted: 0
-Committed: 1529
Disconnecting from database ... successful!
End time: Sun Mar 5 10:24:22 2006
(5)檢查一致性
主要命令:
db2 set integrity for oatest.UM_USER immediate checked
[db2inst1@devsvr2 oatest0303]$ db2 connect to sample
數據庫連接信息
數據庫服務器 = DB2/LINUX 8.2.0
SQL 授權標識 = DB2INST1
本地數據庫別名 = SAMPLE
[db2inst1@devsvr2 oatest0303]$ db2 "select count(*) from
oatest.um_user"
1
-----------
SQL0668N 由于表 "OATEST.UM_USER" 上的原因碼 "1",所以不允許操作。
SQLSTATE=57016
[db2inst1@devsvr2 oatest0303]$ db2 set integrity for oatest.UM_USER
immediate checked
DB20000I SQL 命令成功完成。
[db2inst1@devsvr2 oatest0303]$ db2 "select count(*) from
oatest.um_user"
1
-----------
1529
1 條記錄已選擇。
利用 sql 語句得到要檢查的表的執行語句
主要命令:
db2 "select 'db2 set integrity for oatest.'||TABNAME||' immediatechecked' from syscat.tables where TABSCHEMA='OATEST' and STATUS='C'"
[db2inst1@devsvr2 oatest0303]$ db2 "select 'db2 set
integrity for oatest.'||TABNAME||' immediate checked'
from syscat.tables where TABSCHEMA='OATEST' and STATUS='C'"
1
-----------------------------------------------------------------
db2 set integrity for oatest.CAL_AUTH immediate checked
……
db2 set integrity for oatest.UM_USER immediate checked
81 條記錄已選擇。
執行這 81 條語句,語句有可能報錯
主要命令:
db2 set integrity for oatest. CAL_AUTH immediate checked
[db2inst1@devsvr2 oatest0303]$ db2 set integrity
for oatest.CAL_AUTH immediate checked
DB20000I SQL 命令成功完成。
[db2inst1@devsvr2 oatest0303]$ db2 set integrity
for oatest.UM_USER immediate checked
DB20000I SQL 命令成功完成。
…………
如果報錯,再反複執行這些語句直到下面的語句結果返回 0 條記錄
[db2inst1@devsvr2 oatest0303]$ db2 "select 'db2 set integrity
for oatest.'||TABNAME||' immediate checked' from syscat.tables
where TABSCHEMA='OATEST' and STATUS='C'"
1
---------------------------------------------------------------
0 條記錄已選擇。
(6)在操作系統中建立用戶
[root@devsvr2 root]# useradd oatest
[root@devsvr2 root]# passwd oatest
Changing password for user oatest.
New password:
BAD PASSWORD: it is too short
Retype new password:
passwd: all authentication tokens updated successfully.
(7)給 oatest 用戶授權
主要命令:
db2 GRANTDBADM,CREATETAB,BINDADD,CONNECT,CREATE_NOT_FENCED_ROUTINE,
IMPLICIT_SCHEMA,LOAD,CREAT
E_EXTERNAL_ROUTINE,QUIESCE_CONNECTON DATABASE TO USER OATEST
db2 GRANT CREATEIN,DROPIN,ALTERIN ON SCHEMA OATEST TO USER OATEST
[db2inst1@devsvr2 db2inst1]$ db2 connect to sample
數據庫連接信息
數據庫服務器 = DB2/LINUX 8.2.0
SQL 授權標識 = DB2INST1
本地數據庫別名 = SAMPLE
[db2inst1@devsvr2 db2inst1]$ db2 GRANT DBADM,CREATETAB,BINDADD,CONNECT,CREATE_NOT_FENCED_ROUTINE,
IMPLICIT_SCHEMA,LOAD,CREATE_EXTERNAL_ROUTINE,
QUIESCE_CONNECT ON DATABASE TO USER OATEST;
DB20000I SQL 命令成功完成。
[db2inst1@devsvr2 db2inst1]$ db2 GRANT CREATEIN,
DROPIN,ALTERIN ON SCHEMA OATEST TO USER OATEST
DB20000I SQL 命令成功完成。
[db2inst1@devsvr2 db2inst1]$ db2 connect to sample user oatest using oatest
數據庫連接信息
數據庫服務器 = DB2/LINUX 8.2.0
SQL 授權標識 =OATSET
本地數據庫別名 = SAMPLE
[db2inst1@devsvr2 db2inst1]$ db2 "select count(*) from um_user"
1
-----------
1529
1 條記錄已選擇。
4、說明
(1)在db2數據庫中的bufferpool是和內存有關系的,所以你應該根據你的機器內存情況來建立 bufferpool
(2)tablespace 的路徑也是和你的應用有關,如果是雙機環境應該把表空間建立在共享存儲中,你可以根據實際情況來修改上文所說到的 oatest.sql 中的建立 bufferpool 以及 tablespace 的語句。