IBM DB2 的數據複製、遷移方法

以下方法經測試,在環境ibm x346,3.2g×2,4g,raid 1,db2 v8.2.4,win2000 adv server,dms表空間中,數據的load速度在60-100萬條/min左右。

背景:需要更改資料庫表空間,或者需要將資料庫中所有表的數據遷移到一個新的資料庫中。

步驟:

1.通過db2控制台(db2cc)選中源資料庫中的所有表,將其導出成ddl腳本;

2.根據需要對腳本進行必要的修改,譬如更改表空間為gather;

3.新建資料庫,新建dms表空間:gather;

4.將ddl腳本在此資料庫中執行;

5.編寫代碼查詢源資料庫中的所有表,自動生成export腳本;

6.編寫代碼查詢源資料庫中的所有表,自動生成import腳本;

7.連線源資料庫執行export腳本;

8.連線目標資料庫執行import腳本;


附錄1:生成export腳本代碼示例:

/**

* 創建導出腳本

* @param conn

* @param creator 表創建者

* @param filepath

*/

public void createexportfile(connection conn,string creator,string filepath) throws exception {

dbbase dbbase = new dbbase(conn);

string selecttablesql = "select name from sysibm.systables where creator = '" + creator + "' and type='t'";

try {

dbbase.executequery(selecttablesql);

} catch (exception ex) {

throw ex;

} finally {

dbbase.close();

}

dbresult result = dbbase.getselectdbresult();

list list = new arraylist();

while (result.next()) {

string table = result.getstring(1);

list.add(table);

}

stringbuffer sb = new stringbuffer();

string enterflag = "\r\n";

for (int i = 0; i < list.size();i++) {

string tablename = (string)list.get(i);

sb.append("db2 \"export to aa" + string.valueof(i+1)+ ".ixf of ixf select * from " + tablename + "\"");

sb.append(enterflag);

}

string str = sb.tostring();

fileutility.savestringtofile(filepath, str, false);

}

附錄2:生成import腳本代碼示例:

/**

* 創建裝載腳本

* @param conn

* @param creator 表創建者

* @param filepath

*/

public void createloadfile(connection conn,string creator,string filepath) throws exception {

dbbase dbbase = new dbbase(conn);

string selecttablesql = "select name from sysibm.systables where creator = '" + creator + "' and type='t'";

try {

dbbase.executequery(selecttablesql);

} catch (exception ex) {

throw ex;

} finally {

dbbase.close();

}

dbresult result = dbbase.getselectdbresult();

list list = new arraylist();

while (result.next()) {

string table = result.getstring(1);

list.add(table);

}

stringbuffer sb = new stringbuffer();

string enterflag = "\r\n";

for (int i = 0; i < list.size();i++) {

string tablename = (string)list.get(i);

sb.append("db2 \"load from aa" + string.valueof(i+1)+ ".ixf of ixf into " + tablename + " copy no without prompting \"");

sb.append(enterflag);

}

string str = sb.tostring();

fileutility.savestringtofile(filepath, str, false);

}


附錄3:export腳本示例

db2 connect to testdb user test password test

db2 "export to aa1.ixf of ixf select * from table1"

db2 "export to aa2.ixf of ixf select * from table2"

db2 connect reset


附錄4:import腳本示例

db2 connect to testdb user test password test

db2 "load from aa1.ixf of ixf replace into table1 copy no without prompting "

db2 "load from aa2.ixf of ixf replace into table2 copy no without prompting "

db2 connect reset