db2move是DB2提供的一个命令行批量迁移工具,它本质上是db2 export和db2 load/import命令的封装脚本,能够一次性处理数据库中所有用户表的数据导出与导入。相比手工逐张表编写导出导入命令,db2move省时省力,尤其在测试环境搬迁、系统升级、数据仓库同步等场景中应用非常广泛。本文将从导出、导入、常见问题三个层面完整讲解这套工具的用法。

一、db2move export导出数据详解
导出之前需要先连接到源数据库,然后在一个专门创建的目录中执行导出命令,所有生成的数据文件都会落在这个目录里。db2move export会为每张用户表生成一个DEL格式的文本文件,同时产生一个db2move.lst清单文件,这个清单记录了表名、模式名和对应的数据文件名,是后续导入操作的关键依据。
mkdir /home/db2inst1/expdata cd /home/db2inst1/expdata db2 connect to SAMPLE db2move SAMPLE export
打开db2move.lst可以看到类似"SCHEMA1!EMPLOYEE!tab1.ixf!DEL!"这样的行,感叹号是字段分隔符。如果只想导出部分表,可以使用-tn参数指定表名列表,表名之间用逗号分隔,例如db2move sample export -tn EMPLOYEE,DEPARTMENT。需要注意表名要带上模式,否则默认使用当前登录用户的模式去匹配,很容易出现找不到表的错误。
导出时还可以用-sn限定模式,用-io指定消息文件,用-l指定大对象文件的存放路径。如果表中包含CLOB、BLOB等大对象字段,强烈建议显式指定lobpath,否则大对象数据会和普通数据混在一起,导入时容易出问题。导出完成后一定要检查db2move.lst和消息文件,确认没有表导出失败再进行下一步。
二、db2move导入数据的两种方式:load与import
db2move导入支持load和import两种模式。import走的是常规的SQL导入通道,逐行写入数据并记录日志,速度相对慢,但会触发触发器、检查约束和引用约束,数据一致性有保障。load则绕过日志直接把数据页写入表空间,速度极快,适合大表批量装载,但默认情况下表会处于set integrity pending状态,需要手动执行set integrity语句让约束生效。
cd /home/db2inst1/expdata db2move TARGETDB load -l /home/db2inst1/expdata/lobdir db2 "set integrity for SCHEMA1.EMPLOYEE immediate checked"
使用load方式导入后,凡是带约束的表都会进入检查挂起状态,直接查询会报SQLSTATE 57016错误,报错信息通常是"表的完整性处理处于暂挂状态"。这时必须对所有受影响的表执行set integrity for 表名 immediate checked。如果表很多,可以查询SYSCAT.TABLES中STATUS字段为C的表,批量生成set integrity语句,一条条手工敲显然不现实。
import方式则简单一些,命令为db2move TARGETDB import -io replace_create。其中replace_create表示如果表存在则替换数据,不存在则根据导出信息自动建表,这在目标库还是空库的情况下非常方便。但要注意db2move本身并不导出完整的DDL,它导出的表结构信息来自PC/IXF文件的消息部分,索引、触发器、存储过程、权限这些对象并不会跟着过去,需要单独用db2look生成DDL脚本在目标库执行。
三、db2look配合db2move完成完整迁移
db2move只负责表数据和最基本的建表信息,一次真正完整的迁移应该是db2look加db2move的组合。db2look可以从系统编目中提取出完整的DDL语句,包括表空间、缓冲池、表、索引、外键、触发器、序列、权限等,在目标库先执行DDL再导入数据,结构才不会缺斤少两。
db2look -d SAMPLE -e -z SCHEMA1 -o ddl.sql db2 -tf ddl.sql db2move TARGETDB load
生成DDL时几个常用参数要记牢:-e表示提取整个数据库对象的DDL,-z限定模式,-l指定用户名便于提取授权语句,-x可以生成grant授权信息。如果源库和目标库的表空间结构不同,比如目标库没有对应的SMS表空间,建表语句执行会失败,需要先手工创建表空间或者修改DDL中的表空间名称。
执行顺序上建议先跑db2look的DDL,再跑db2move的数据导入,最后统一处理set integrity和runstats。导入完成后别忘了对核心表执行runstats更新统计信息,否则优化器拿不到准确的统计数据,查询性能会明显下降。
四、迁移过程中的常见问题与注意事项
第一个高频问题是权限不足。db2move load需要目标库的LOAD权限和表空间的USE权限,普通用户经常在这一步被卡住,报SQL5546N或SQL0551N错误,解决办法是让DBADM授予相应权限或直接用实例用户执行。第二个问题是代码页不一致,源库是GBK目标库是UTF-8时,DEL文件中的中文可能出现乱码,建议导出时统一指定-aw或保证两端代码页一致,实在不行改用IXF格式减少编码依赖。
第三个问题是文件名冲突。db2move为每张表生成的数据文件默认放在同一个目录,如果不同模式下存在同名表,可能出现文件覆盖,此时应分模式分目录导出。第四个问题是DEL文件中的特殊字符,如果数据本身包含字段分隔符或换行符,导出的文本文件会被破坏,导入时报格式错误。针对这类脏数据,可以在导出时使用modified by coldel子句更换分隔符,或者干脆用IXF二进制格式,IXF对特殊字符的兼容性远好于DEL。
最后提醒一点,db2move import在遇到错误行时的默认行为是继续执行并记录在消息文件中,所以导入结束并不代表数据全部正确。务必检查导出目录下生成的LOAD0001.msg等消息文件,统计成功行数与源库count对比。对于金融类等对数据一致性要求高的场景,建议导入后执行db2move TARGETDB load -check或者用查询语句做行数和关键字段的双重校验,确认无误后再切换应用连接。
DB2 db2move数据库导出导入DB2数据迁移修改时间:2026-09-05 20:28:51