db2从表中export出的数据无法import

风中追梦郎 2010-07-16 05:35:06
从一个数据表(A)中导出数据"export to 1.txt of del select * from a",大概有20万条数据
然后再导进入B数据表中,B表与A表结构一样,索引一样.
"import from 1.txt of del insert into B"
报错大致是有部分数据非法导入不成功.有几万条数据导不进数据表.

这个问题如何解决呀?
del格式能转换成ixf格式的文件吗
...全文
899 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nancyrong 2010-07-20
  • 打赏
  • 举报
回复
希望能帮到你:


WSF:工作表方式导入导出,这种格式的文件类型用的比较少。DB2中对不同的数据导入导出方式,支持不同的文件类型,这里个人觉得很有必要注意下的。COMMITCOUNT,保证insert的数据在COMMITCOUNT以后进行一次commit,这对于大数据量的导入文件来说是一个不错的方法,  例:Import from filename of del COMMITCOUNT 50000 insert into tabname;
  DB2的数据迁移,最常用的就是导入导出功能,而导入导出的命令貌似简单,实则内含玄机,千变万化,稍不留神,则错误百出,这儿就工作中常用到的命令,总结了一下,分享给大家!欢迎大家踊跃拍砖!?

  当然在这以前,我觉得有必要提及一点关于导入导出基础的知识!

  DEL:界定的ASCII文件,行分隔符和列分隔符将数据分开。

  ASC:定长的ASCII文件,行按照行分割符分开,列定长。

  PC/IXF:只能用来在DB2之间导数据,根据类型数字值被打包成十进制或者二进制,字符被保存为ASCII,只保存变量已经使用了的长度,文件中包括表的定义和表的数据。

  WSF:工作表方式导入导出,这种格式的文件类型用的比较少。

  DB2中对不同的数据导入导出方式,支持不同的文件类型,这里个人觉得很有必要注意下的。

  文件类型 Import export load

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

  定界 支持 支持 支持

  非定界 支持 不支持 支持

  Ixf 支持 支持 支持

  Wsf工作表 支持 支持 不支持

  关于3种导入导出操作进行简单的介绍:

  export:导出数据,支持IXF,DEL或WSF

  import:导入数据,可以向表中导入数据,支持上面提到的4种文件类型。

  load:导入数据,功能和import基本相同。支持以上说的几种文件类型。

  关于Export

  这个其实比较简单,没啥好说的,一般命令:export to filename of filetype select x from xx where ;就ok了,这里需要注意的是:

   1.关于不同字符集的导出

  MODIFIED BY CODEPAGE= Exprot to filename.del for del MODIFIED BY CODEPAGE=1386 select …from …where …;

  这里,在数据从数据库倒出来的时候就会做一个数据库代码页的转换

  2.时间字段格式化的

  MODIFIED BY TIMESTAMPFORMAT="yyyy-mm-dd hh:mm:ss tt"

  例:Exprot to filename.del for del MODIFIED BY TIMESTAMPFORMAT="yyyy-mm-dd hh:mm:ss tt" select …from …where …;

  关于Import

  1.Import模式的介绍

  CREATE/INSERT/INSERT_UPDATE/REPLACE/REPLACE_CREATE

  CREATE :首先创建目标表和它的索引,然后将数据导入到新表中。该选项惟一支持的文件格式是 PC/IXF。还可以指定新表所在表空间的名称

  INSERT :将导入的数据插入表中。目标表必须已经存在。

  INSERT_UPDATE :将数据插入表中,或者更新表中具有匹配主键的行。目标表必须已经存在,并且定义了一个主键。

  REPLACE :删除所有已有的数据,并将导入的数据插入到一个已有的目标表中。

  REPLACE_CREATE :如果目标表已经存在,则导入实用程序删除已有的数据,并插入新的数据,就像 REPLACE 选项那样。如果目标表还没有定义,那么首先创建这个表以及它的相关索引,然后再导入数据。正如您可能想像的那样,输入文件必须是 PC/IXF 格式的文件,因为那种格式包含对导出表的结构化描述。如果目标表是被一个外键引用的一个父表,那么就不能使用 REPLACE_CREATE。

  2.批量提交

  COMMITCOUNT,保证insert的数据在COMMITCOUNT以后进行一次commit,这对于大数据量的导入文件来说是一个不错的方法,

  例:Import from filename of del COMMITCOUNT 50000 insert into tabname;

  3.批量插入

  MODIFIED BY COMPOUND把文件中的 COMPOUND 行记录作为一组一起导入,这个操作可以和上边的批量提交一起使用,比较理想。

  例:Import from filename of del MODIFIED BY COMPOUND =50 insert into tabname;

  4.导入记录限制

  ROWCOUNT:只导入rowcount 条数据,有时候,业务逻辑需要只导入部分数据,那么ROWCOUNT是一个不错的选择,只是在我的测试中ROWCOUNT一直没有起过作用,呵呵,谁熟悉这里,帮我完善下。

  例:Import from filename of del ROWCOUNT 10000 insert into tabname;

  5.导入起点

  RESTARTCOUNT:从导入文件的第RESTARTCOUNT条记录开始导入

  例:Import from filename of del RESTARTCOUNT 55 ROWCOUNT 10000 insert into tabname;--从55条开始,导入10000条数据

  6.有警告数据的条数限制

  WARNINGCOUNT:当导入的数据中,有警告或错误(例如类型不匹配,列不对应等造成的)并且条数超过WARNINGCOUNT是就会停止import。

  例:Import from filename of del WARNINGCOUNT 10 insert into tabname;

  7.禁止发出行警告

  MODIFIED BY NOROWWARNINGS

  例:Import from filename of del MODIFIED BY NOROWWARNINGS WARNINGCOUNT 10 insert into tabname;

  8.LOB 文件

  LOBS FROM :指出LOB的路径

  例:Import from filename of del LOBS FROM ‘/home’ MODIFIED BY NOROWWARNINGS WARNINGCOUNT 10 insert into tabname;

  9.对于自增序列(GENERATED ALWAYS)

  建议不要对自增序列的表进行import操作,因为import对于自增序列,只有MODIFIED BY IDENTITYIGNORE和MODIFIED BY IDENTITYMISSING的2中操作,这2中操作都会改变自增序列的原值,这样如果导出表和表之间有基于自增序列的关联关系的话,就失去了数据本身的意义,所以建议尽量少用基于import的自增表的操作,那该怎么做?可以用load老代替import,我们下来在load的操作中会讲到!

  关于Load

  1. 字符串间隔,列间隔,小数点表示

  CHARDEL/COLDEL/DECPT

  例:LOAD CLIENT FROM 'F:s1.del' OF DEL MODIFIED BY CHARDEL(COLDEL= DECPT? INSERT INTO "DB2ADMIN"."ZXTABLES"

  2.数据库记录中存在换行符,导致数据无法装入的情况

  MODIFIED BY DELPRIORITYCHAR

  DB2默认load优先级策略为,record delimiter, character delimiter, column delimiter,这样record delimiter得优先级最高,所以原始文件如果有换行的话load就认为是新的record,如果用户在某些情况下行里面包含了换行符(比如论坛里面的一条帖子,不可能把换行符删掉的),就必须用delprioritychar改变默认的优先级别,确保""之间的数据不管有没有换行符都被认为是同一条记录

  例:LOAD CLIENT FROM 'F:s1.del' OF DEL MODIFIED BY DELPRIORITYCHAR INSERT INTO DB2ADMIN.ZXTABLES

  3.load后表空间暂挂的处理

  Copy YES/ NONRECOVERABLE

  对于DMS表空间,load默认为copy NO 模式,此模式下,load完成后,表空间会处于暂挂状态,这时候只能查表中的数据,需要对表空间进行一次备份,才可以对表进行update、insert等操作,那么我们可以使用如上2个命令,对于Copy YES,load完成以后会自动进行一次备份操作;NONRECOVERABLE 指出load不可恢复,此命令符不会产生表空间暂挂,也不会自动进行表空间备份,但是他有一个缺点就是,不能恢复,当数据库进行回滚的时候,不能还原,危险等级还是比较高一点,不过个人觉得也NONRECOVERABLE比较实用。

  例:LOAD CLIENT FROM 'F:s1.del' OF DEL INSERT INTO DB2ADMIN.ZXTABLES NONRECOVERABLE

  LOAD CLIENT FROM 'F:s1.del' OF DEL INSERT INTO DB2ADMIN.ZXTABLES COPY YES

  4. load IXF类型文件到多分区数据库

  partitioned db configmode load_only_verify_part part_file_location

  当数据在2个不同数量节点的数据库之间移动,如果还想使用load来进行IXF的数据装载就比较棘手了,当时查遍IBM的官方文档均无所获,正郁郁不安时,狼出现了,给支了一招,现分享给大家。

  首先,把ixf文件复制和分区数量相同的文件,并后缀.000(分区号),

  比如,2个分区,那么我需要把原来的a.ixf,拷贝2个,并命名为a.ixf.000以及a.ixf.001

  然后,load from staff.ixf of ixf replace into t1 partitioned db configmode load_only_verify_part part_file_location xxxx(part_file_location为a.ixf.000所在的目录),当然如果在unix下的话,可以通过ln –s 来做一个连接也行。

  5. 对于自增序列(GENERATED ALWAYS)

  MODIFIED BY IDENTITYOVERRIDE:此参数可以理解为,采用文件load文件中的自增值做为表自增序列的值,这样就能保证对于自增序列有业务意义,或者关联逻辑(主外键关联)的情况下保证数据的一致,个人对此命令屡试不爽

  例: LOAD CLIENT FROM 'F:s1.del' OF DEL MODIFIED BY IDENTITYOVERRIDE INSERT INTO DB2ADMIN.ztables;

  6. 对于自增序列(GENERATED by default)

  GENERATED by default可以直接通过一般的导入方式加载数据,不过有时候会有一点点小问题,自增序列没有进行分配,也就是说,原来表有50条记录,自增序列的下一次分配值为50,当你已经导入了1000条记录进去了,然后发现自增序列的下一次分配值还是为50,这种事不经常发生,但是偶尔会发生一次,比较郁闷的是,当表继续插入数据的时候,下一次分配就会发生冲突,尤其是如果自增建为主键的时候,会违反唯一约束。

  解决办法:首先找到这个序列分配的最大值,select max(id) from tablea;

  然后用下边这个命令,alter table tablea alter column restart with max(id)+1

  7.ROWCOUNT/WARNINGCOUNT

  这个同IMPORT

  8.terminate,restart

  如果load的过程中出了点故障,比如连接被force掉了等,这时连接查询表数据会报错SQL0668N,原因码3,这时可以通过带有terminate的load命令来进行处理!

  LOAD CLIENT FROM 'F:s1.del' OF DEL terminate INTO DB2ADMIN.ztables;

  9. set integrity 命令

  如果表上有约束,那么给表load数据以后,一般连接表的时候都会报错,SQL0668N,原因码1,这说明该表处于“设置完整性暂挂无访问”状态,那么需要如下命令来操作。

  Set integrity for schema.tablename immediate checked;

  10.提高导入导出速度的数据库参数

  CONFIGURATION:应用程序堆大小,该参数指示可由Backup,restore,load及装入恢复应用程序同事使用的最大内存量,看帖子上有介绍,这个值可以设置为10000*cpu数量。

风中追梦郎 2010-07-19
  • 打赏
  • 举报
回复
to以上各位大大:
表结构不一致的话,怎么用这个语句就可以呢?
"insert into b select * from A"
云飞扬77 2010-07-19
  • 打赏
  • 举报
回复
表结构不统一啊
zhaojianmi1 2010-07-18
  • 打赏
  • 举报
回复
好多字段不一样阿
zhaojianmi1 2010-07-18
  • 打赏
  • 举报
回复
两个表不一样,字段长度不一样,你确认一下目标表的长度是不是6
maitianhust 2010-07-17
  • 打赏
  • 举报
回复
the data is longer than the target database column

列字段和数据字段长度不一样。
风中追梦郎 2010-07-16
  • 打赏
  • 举报
回复
SQL3114W Some data following "","" in row "6" and column "1" was not loaded.
SQL3125W The character data in row "6" and column "3" was truncated because
the data is longer than the target database column.
SQL3129W The date, time, or timestamp field containing "" "" in row "6"
and column "8" was padded with blanks.
SQL3119W The field value in row "6" and column "24" cannot be converted to an
INTEGER value. A null was loaded.
SQL3128W The field containing "+0000000000106.77" in row "6" and column "27"
was truncated into a DATE field because the data is longer than the database
column.
这是import时报的错误,有高人指点一下吗,把已经导出的del文件转换成ixf格式?
风中追梦郎 2010-07-16
  • 打赏
  • 举报
回复
我用"insert into b select * from A"
就可以做.
用ixf格式的也没问题,关键问题是,我已经把表A清空了.现在只剩下.del文件了,杯具.
zhaojianmi1 2010-07-16
  • 打赏
  • 举报
回复
报错信息是什么

5,889

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧