【DB2】逻辑导出导入注意事项
DB2异构操作系统之间迁移需选择逻辑备份恢复
导出环节
1、设置字符集,源端创建导出目录,并导出数据库DDL
db2set db2codepage=1208
db2stop force
db2start
db2look -d YS-e -l -o -createdb db2look_YS.sql
导出文件:db2look_YS.sql
–详细参数请参考db2look用法,这里导出建库语句,以防目标端和源端字符集不一致导致乱码
2、导出数据
nohup db2move YS export -l . &
导出数据过程比较慢(跟数据量和磁盘IO有关系),建议放后台执行
导出文件如下:
-rwxrwxr-x 1 ysinst db2iadm1 1465 2月 13 16:40 tab459.msg
-rwxrwxr-x 1 ysinst db2iadm1 1465 2月 13 16:40 tab460.msg
-rwxrwxr-x 1 ysinst db2iadm1 1724 2月 13 16:40 tab461.msg
-rwxrwxr-x 1 ysinst db2iadm1 5170 2月 13 16:41 tab462.msg
-rwxrwxr-x 1 ysinst db2iadm1 1465 2月 13 16:41 tab463.msg
-rw------- 1 ysinst db2iadm1 84352 2月 13 16:42 nohup.out
-rw-r--r-- 1 ysinst db2iadm1 84288 2月 13 16:42 LOAD.out
3、将导出文件传输至目标端
这里直接将导出文件scp到目标端即可
导入环节
1.首先根据需求,看是否要删除库
如果不删除,就直接进行第三步,如果要删除,就需要执行db2 drop database YS
(尽量删除库,否则在导入同名表时会删除原表数据,删除操作为随机IO,速度极慢,影响效率)
在删除前需要注意,看备份集中有无建库语句,如果没有,则要先导出目标端建库语句,执行db2look -d YS-e -l -o -createdb db2look_YS.sql
,然后再drop
如果drop失败,需要先执行db2 force application all
停掉所有连接,再drop,如果还是报错就要多试几遍,或者直接db2 stop force
停库卸载
删掉库之后执行导出的建库语句中的内容,例如下面的内容,注意文件位置
CREATE DATABASE YSAUTOMATIC STORAGE YESON '/hxdb/data/ys'DBPATH ON '/hxdb/log/ys/'USING CODESET utf-8 TERRITORY cnCOLLATE USING IDENTITYPAGESIZE 32768DFT_EXTENT_SZ 32CATALOG TABLESPACE MANAGED BY AUTOMATIC STORAGEEXTENTSIZE 4AUTORESIZE YESINITIALSIZE 32 MMAXSIZE NONETEMPORARY TABLESPACE MANAGED BY AUTOMATIC STORAGEEXTENTSIZE 32FILE SYSTEM CACHINGUSER TABLESPACE MANAGED BY AUTOMATIC STORAGEEXTENTSIZE 32AUTORESIZE YESINITIALSIZE 32 MMAXSIZE NONE
2.在导出建库语句和删库后,重新创建新库
然后执行建表SQL,设置下字符集,保证源端和目标端字符集一致
db2set db2codepage=1208
db2stop force
db2start
db2 -tvf db2look_ys.sql > db2look_ys.out
3.查看并修改缓冲池(防止缓冲池过大导致OOM)
查看: db2pd -d ys -buffer
修改: ALTER BUFFERPOOL bpname SIZE newsize;
4 . 查看并设置事务日志,防止表过大导致事务日志满问题
查看: db2 get db cfg for ys |grep LOG
修改: db2 update db cfg for ys using LOGFILESIZ 100000
db2 update db cfg for ys using LOGPRIMARY 50
LOGFILESIZ设置文件大小,LOGPRIMARY设置文件数量,具体设置多大,需要根据导入的文件大小去估算,例如有个导入文件160G,我们可以设置为160*1024*1024/4/LOGPRIMARY
如果LOGPRIMARY设置的是10,那么我们的LOGFILESIZ就可以设置为60*1024*1024/4/10=4194304 ,
即db2 update db cfg for ys using LOGFILESIZ 4194304
实际LOGFILESIZE最大值为100w左右,我们只能将LOGFILESIZE设置为最大值,然后去调整LOGPRIMARY的个数
调整完bufferpool和事务日志就可以执行导数了
5、导入表数据
nohup db2move YS load -l . &
命令会生成nohup.out,我们可以实时监控,并在导入完成后进行检查
6、检查导入日志,处理报错
举例:
检索nohup.out中的ERROR、WARNING关键字
错误1:
SQL3050W Conversions on the data will be made between the IXF file code page
"819" and the application code page "1208".错误2:
SQL0964C The transaction log for the database is full.
根据报错1可看到,由于源端数据库codepage是819,目标端codepage是1208,导致数据中文乱码,819代表latin字符集,1208代表utf-8字符集
根据报错2可看到,表过大导致事务日志满,从而报错
7、针对报错的表重新导入
db2 "load from tab297.ixf of ixf restart into YS1.TEST_1 "
8.查看表数据和表数据量
db2 "select count(*) from syscat.tables where tabschema in ('YS1','YS2') "
db2 -x "select 'select count(*) from '||trim(tabschema)||'.'||trim(tabname)||';' from syscat.tables where tabschema in ('YS1','YS2')" >ts_tables.sql