posts - 89,  comments - 98,  trackbacks - 0

          DB2 表復制方法介紹

          Version:v1.0.0

          Author xiedd

          Mail:xiedd@icss.com.cn

          CreateDate:2006-08-29

          LastEditDate:2006-08-30

          * ??????? 說明

          本文描述如何將DB2數據庫中的一些表復制到另一個數據庫中,適用于表中的數據量比較大(如1萬條記錄以上)的情況。當表中的數據量較少,并且表的數量不多時,可直接使用db2控制中心的表復制功能實現。

          * ??????? 適用條件

          n ??????? DB2 中表的跨庫復制,兩個數據庫可以在一臺機器上,也可以在不同的機器上。(以下假設兩個數據庫位于不同的機器上。)

          n ??????? 單一表中的數據量較大,通常在1萬條記錄數以上;

          n ??????? 表的個數比較多;

          * ??????? 術語定義

          n ??????? 源數據庫:需要復制的表存在的數據庫;

          n ??????? 目標數據庫:需要復制的表復制后存在的數據庫;

          n ??????? DDL: 數據定義語言, 用于建立和刪除數據庫以及數據庫實體的命令。

          * ??????? 總體說明

          表的復制一般情況下用到了db2的以下幾個命令:

          1. ????? EXPORT: 導出表中的數據到數據文件中。

          2. ????? IMPORT: 導入數據文件中的數據到表中。

          3. ????? LOAD :同IMPORT。區別是IMPORT需要寫日志,而LOAD不需要,因此可以極大的提高數據的裝載速度。

          本文數據復制的思想是:首先通過DDL語言將源數據庫中的表結構復制到目標數據庫上,再通過批處理命令將源數據庫中需要復制的表export成數據文件(IXF集成交換格式),然后將數據文件復制到目標數據庫所在的機器上,通過load命令將數據文件裝載到目標數據庫中。

          此過程主要使用了load命令以及避免了網絡傳輸,可以極大提高數據的復制速度。而腳本的方式也提供了更好的擴展性,可對任意個數的表進行復制。同時針對某些復雜情況可使用程序支持對這些腳本的自動生成。

          * ??????? 具體步驟

          以下步驟假設:

          l???????? 源數據庫為yndc

          l???????? 目標數據庫為htdc

          ?

          一、??? 創建生成DLL文件的批處理文件

          本步驟創建文件dll.bat。

          其內容語法示例如下:

          db2look -d <dbname> -t? <table1> <table2> <tableN>? -e -nofed -o dll.sql

          <dbname>替換成源數據庫的名稱,<tableN>替換成具體的表名,多個表之間用空格分隔。如以下示例導出yndc數據庫中的2個表DIM_GROUPDIM_PJ_MACH的庫表結構。

          db2look -d yndc -t? DIM_GROUP DIM_PJ_MACH? -e -nofed -o dll.sql

          ?

          二、??? 執行DLL批處理文件,生成DLL文件

          本步驟執行dll.bat

          dll.bat復制到源數據庫所在的機器上,在db2cmd環境中執行dll.bat,生成dll.sql。

          ?

          三、??? 執行DLL文件

          本步驟執行dll.sql

          執行之前,更改dll.sql中目標數據庫名稱,并輸入用戶名和密碼。同時必要情況下,更改表所在的表空間。

          -- CLP 文件是使用 DB2LOOK 版本創建的 8.2

          -- 時間戳記: 2006-7-10 11:28:02

          -- 數據庫名稱: YNDC??????????

          -- 數據庫管理器版本: DB2/NT Version 8.2.4?????????

          -- 數據庫代碼頁: 1386

          -- 數據庫整理順序為: UNIQUE

          ?

          ?

          CONNECT TO HTDC user db2admin using db2password;

          ?

          ------------------------------------------------

          -- 表的 DDL 語句 "DB2ADMIN"."BC_FACCIGTEMPLATE"

          ------------------------------------------------

          ?

          ?CREATE TABLE "DB2ADMIN"."BC_FACCIGTEMPLATE"? (

          ???? ? "CITYID" VARCHAR(30) NOT NULL ,

          ???? ? "CIGID" VARCHAR(30) NOT NULL ,

          ???? ? "CIGNAME" VARCHAR(50) NOT NULL ,

          ???? ? "ISUPLOAD" SMALLINT )??

          ???? ? IN "HTDC" ;

          -- 表上的索引的 DDL 語句 "DB2ADMIN"."BC_FACCIGTEMPLATE"

          ?

          CREATE INDEX "DB2ADMIN"."PK__BC_FACCIGTEMP1" ON "DB2ADMIN"."BC_FACCIGTEMPLATE"

          ???? ("CITYID" ASC,

          ???? ?"CIGID" ASC) CLUSTER ;

          ?

          ?

          -- 表上主鍵的 DDL 語句 "DB2ADMIN"."BC_FACCIGTEMPLATE"

          ?

          ALTER TABLE "DB2ADMIN"."BC_FACCIGTEMPLATE"

          ADD CONSTRAINT "SQL051107160756210" PRIMARY KEY

          ???? ("CITYID",

          ???? ?"CIGID");

          ?

          COMMIT WORK;

          CONNECT RESET;

          TERMINATE;

          ?

          然后進入db2cmd環境,切換到dll.sql所在的目錄,執行以下命令:

          db2 -tvf dll.sql

          注意查看執行結果是否正確。

          ?

          四、??? 創建導出數據的EXPORT腳本

          本步驟創建腳本export.bat

          內容格式示例如下:

          db2 connect to <dbname> user <username> using <password>

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

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

          db2 "export to aa3.ixf of ixf select * from <table3>"

          db2 connect reset

          替換數據庫名稱、用戶名、密碼、表名。注意事項:多個表之間的集成交換格式文件按需要遞增,如aa1.ixf,aa2.ixf,aa3.ixf...,并且要和后續的load腳本對應。

          ?

          以下樣例導出2個表的數據,樣例如下:

          db2 connect to yndc user db2admin using db2password

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

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

          db2 connect reset

          ?

          五、??? 執行export腳本

          本步驟執行export.bat

          在源數據庫所在的機器上,在db2cmd環境中執行export.bat。N個表將生成N個集成交換格式數據文件(后綴名.ixf)

          ?

          六、??? 將導出的數據壓縮復制到目標數據庫所在機器,并解壓縮

          將數據文件打成rarzip包,復制到目標機器上,并解壓縮。

          ?

          七、??? 構建導入數據的LOAD腳本

          本步驟在數據文件(IXF)所在的目錄中創建load.bat。

          內容格式示例如下:

          db2 connect to <dbname> user <username> using <password>

          db2 "load from aa1.ixf of ixf? replace into <table1>? COPY NO? without prompting " > 1_<table1>.log

          db2 "load from aa2.ixf of ixf? replace into <table2> COPY NO? without prompting " > 2_<table2>.log

          db2 connect reset

          替換數據庫名稱、用戶名、密碼、表名。注意事項:集成交換格式文件(ixf)對應的表名要和export時導出的表名對應。

          ?

          以下樣例導入2個表的數據,樣例如下:

          db2 connect to yndc user db2admin using db2password

          db2 "load from aa1.ixf of ixf? replace into DIM_GROUP? COPY NO? without prompting " > 1_DIM_GROUP.log

          db2 "load from aa2.ixf of ixf? replace into DIM_PJ_MACH? COPY NO? without prompting " > 2_DIM_PJ_MACH.log

          db2 connect reset

          ??? ???

          八、??? 執行load腳本,檢查執行結果

          本步驟執行export.bat

          db2cmd環境中切換到load.bat所在的目錄,執行load.bat。

          執行完成之后N個表將生成Nlog文件,逐一檢查這些log文件,以確定數據load是否正常。

          所有步驟結束!

          ?

          * ??????? 附錄1:重命名表的名稱

          如果需要將表復制到目標數據庫時使用不同的名稱,可在以上步驟完成之后,再編輯一個腳本,執行表的重命名操作。示例如下:

          db2 connect to <dbname> user <username> using <password>

          db2 rename <table1_old> to <table2_new>

          db2 rename <table2_old> to <table3_new>

          ...
          db2 connect reset

          * ??????? 附錄2:使用程序生成腳本

          當表的數量較多,手工編輯腳本比較復雜時,可通過java程序生成dll.bat,export.batload.bat。

          示例如下:

          /**

          ?* <p>Title: 數據庫集成服務類,支持對yndc等數據庫進行集成</p>

          * @version 1.0

          ?*/

          public class DBEAIService {

          ??? /**

          ???? * 數據文件存放目錄

          ???? */

          ??? private String DEST_DIR = Globals.ManagerHome + "/output";

          ?

          ??? /**

          ???? * 日志記錄器

          ???? */

          ??? private static Logger log = Logger.getLogger(DBEAIService.class);

          ?

          ??? public DBEAIService() {

          ?

          ??? }

          ?

          ?

          ??? /**

          ???? * 創建導出腳本

          ???? * @param conn

          ???? * @param creator  表創建者

          ???? * @param filePath

          ???? */

          ??? private 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' order by name";

          ??????? 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);

          ??? }

          ?

          ??? /**

          ???? * 創建裝載腳本

          ???? * @param conn

          ???? * @param creator  表創建者

          ???? * @param filePath

          ???? */

          ??? private 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' order by name";

          ??????? 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);

          ??? }

          ?

          ??? /**

          ???? * 獲取某個數據庫表明的列表

          ???? * @param conn

          ???? * @param creator  表創建者

          ???? * @return

          ???? * @throws Exception

          ???? */

          ??? private List getTableList(Connection conn, String creator) throws Exception {

          ??????? DBBase dbBase = new DBBase(conn);

          ??????? String selectTableSql =

          ??????????????? "select name from sysibm.systables where creator = '"

          ??????????????? + creator + "' and type='T' order by name";

          ??????? 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);

          ??????? }

          ??????? return list;

          ??? }

          ?

          ??? /**

          ???? * 將列表寫入到文本文件中

          ???? * @param list

          ???? * @param filePath

          ???? */

          ??? public void saveListToFile(List list, String filePath) throws Exception {

          ??????? StringBuffer sb = new StringBuffer();

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

          ??????????? String value = (String) list.get(i);

          ??????????? sb.append(value);

          ??????????? sb.append("\r\n");

          ??????? }

          ??????? String str = sb.toString();

          ??????? FileUtility.saveStringToFile(filePath, str, false);

          ??? }

          ?
          posted on 2006-09-14 09:55 水煮三國 閱讀(2232) 評論(0)  編輯  收藏 所屬分類: Database
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(4)

          隨筆分類(85)

          隨筆檔案(89)

          文章分類(14)

          文章檔案(42)

          收藏夾(37)

          java

          oracle

          Sybase

          搜索

          •  

          積分與排名

          • 積分 - 211146
          • 排名 - 265

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阿拉尔市| 开阳县| 图们市| 新河县| 江孜县| 游戏| 五寨县| 仙居县| 张家港市| 利津县| 鄂托克旗| 山东| 江永县| 仙居县| 陵水| 萍乡市| 克什克腾旗| 彭山县| 辽宁省| 蓝田县| 泰顺县| 迁安市| 江油市| 二连浩特市| 香格里拉县| 广丰县| 普宁市| 衡水市| 邓州市| 石渠县| 香格里拉县| 灌南县| 金门县| 卫辉市| 大新县| 东莞市| 石门县| 吉安县| 响水县| 凉山| 纳雍县|