DB2 移动数据总结一

移动工具有
import/export
load

db2look/db2move

使用数据移动的场景及问题
1.在对某表做大量修改时,特别是CR时,检查数据库的备份记录,是否有最近的备份文件,如果有,请客户确认如果出现问题是否可用;另一种,就是做数据的临时备份,这时我们需要DataMovement Tools
如何评估表中的数据量大小

如何方便的查看表中是否含有标识列
db2 "select distinct identity from syscat.columns where tabname = ‘XXXX‘"

如何方便的查看表中是否含有lob列
db2 "select TABSCHEMA concat ‘.‘||TABNAME from syscat.columns where typename like ‘%LOB‘ and TABSCHEMA not like ‘%IBM%‘ and not like ‘SYS%‘" | grep -i xxxxx

另一种方式是查看表的定义
db2look -d db_name -t t1 t2 -e -o db2look_tables.out;cat db2look_tables.out
e.g. db2look -d sample -t dbv97fp7.employee   -e
NOTE:如果在-t选项做了某表的alias,那么将不会导出数据

2. 在跨操作系统情况下,恢复数据库,在这种情况下,无法使用offline 或online 备份文件进行数据库恢复
似乎export 无法完成这样的工作啊,因为语法上是需要select 语句导出数据的,该如何实现的呢?
db2look+db2move

3. 表数据迁移,有时,客户需要将一个表中的数据迁移到另一个表中,其中表的定义可能不一致的

标识列:
NOTE:标识列导入导出的注意事项
1) 在原数据中没有标识列的情况下导入到含有标识列的表
A B C  --->  A B i1 C
NOTE:这是原数据中的列数小于目标表中的列数的特殊情况

2)在原数据中带有标识列的情况下导入到含有标识列的表
A B i1 C ---> A B i1 C

3)目标表带有 generated always 的标识列,不需要导入文件中的标识列值

4)目标表带有 generated always 的标识列,需要使用载入原数据中标识列的值
NOTE:普通的identity能否使用identityoverride 文件修饰符

5)导入文件中含有标识列,但是表中不包含标识列
NOTE:这是目标表列数小于原数据列数的特例

生成列:
导入注意事项:
没有使用文件类型修饰符时,将会按照如下规则进行
1)当数据文件中相应的行缺少生成列的值或提供了NULL值时,将创建生成列值;
直接导入将导致生成列后的列的值,无法导入必须使用如下方法
2)如果为生成列提供了非空值,那么将拒绝该行(SQL3550W)

生成列与标识列有类似的问题
导入和导出生成列同样有类似与标识列的文件修饰符 generatedignore,generatedmissing,generatedoverride
NOTE:使用load 和文件修饰符 generatedoverride 会出现如下问题,该如何处理
SQL0668N  Operation not allowed for reason code "1" on table "DBV97FP7.TBGE".SQLSTATE=57016 ????

3)如果为不可空生成列创建了NULL值,例如如果将列定义为两个表列之和,但这两个表列的文件中含有NULL值,那么会发生这种情况,那么将拒绝整行(SQL0407N)

大对象的导入导出:
导出大对象(LOB)列的表时,默认操作是对每个LOB值导出最多32KB,以便将其与列数据的余下部分放在同一个文件中。如果要导出超过32KB的LOB值,那么应将LOB数据写至单独文件以便截断。
要指定应将LOB写至自己的文件,可以使用lobsinfile文件修饰符。此文件类型修饰符指示EXPORT使用程序将LOB数据放置在LOBS TO 子句指定的目录中。使用LOBS TO 或LOBFILE会隐式激活lobsinfile文件类型修饰符。
默认情况下,LOB值与导出的关系数据将写至同一路径。如果LOBS TO 选项指定了一个或多个路径,那么EXPORT使用程序将循环使用这些LOB路径,以便每个成功的LOB值写入相应的LOB文件。
可以使用lobfile选项对输出LOB文件指定名称。如果指定了LOBFILE选项,那么LOBFILENAME的格式为lobfilespecxxx.lob,其中lobfilespec是为LOBFILE选项指定的值,而xxx是 EXPORT使用程序生存的lob文件的序号,否则,lobfilename的格式为exportfilename.xxx.lob,其中exportfilename是为EXPORT命令指定的已输出文件格式名称,而xxx是export实用程序输出的lob文件的序列号
默认情况下,多个LOB将写至单个文件,如果将各个LOB存储在不同的文件中,可以使用lobsinfepfiles文件修饰符已将每个LOB写至单独的文件

空值:
对于空值的处理,往往会有很多问题,比如
1)我们在导入列是空值时,完成插入一个默认值,而非空,避免存在列有非空限制,导致数据导入失败;
2)对于变成字符列来说 ,对于导入的数据,往往希望将字符尾部的空格自动消除掉,但是事与愿违,导入的数据将会保留尾部的null or blank;
3)数据库默认情况下,会消除字符串前面的空格,有时候,我们希望保留,比如是名字的前面

对于null处理数据库提供了如下文件修饰符 nullindchar striptnulls  striptblanks  keepblanks

 

定界符:
什么是定界符?
定界符包括哪些类型,分别什么意思?  record delimiter, character delimiter, column delimiter

对于定界符的作用,往往是避免数据库识别错误文件数据。
1)我们的数据,有时候需要导入的数据如下
I am 6" tall
数据中不包含字符定界符,""是数据而不是定界符的情况;  ----这里的两种处理方式(取消字符定界符,修改字符定界符为其他)
2)我们想导出的数据不包含字符定界符;
3)字符定界符““与数据冲突,想改变字符定界符;
4)"Vincent <row delimiter> is a manager", <row delimiter>
"Vincent
is a manager"
"Bob
is a employee"
导入的数据库中;

数据库提供如下的文件修饰符:nodoubledel,
chardel,coldel,delprioritychar
双字符定界符
""  ---解释一下双字符定界符
nodoubledel
字符定界符,列定界符,行定界符(记录定界符)

PC/IXF:

日期格式:
在不同平台和系统上进行数据移动时,日期格式容易出问题。
这几个文件修饰符仅用于ASC和DEL格式
dateformat
datesiso
timeformat
timestampformat

时间: 2024-08-05 16:43:13

DB2 移动数据总结一的相关文章

[db2数据库数据同步解决方案]DB2数据库数据同步更新方法及设备与流程

技术总结 本发明实施例提供了DB2数据库数据同步更新方法及设备.所述方法包括:根据待同步更新表创建数据详细地址存储列,对待同步更新表上S锁,获取源端DB2数据库当前的日志序列号LSN作为待同步更新表的起始LSN,释放S锁:获取待同步更新表的结果集,将结果集发送至目标端数据库入库,获取源端DB2数据库当前LSN作为待同步更新表的结束LSN:接收源端同步更新服务发送的初始化数据,在目标端数据库将ROWID插入数据详细地址存储列,初始化待同步更新表的数据:启动数据实时同步更新服务,将源端DB2数据库的

DB2导入数据时乱码问题

1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入 LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016 ) 解决办法:set integrity for xxxxxx immediate checked 2.表锁定(原因码为7) 解决办法:reorg table xxxx 3.去重 select distinct a.column from table1 as a inner join table2 as b

数据迁移实战:基于Kettle的Mysql到DB2的数据迁移

From:https://my.oschina.net/simpleton/blog/525675 一.什么是ETL ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.ETL一词较常用在数据仓库,但其对象并不限于数据仓库. 二.Kettle简单说明 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定

db2导出数据并导入hive临时表中

操作: 1.从db2 中导出数据到txt中 2.修改文件中的分隔符为":" 3.在hive中新建表(建表时需要制定分隔符) 4.导入数据 -------- 1.从db2 中导出数据到txt中 db2 -x "select col1,col2,col3  from tbl_name where xxx with ur">filename.txt 2.修改文件中的分隔符为":" cat filename.txt | awk '{print $1

db2插入数据失败

使用db2,手动insert语句的时候,报如下错误: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=2 . 开始在网上找解决方法,以下网上的解决方法总结(事实上并没有解决我的问题): 第一种解决: 1.查了下,大概意思是违反了唯一性约束啊! 2.不过,我db2 describe table XX后发现这个表只有ID是不能为空的啊! 3.最后,直接写了条SQL在命令行执行,同样的错和代码 最后,我查了下表的索引,发现建了个组合索引,才恍

批处理数据--db2备份数据

如果要插入数据,前提先根据主键删除记录,然后在插入. 批处理包含两个必要文件 init.bat和start.bat 文档内容如下 init.bat内容如下 @echo ondb2 connect to cashman user db2inst1 using '1qaz!QAZ'db2 set schema db2inst1db2 [email protected] -vf update.sql>log.txt   //将执行结果输出到log.txtdb2 [email protected] -v

DB2更改数据文件路径

问题描述: DB2数据库的数据文件默认路径为/home/db2inst1/db2inst1/NODE00000下 warehous数据库的文件就在以上路径下 由于此磁盘分区的空间较小,要把其改为/data下 解决: 1.停止DB2 su - db2inst1 db2stop force 2.复制数据库到/data 在root用户下 cd /data mkdir warehous chown -R db2inst1:db2iadm1 warehous su - db2inst1 在/home/db

Sqoop从DB2导出数据出错:ERRORCODE=-4499, SQLSTATE=08001

Sqoop执行命令: ./sqoop import --connect "jdbc:db2://10.105.4.55:50001/SCCRM55" --username db2inst1 --password db2opr2010 --table WF_4G_BILLDETAIL_NEW_20140717 --fetch-size 1000 -m 1 --target-dir /ext/ods/ODS_RPT_DAY_DET/20140717_1 --fields-terminate

sqoop从DB2迁移数据到HDFS

Sqoop import job failed to read data from DB2 database which has UTF8 encoding. Essentially, even the data cannot be read at DB2 with select queries as there are some characters which are not in UTF8. Sqoop job will throw an error similar to below: E