互联网服务db2move

DB2数据导入导出全解

DB2数据导入导出

1 Export 数据导出
语法:export to filename of filetype modified by filetype-mod messages message-file select-statement
filetype:支持del|wsf|ixf等格式,del为ASCII字符隔离格式,wsf工作表格格式(不知道用什么打开),ixf夸平台的二进制格式
filetype-mod:文件类型模式(下面列举的只针对del格式,其中codepage可用于ixf格式)

chardelx : 分隔符,默认为("),这里指定x为分隔符

codepage=x : 设置代码页,1208为UTF-8编码格式

coldelx  : 列分隔符,默认为(,),这里指定为x

nochardel: 列没有包裹字符,默认为("")

timestampformat="x" : 设置日期数据格式,YYYY/MM/DD HH:MM:SS.UUUUUU


2 Import数据导入
格式:import from filename of filetype modified by filetype-mod allow no access|allow write access commitcount n|automatic restartcount n|skipcount rowcount n warningcount n notimeout message message-file insert|insert_update|replace|replace_create into table-name
filetype:同export中的filetype
filetype-mod:同export中的filetype
访问权限:allow no acces默认,不允许访问,导入加X排它锁,脱机模式(目标表脱机)运行import。

   allow write access  允许写,导入加IX锁,在线模式运行import,允许并发(concurrent)读写。
commitcount:提交行数,多少行记录做一次提交动作,使用该参数可以加快import的速度,automatic自动。
restartcount:重启import从多少行记录开始 n+1
skipcount:跳过的行数,n+1开始,与restartcount互斥
warningcount:有多少警告之后停止import操作
notimeout:开始import操作等待x锁时不会超时
insert|insert_update|replace:

insert : 单纯插入数据

insert_update : 插入或更新数据,根据主键pk来判断

replace : 先删除存在的表数据(truncate方式,快速)再导入新数据,不改变表和索引的定义,前提是表必须存在。


3 Load 数据加载
语法:load client from filename of filetype modified by file-type-mode savecount n rowcount n warningcount n messages message-file insert|replace keepdictionary|resetdictionary|restart|terminate into table-name
copy no|copy yes to directory|nonrecoverable without prompting data buffer buffer-size allow no access|allow read access set integrity pending cascade immediate|deferred lock with force
client : 指定从远程客户端调用
filetype:同import中的filetype
filetype-mode:同import中的filetype-mode
savecount : 指定Load建立一致点的页数,默认为0,建立后在Load query时能查询到

db2 "load query table table-name"会提示"SQL3519W  开始装入一致点。输入记录数="
rowcount : 指定Load多少条记录
warningcount: 指定多少警告后结束load
messages : load的消息输出
insert:load只插入数据,不改变存在的数据
replace:插入的同时也替换 keepdictionary
terminate:结束load操作
restart:重新启动load操作
copy no : load结束后表空间标记为备份暂挂状态,此时数据可以读,DML操作无效。归档模式下的默认值。
copy yes: 指定load的数据拷贝将被保存到image中
nonrecoverable:load事务标记为不可恢复,做操作的表只能drop或从备份中恢复,在循环日志模式下的默认值。
data buffer:指定4K的页数用于数据转换的缓冲区
lock with force:不需等待,可以强制获取锁。

查询表LOAD操作的状态:Load query table table-name to message-file

load:导入数据,功能和import基本相同。支持以上说的4种格式。Load最大的缺点是变化没有记录日志,不能前滚恢复。
Load的工作步骤:Load(装载数据到表,收集信息、索引key集合和保存一致点)-->Build(根据Load阶段收集的信息和索引key集合建立索引)-->Delete(删除表中违反主键约束和唯一性约束的数据,把这些数据放到Exception表中)-->Index Copy(将索引从系统临时表空间拷贝到目标表空间)

db2 "list utilities show detail" 查看Load的具体情况
在测试的过程中我只看到setup和load两个阶段,可能是load太快了吧。

Load各阶段的状态:
1)载入挂起load pendding,在Load阶段发生错误,导致表空间处于载入挂起
解决:1)纠正错误后重新载入,将replace或insert换成restart。将从失败处重新开始装载操作。

2)如果前面调用用了replace,则再使用replace做load。

3)用terminate选项终止load操作。

4)DBA撤消并重新建立表空间

5)从一个备份中恢复表空间(归档日志下才能)。
2)删除挂起delete pendding,在Delete阶段发生错误
3)备份挂起backup pendding,使用copy no后表空间处于此状态,做一下全备或者备份该表空间即可解除
4)检查挂起check pendding,当表上存在主键或唯一键之外的约束时,Load完成后该表处于此状态
解除装入数据时,发生的检查挂起: SET INTEGRITY FOR TABLE-NAME CHECK IMMEDIATE UNCHECKED;
命令只对数据通过约束检查的表有效,如果执行还不能解除,有必要检查数据的完整性,是否不符合约束条件,并试图重新整理数据,再执行装入操作。

load和import的不同:
1、load的目标表必须存在,而import不必
2、load并不创建索引,只是在原来索引的基础上追加数据
3、最大差别在于性能差别,import每次插入一条,每行都要进行一次限制检查,日志用来记录变化,而load插入则快的多,每次读取数据构造页,然后直接输入到数据库。
插入完页后,索引将重新建立,违反主键和唯一键限制的记录将被删除并保存到另一个扩展表中。
注:load技巧使用:大数据量删除。  load from a.del of del replace into table

IMPORT导入以记录(data record)为单位,对数据进行合法检验,数据修改记日志。LOAD载入是以数据页(data page)为单位,不对数据进行合法检验。所以LOAD在导入性能上优于IMPORT。

DB2使用export导出的del文本中,由于有字段有换行符,load装入数据时,默认以一行为一条记录,这样数据就有问题了。
解决方法如下:
MODIFIED BY DELPRIORITYCHAR
DB2默认load优先级策略为:record delimiter, character delimiter, column delimiter,这样record delimiter得优先级最高,所以原始文件如果有换行的话load就认为是新的record,如果用户在某些情况下行里面包含了换行符(比如论坛里面的一条帖子,不可能把换行符删掉的),就必须用delprioritychar改变默认的优先级别,确保""之间的数据不管有没有换行符都被认为是同一条记录
例:LOAD FROM TAB.DEL OF DEL MODIFIED BY DELPRIORITYCHAR  INSERT INTO TAB
另:用IXF不会出现此问题。

4 SET INTEGRITY 设置完整性暂挂

C:>db2 "create table newstaff like staff in ts_user_data index in ts_user_index"
C:>db2 "alter table newstaff add constraint chk_newstaff_dept check(dept<84)"
C:>db2 "export to d:540staff.del of del select * from staff"
C:>db2 "load from d:540staff.del of del insert into newstaff"
C:>db2 "select count(1) from newstaff"
SQL0668N  不允许对表 "540.NEWSTAFF" 执行操作,原因码为 "1"。  SQLSTATE=57016
C:>db2 "list tablespaces show detail"
发现此时表newstaff所在的表空间ts_user_data处理备份暂挂状态
C:>db2 ? 57016
SQLSTATE 57016: 因为表不活动,所以不能对其进行访问。
C:>db2 "set integrity for newstaff immediate checked"
SQL3603N  通过 SET INTEGRITY 语句来检查数据处理时,发现涉及名为"540.NEWSTAFF.CHK_NEWSTAFF_DEPT" 的约束或唯一索引的完整性违例。  SQLSTATE=23514
从这里可以看出是LOAD进了违反约束的数据
C:>db2 "backup db sample tablesapce ts_user_data to d:540"
解除表空间的备份暂挂状态
C:>db2 "connect to sample"
备份后需要重新连接
C:>db2 "list tablespaces show detail"
再次查看表空间是正常状态
C:>db2 "set integrity for newstaff check immediate unchecked"
解除表的检查挂起状态
C:>db2 "select count(1) from newstaff"
到此表newstaff可以访问了。

SQL0668N,错误代码1:可能是由于有自增的主外键导致的导入错误
解决方案:
C:>db2 "set integrity for newstaff immediate checked force generated"
有些情况可以使用下列语句恢复
C:>db2 "set integrity for newstaff foreign key immediate unchecked"
C:>db2 "set integrity for newstaff check immediate unchecked"

SQL0668N,错误代码3:装入暂挂
1)备份该表所在的表空间,然后重新恢复表空间
backup db sample tablespace ts_user_data ;
restore db sample tablespace ts_user_data online taken at
rollforward db sample to end of logs and complete tablespace ts_user_data online
2)重新load数据,或者load一张空表,暂挂状态就会解除
建立一个空文件,这样不用删除表就可以把锁的表清空了
load from blank.del of del terminate into newstaff;
3)备份一下数据库,用于解除表空间的backup pending状态,此状态下不能查询或更新表
backup db sample user db2admin using db2admin tablespace (ts_user_data) to .
restore db sample tablespace(ts_user_data) online from
rollforward db sample to end of logs and complete tablespace (ts_user_data) online

5 db2move
语法:db2move dbname action option
action:export 导出|import 导入|load 装载|copy 数据库间数据复制
option:

-tc table-definers : 只适用export,指定表定义者

-tn table-names : 只适用export|copy,指定表名,默认是所有表名

-sn schema-names : 只适用于export,指定模式名,默认为所有模式名

-ts tablespace-names : 只适用于export,指定表空间名称

-tf filename : 只适用于export,采用外部文件列表的方式指定导出数据的表名,表之间换行

-io import-option : 导入选项,insert|insert_update|replace|create|replace_create

-lo load-options : 装载选项,insert|replace,默认为insert

-l lobpaths : 只适用于export|import,工作目录,默认为当前目录

-u userid : 指定用户名

-p password : 指定密码

-aw : 允许警告

-co copy : 数据复制


target_db dbname user userid using password : 指定目标数据库名和连接账号


mode : ddl_and_load|ddl_only|load_only


schema_map : 允许用户更改模式名,使用如:"schema_map ((s1,t1),(s2,t2))"


tablespace_map : 更换表空间,使用如:"tablespace_map ((TS1, TS2),(TS3, TS4))"



例:
db2move dbsrc COPY -sn schema1 -co TARGET_DB dbtgt USER myuser1 USING mypass1
db2move dbsrc COPY -sn schema1 -co TARGET_DB dbtgt USER myuser1 USING mypass1 SCHEMA_MAP ((schema1,newschema1)) TABLESPACE_MAP ((ts1,ts2), SYS_ANY))

注意事例:表中含generated always identity column,在插入数据时插不进去

db2move dbname export
db2move dbname import
会生成db2move.lst、EXPORT.out、tabn.ixf和tabn.msg
db2move.lst : 成功导出表列表,包含表名列表与tabn的关系描述
EXPORT.out : 不用说就是导出日志
tabn.ixf : 采用PC/IXF格式的数据库表数据,包含表结构、索引和表数据
tabn.msg : 某个表的导出情况

举例:保留最近10天的数据
db2move_data.bat  [批处理]
----------------------------------
cd /d F:Dispatch540db2move
rd /s/q data10
rename data09 data10
rename data08 data09
rename data07 data08
rename data06 data07
rename data05 data06
rename data04 data05
rename data03 data04
rename data02 data03
rename data01 data02
mkdir data01
cd data01
db2move infodms export -aw

在192.168.3.247的590张表使用export和db2move导出数据比较:
db2move.bat  15:16->15:22 用时6分钟,3.36GB大小,使用winrar压缩成rar格式191MB
export.bat   15:42->15:48 用时不到6分钟,2.47GB大小,使用winrar压缩成rar格式,使用winrar压缩成rar格式是187MB


6 实验专题

6.1 实验:Load是否影响数据库恢复
1. 在20120401110939时做了online全备 include logs
使用日志S0000003.LOG~S0000003.LOG
2. 做load操作时日志使用S0000004.LOG,做完load操作后,手工切换到S0000005.LOG
3. 后面做一些操作,日志切换到S0000006.LOG
4. 删除数据库,使用20120401110939恢复,并使用S0000003.LOG~S0000006.LOG来前滚
最终结果是:复原暂挂 0x0100

6.2 实验:不记日志DML操作影响数据库恢复
1. 在20120401110939时做了online全备 include logs
使用日志S0000003.LOG~S0000003.LOG
2. 使用上面备份恢复,当前日志为S0000004.LOG
tab1:insert+手工切换,活动日志为S0000006.LOG
tab2:insert+手工切换,活动日志为S0000008.LOG
tab3:insert+手工切换,活动日志为S0000010.LOG
这样表tab1、tab2和tab3都有记录
3. 不记日志删除
db2 -t +c
----------------------

alter table tab1 activate not logged initially;

delete from tab1;

alter table tab3 activate not logged initially;

delete from tab3;
操作之后,当前活动日志为S0000012.LOG
4. 删除数据库利用20120401110939的全备和数据库日志S0000003.LOG~S0000012.LOG,发现做过不记日志方式的表状态为不可用。
不清楚是否能通过800电话提供密码之后强制将表置为可用。
最终结果:做不记日志DML操作的表不可用。
参与14

9同行回答

smallbeesmallbee商业智能工程师新科技
软件开发 · 2015-11-17
浏览3992
zymh_zyzymh_zyIT顾问国内某公司
总结得不错。。显示全部

总结得不错。。

收起
IT咨询服务 · 2015-11-17
浏览3981
ptchsirptchsir软件开发工程师artech
学习了显示全部
学习了收起
软件开发 · 2014-05-02
浏览4073
qaz123wsxqaz123wsx软件开发工程师qaz123wsx
好东西,好好研究一下。显示全部
好东西,好好研究一下。收起
软件开发 · 2013-10-23
浏览3869
sukaisukai软件开发工程师北京高阳金信信息技术有限公司
正在研究,谢谢!显示全部
正在研究,谢谢!收起
软件开发 · 2013-10-22
浏览3911
vtudivvtudiv研发工程师钢信软件
写的很不错,很详细,收藏了显示全部
写的很不错,很详细,收藏了收起
软件开发 · 2013-09-29
浏览3977
db2haodbdb2haodb数据库开发工程师IGI
写的很不错,很详细,收藏了显示全部
写的很不错,很详细,收藏了收起
互联网服务 · 2013-08-02
浏览3912
33lyl33lyl数据库管理员榕基软件
这东西蛮好的,,支持一下显示全部
这东西蛮好的,,支持一下收起
互联网服务 · 2012-08-03
浏览4006
王永科王永科数据库管理员天网软件
嗯 总结的挺细致的 很好 参考并做了实验!!!!显示全部
嗯 总结的挺细致的 很好 参考并做了实验!!!!收起
互联网服务 · 2012-07-25
浏览3937

提问者

ppjava2009
系统工程师用友汽车信息科技(上海)有限公司

相关问题

问题状态

  • 发布时间:2012-04-19
  • 关注会员:4 人
  • 问题浏览:28836
  • 最近回答:2015-11-17
  • X社区推广