通过网络将大量数据从一台数据库服务器复制到另一台数据库服务器需要面临下面的挑战: 1.海量数据 2.时间限制,需要更快的数据传输速度和数据重新加载速度 3.需要跨数据库分区节点均匀地分布数据 所以选择正确的数据迁移工具和方法是在大型数据仓库环境中的不同系统之间高效迁移数据的关键。为了帮助您完成数据迁移任务,本文详细介绍了几种常用的数据迁移方案,以供大家参考学习。
实现方法
DB2从一个环境到另一个环境刷新大型数据集时,有很多方案可供参考借鉴。本文列举了如下5种方法,如下所示: 1.在本地数据库服务器上导出数据,传输数据文件,然后在目标数据库服务器上本地加载数据 2.从本地数据库服务器上导出数据,并将数据远程加载到目标数据库服务器中 3.从远程数据库服务器上导出数据,并在目标数据库服务器上本地加载数据 4.将数据导出到操作系统管道中,然后通过管道将数据导入或加载到目标远程数据库服务器中 5.在本地数据库服务器上并行导出数据(每部分位于各自的分区文件系统中),使用一个数据文件传输,然后在本地并行加载各个部分 下面通过示例详细讲解一下每种方法的实现步骤: A.在本地数据库服务器上导出数据,传输数据文件,然后在目标数据库服务器上本地加载数据
1st.实现模型如下所示:
2nd.具体步骤如下: 1.在源数据库服务器上本地连接到 Source CONNECT TO SourceDB; 2.在源数据库服务器中的表上执行 DB2 导出 EXPORT TO DATAMARTS.SCENARIO_CALENDAR.DEL OF DEL MESSAGES DATAMARTS.SCENARIO_CALENDAR.MSG SELECT * FROM DATAMARTS.SCENARIO_CALENDAR; 3.压缩已导出的文件,从而缩短在服务器之间进行文件传输所需的时间 gzip DATAMARTS.SCENARIO_CALENDAR F.DEL 4.使用 sftp 或 scp 将压缩后的文件从 SourceDB 服务器传输到 TargetDB 服务器 cd sftp username@ put DATAMARTS.SCENARIO_CALENDAR.DEL.gz OR scp DATAMARTS.SCENARIO_CALENDAR.DEL.gz username@:/ 5.在目标数据库服务器上解压缩传输完毕的文件 gunzip DATAMARTS.SCENARIO_CALENDAR.DEL.gz 6.在目标数据库服务器上本地连接到 TargetDB CONNECT TO TargetDB; 7.执行加载或导入 LOAD FROM DATAMARTS.SCENARIO_CALENDAR.DEL OF DEL SAVECOUNT 10000 MESSAGES DATAMARTS.SCENARIO_CALENDAR.LOAD.MSG INSERT INTO DATAMARTS.SCENARIO_CALENDAR; 8.如果选择使用加载命令,在操作结束时执行一次 SET INTEGRITY 命令 SET INTEGRITY FOR DATAMARTS.SCENARIO_CALENDAR IMMEDIATE CHECKED; 9.执行 RUNSTATS,让统计数据保持最新 RUNSTATS ON TABLE DATAMARTS.SCENARIO_CALENDAR WITH DISTRIBUTION AND DETAILED INDEXES ALL; B. 在本地数据库服务器上导出数据,传输数据文件,然后在目标数据库服务器上本地加载数据
1st. 实现模型如下所示:
2nd. 具体步骤: 1.在源数据库服务器中登记目标数据库。 CATALOG TCPIP NODE TargetND REMOTE TargetDBServer.ibm.com SERVER 50001; CATALOG DATABASE TargetDB AT NODE TargetND; 2.在源数据库服务器上本地连接到 SourceDB。 CONNECT TO SourceDB; 3.从源数据库服务器上的表执行 DB2 导出。 EXPORT TO DATAMARTS.SCENARIO_CALENDAR.DEL OF DEL MESSAGES DATAMARTS.SCENARIO_CALENDAR.msg SELECT * FROM DATAMARTS.SCENARIO_CALENDAR; 4.在目标数据库服务器上远程连接到 TargetDB。 CONNECT TO TargetDB user using ; 5.将数据从源数据库远程加载或导入目标数据库。 LOAD CLIENT FROM DATAMARTS.SCENARIO_CALENDAR.DEL OF DEL SAVECOUNT 10000 MESSAGES DATAMARTS.SCENARIO_CALENDAR.LOAD.msg INSERT INTO DATAMARTS.SCENARIO_CALENDAR; 6.如果选择使用加载命令,在操作结束时执行一次 SET INTEGRITY 命令。 SET INTEGRITY FOR DATAMARTS.SCENARIO_CALENDAR IMMEDIATE CHECKED; 7.执行 RUNSTATS,让统计数据保持最新。 RUNSTATS ON TABLE DATAMARTS.SCENARIO_CALENDAR WITH DISTRIBUTION AND DETAILED INDEXES ALL; C. 在本地数据库服务器上导出数据,传输数据文件,然后在目标数据库服务器上本地加载数据
1st. 实现模型如下所示:
2nd. 具体步骤: 1.在目标数据库服务器中登记源数据库。 CATALOG TCPIP NODE SourceND REMOTE SourceDBServer.ibm.com SERVER 50001; CATALOG DATABASE SourceDB AT NODE SourceND; 2.从目标数据库服务器远程连接到源数据库。 CONNECT TO SourceDB user using ; 3.从表远程执行 DB2 导出。 EXPORT TO DATAMARTS.SCENARIO_CALENDAR.DEL OF DEL MESSAGES DATAMARTS.SCENARIO_CALENDAR.msg SELECT * FROM DATAMARTS.SCENARIO_CALENDAR; 4.在目标数据库服务器上本地连接到 TargetDB。 CONNECT TO TargetDB user using ; 5.执行本地加载或导入。 LOAD FROM DATAMARTS.SCENARIO_CALENDAR.DEL OF DEL SAVECOUNT 10000 MESSAGES DATAMARTS.SCENARIO_CALENDAR.LOAD.msg INSERT INTO DATAMARTS.SCENARIO_CALENDAR; 6.如果选择使用加载命令,在操作结束时执行一次 SET INTEGRITY 命令。 SET INTEGRITY FOR DATAMARTS.SCENARIO_CALENDAR IMMEDIATE CHECKED; 7.执行 RUNSTATS,让统计数据保持最新。 RUNSTATS ON TABLE DATAMARTS.SCENARIO_CALENDAR WITH DISTRIBUTION AND DETAILED INDEXES ALL; D. 在本地数据库服务器上导出数据,传输数据文件,然后在目标数据库服务器上本地加载数据
1st. 实现模型如下所示:
2nd. 具体步骤: 1.在目标数据库服务器中登记源数据库: CATALOG TCPIP NODE SourceND REMOTE SourceDBServer.ibm.com SERVER 50001; CATALOG DATABASE SourceDB AT NODE SourceND; 2.在目标数据库服务器中创建一条操作系统管道。 mkfifo datapipe ls ?ltr datapipe prw-r--r-- 1 bculinux bcuigrp 0 2011-09-18 16:32 datapipe 3.从目标服务器远程连接到源数据库。 CONNECT TO SourceDB user using ; 4.从源数据库导出数据,并将其写入操作系统管道(数据管道)的一端。在业务场景中,数据库管理团队会从 PROD 刷新 UAT。仅适用于 2011 年的 12904084 条记录。 EXPORT TO datapipe OF DEL MODIFIED BY COLDEL, MESSAGES FACT_CUST_FPI_VALIDATION.EXP.msg SELECT * FROM DATAMARTS.F_CUST_FPI_VALIDATION WHERE REC_LOAD_DT > '2011-01-01-00.00.00.000000' WITH UR; 5.从目标服务器远程连接到源数据库。 CONNECT TO TargetDB user using ; 6.从操作系统管道的另一端将数据导入或加载到常规哈希范围分区的表中。 IMPORT FROM datapipe OF DEL MODIFIED BY COLDEL, MESSAGES FACT_CUST_FPI_VALIDATION.IMP.msg INSERT INTO DATAMARTS.FACT_CUST_FPI_VALIDATION; LOAD FROM datapipe OF DEL MODIFIED BY COLDEL, MESSAGES FACT_CUST_FPI_VALIDATION.LD.msg INSERT INTO DATAMARTS.FACT_CUST_FPI_VALIDATION; E. 在本地数据库服务器上导出数据,传输数据文件,然后在目标数据库服务器上本地加载数据
1st. 实现模型如下所示:
2nd. 具体步骤: 1.创建从管理节点导出目录到所有数据节点的软链接。在这个例子中,导出目录为 $HOME/db2backup/exports。 ln -s /db2fs/bculinux/NODE0001 NODE1 ln -s /db2fs/bculinux/NODE0002 NODE2 ln -s /db2fs/bculinux/NODE0040 NODE40 3.下列清单显示了创建软链接之后得到的文件。 ls ?ltr lrwxrwxrwx 1 bculinux bcuigrp 24 2011-04-13 19:25 NODE1 -> /db2fs/bculinux/NODE0001 lrwxrwxrwx 1 bculinux bcuigrp 24 2011-04-13 19:25 NODE2 -> /db2fs/bculinux/NODE0002 lrwxrwxrwx 1 bculinux bcuigrp 24 2011-04-13 19:28 NODE40 -> /db2fs/bculinux/NODE0040 4.在每个物理数据节点服务器中,创建类似下面的目录结构。 mkdir ?p /db2fs/bculinux/NODE0001/exports/datamarts mkdir ?p /db2fs/bculinux/NODE0002/exports/datamarts mkdir ?p /db2fs/bculinux/NODE0040/exports/datamarts 5.对于需要导出的表,请从 SYSCAT.COLUMNS 找到哈希分区列。 db2 "SELECT SUBSTR(COLNAME,1,20) COLNAME, PARTKEYSEQ FROM SYSCAT.COLUMNS WHERE TABNAME=''F_CUST_PROFTBLTY_TMP' AND TABSCHEMA='DATAMARTS'" 6.在这个表中,我们找到了两个哈希分区列。我们选择其中一个哈系列,以便在各自分区中导出数据。 使用 DB2 EXPORT 命令跨所有分区并行导出数据,如以下清单所示。 db2_all "\"|| db2 \"EXPORT TO $HOME/db2backup/exports/NODE##/exports/datamarts/ DATAMARTS.F_CUST_PROFTBLTY_TMP.del OF DEL SELECT * FROM DATAMARTS.F_CUST_PROFTBLTY_TMP WHERE DBPARTITIONNUM (BUSS_UNIT_KEY)=##\"" 此命令将每个分区数据导出到各自的分区节点。 7.使用 scp 执行从每个源数据库服务器节点到目标数据库服务器的文件复制。 scp -p @: 8.并行的LOAD把每个分区数据加载到各自的分区节点。 db2_all "<<-0<<\" db2 -v \"LOAD FROM db2backup/exports/NODE##/exports/datamarts DATAMARTS.F_CUST_PROFTBLTY_TMP.del OF DEL INSERT INTO DATAMARTS.F_CUST_PROFTBLTY_TMP NONRECOVERABLE \""
如何我们掌握了上面所讲的五种方案,那么迁移DB2数据库就是小菜了。
|