设为首页 收藏本站
查看: 1610|回复: 0

[经验分享] Linux 下的 DB2数据库的迁移

[复制链接]

尚未签到

发表于 2016-11-17 10:23:25 | 显示全部楼层 |阅读模式
  文章出自:http://macrozeng.itpub.net/post/71/58248
  前言:
  DB2 Universal Database™(DB2 UDB) 有一对非常有用的工具,可以帮助您实现这种跨平台的备份与恢复功能。 db2move 工具利用了 DB2 的数据移动工具(export 和 import 或 load)来移动数据库表。然而,由于数据库的内容远远不止于用户表,因此您需要使用其他方法在不同的数据库之间迁移其他数据库对象,例如约束、触发器、索引、序列、表空间、缓冲池等。这就是 db2look工具出现的原因。使用这个工具,您可以在源数据库中捕获到定义这些对象使用的数据定义语言(DDL),并在目标数据库中使用这些数据定义语言重新创建这些对象。


  1、 环境说明:
  迁移的DB2 数据库的名字叫 sample , SCHEMA也是oatest ,用户名是 oatest

    2、 导出步骤:
  1) 建立新目录,如果是在 linux 下要注意目录的权限问题,目录应该可以被 db2inst1 用户写访问
[db2inst1@devsvr2 db2inst1]$ pwd

/home/db2inst1

[db2inst1@devsvr2 db2inst1]$ mkdir oatest0303

[db2inst1@devsvr2 db2inst1]$ ls

db2inst1 db2test Desktop oatest0303 sqllib


    2) 进入该目录
  
[db2inst1@devsvr2 db2inst1]$ cd oatest0303/

[db2inst1@devsvr2 oatest0303]$


  
  3) 用数据库抽取工具 db2look 导出数据库结构
  主要命令
db2look -d sample -e -z oatest -l -o oatest.sql


  
[db2inst1@devsvr2 oatest0303]$ db2look -d sample -e -z oatest -l -o oatest.sql

-- 未指定用户标识,db2look 试图使用环境变量 USER

-- USER 是: DB2INST1

-- 指定的模式为: OATEST

-- 创建表的 DDL

-- 联合部分的模式名被忽略

-- 输出被发送到文件: oatest.sql


  脚本中包括建立 bufferpool 以及tablespace的 DDL 语句
  
  4) 用 db2move 工具导出数据库数据
  主要命令
  db2move sample export

  
[db2inst1@devsvr2 oatest0303]$ db2move sample export


***** DB2MOVE *****


Action: EXPORT


Start time: Sun Mar 5 11:00:52 2006



Connecting to database SAMPLE ... successful! Server: DB2 Common Server V8.2.0

EXPORT: 0 rows from table "OATEST "."ATTACHFILE"

EXPORT: 0 rows from table "OATEST "."BASE"

……


  
  5) 打包压缩该目录 oatest0303/
  主要命令:
  tar zcvf oatest0303.tar.gz oatest0303/

  
[db2inst1@devsvr2 oatest0303]$ cd ..

[db2inst1@devsvr2 db2inst1]$ tar zcvf oatest0303.tar.gz oatest0303/

oatest0303/

oatest0303/oatest.sql

oatest0303/EXPORT.out

oatest0303/db2move.lst

oatest0303/tab1.msg

oatest0303/tab1.ixf

……


  

    3、 导入步骤
  1) 解压
  主要命令:
tar zxfv oatest0303.tar.gz

[db2inst1@devsvr2 db2inst1]$ tar zxfv oatest0303.tar.gz

oatest0303/

oatest0303/oatest.sql

oatest0303/EXPORT.out

oatest0303/db2move.lst

……




    2) 建立新数据库 db2 create db sample
  主要命令:
db2 create db sample

[db2inst1@devsvr2 db2inst1]$ db2 create db sample

DB20000I CREATE DATABASE 命令成功完成。




    3) 执行 oatest.sql 脚本建立数据库
  主要命令:
db2 -tvf oatest.sql

[db2inst1@devsvr2 db2inst1]$ cd oatest0303

[db2inst1@devsvr2 oatest0303]$ db2 -tvf oatest.sql

……




    4) 执行 db2move 导入数据
  主要命令:
db2move sample load


  
[db2inst1@devsvr2 oatest0303]$ db2move sample load

……

* LOAD: table "OATEST "."UM_USER"

-Rows read: 1529

-Loaded: 1529

-Rejected: 0

-Deleted: 0

-Committed: 1529



Disconnecting from database ... successful!

End time: Sun Mar 5 10:24:22 2006


  5) 检查一致性
  主要命令:
db2 set integrity for oatest.UM_USER immediate checked


  
[db2inst1@devsvr2 oatest0303]$ db2 connect to sample


数据库连接信息


数据库服务器 = DB2/LINUX 8.2.0

SQL 授权标识 = DB2INST1

本地数据库别名 = SAMPLE


[db2inst1@devsvr2 oatest0303]$ db2 "select count(*) from
oatest.um_user"


1

-----------

SQL0668N 由于表 "OATEST.UM_USER" 上的原因码 "1",所以不允许操作。

SQLSTATE=57016

[db2inst1@devsvr2 oatest0303]$ db2 set integrity for oatest.UM_USER
immediate checked

DB20000I SQL 命令成功完成。

[db2inst1@devsvr2 oatest0303]$ db2 "select count(*) from
oatest.um_user"


1

-----------

1529


1 条记录已选择。



  利用 sql 语句得到要检查的表的执行语句
  主要命令:
  db2 "select 'db2 set integrity for oatest.'||TABNAME||' immediate checked' from syscat.tables where TABSCHEMA='OATEST' and STATUS='C'"

  
[db2inst1@devsvr2 oatest0303]$ db2 "select 'db2 set
integrity for oatest.'||TABNAME||' immediate checked'
from syscat.tables where TABSCHEMA='OATEST' and STATUS='C'"

1

-----------------------------------------------------------------
db2 set integrity for oatest.CAL_AUTH immediate checked

……

db2 set integrity for oatest.UM_USER immediate checked

81 条记录已选择。


  执行这 81 条语句,语句有可能报错
  主要命令:
  db2 set integrity for oatest. CAL_AUTH immediate checked
  
[db2inst1@devsvr2 oatest0303]$ db2 set integrity for oatest.CAL_AUTH immediate checked

DB20000I SQL 命令成功完成。

[db2inst1@devsvr2 oatest0303]$ db2 set integrity for oatest.UM_USER immediate checked

DB20000I SQL 命令成功完成。

…………



  如果报错,再反复执行这些语句直到下面的语句结果返回 0 条记录

  


[db2inst1@devsvr2 oatest0303]$ db2 "select 'db2 set integrity
for oatest.'||TABNAME||' immediate checked' from syscat.tables
where TABSCHEMA='OATEST' and STATUS='C'"

1

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

0 条记录已选择。



    6) 在操作系统中建立用户

[iyunv@devsvr2 root]# useradd oatest

[iyunv@devsvr2 root]# passwd oatest

Changing password for user oatest.

New password:

BAD PASSWORD: it is too short

Retype new password:

passwd: all authentication tokens updated successfully.


    7) 给 oatest 用户授权
  主要命令:
  db2 GRANT DBADM,CREATETAB,BINDADD,CONNECT,CREATE_NOT_FENCED_ROUTINE,IMPLICIT_SCHEMA,LOAD,CREATE_EXTERNAL_ROUTINE,QUIESCE_CONNECT ON DATABASE TO USER OATEST
  db2 GRANT CREATEIN,DROPIN,ALTERIN ON SCHEMA OATEST TO USER OATEST
[db2inst1@devsvr2 db2inst1]$ db2 connect to sample


数据库连接信息


数据库服务器 = DB2/LINUX 8.2.0

SQL 授权标识 = DB2INST1

本地数据库别名 = SAMPLE


[db2inst1@devsvr2 db2inst1]$ db2 GRANT DBADM,CREATETAB,BINDADD,CONNECT,CREATE_NOT_FENCED_ROUTINE,
IMPLICIT_SCHEMA,LOAD,CREATE_EXTERNAL_ROUTINE,QUIESCE_CONNECT ON DATABASE TO USER OATEST;

DB20000I SQL 命令成功完成。

[db2inst1@devsvr2 db2inst1]$ db2 GRANT CREATEIN,DROPIN,ALTERIN ON SCHEMA OATEST TO USER OATEST

DB20000I SQL 命令成功完成。

[db2inst1@devsvr2 db2inst1]$ db2 connect to sample user oatest using oatest


数据库连接信息


数据库服务器 = DB2/LINUX 8.2.0

SQL 授权标识 =OATSET

本地数据库别名 = SAMPLE


[db2inst1@devsvr2 db2inst1]$ db2 "select count(*) from um_user"


1

-----------

1529


1 条记录已选择。


    4、 重要说明
  1)在 db2 中的 bufferpool 是和内存有关系的,所以你应该根据你的机器内存情况来建立 bufferpool
  2) tablespace 的路径也是和你的应用有关,如果是双机环境应该把表空间建立在共享存储中,你可以根据实际情况来修改上文所说到的 oatest.sql 中的建立 bufferpool 以及 tablespace 的语句。
  在检查一致性的时候,如果遇到某张表由于外键的关系无法通过一致性检查,可以采用下面的步骤来解决
  1、删除外键
ALTER TABLE MV_DATA_HISTORY DROP CONSTRAINT FK_MV_DATA___ADV24
  2、检查一致性
set integrity for MV_DATA_HISTORY immediate checked
  3、重新创建 NOT ENFORCED 外键
ALTER TABLE MV_DATA_HISTORY
ADD CONSTRAINT "FK_MV_DATA___ADV24" FOREIGN KEY
("FORM_DATA_INST_ID")
REFERENCES MV_FORMSET_INST
("FORMSET_INST_ID")
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT ENFORCED
  如果在导出的时候出现类似下面的提示
SQL3132W The character data in column "PRIORITY" will be truncated to size "64".
  是因为 codepage 的问题,通过 db2set 设置 db2codepage 和数据库一致,然后重启 instance 就可以了导出了
  如果 db2move dbname load 需要执行第二次的时候,可以使用 db2move dbname load -lo REPLACE 来replace 上次导入的记录,否则有些没有主键的表可能会出现重复记录
  load 的时候可能会由于 log 满的问题,造成记录数过大的时候无法导入,这时这张表的访问可能如下:
  D:Work>db2 select * from sales
SQL0668N Operation not allowed for reason code "3" on table "YASIR.SALES".
SQLSTATE=57016
  可使用类似
下面的命令把日志文件的大小和日志文件的数量扩充,如下:
db2 update db cfg for DATABASE using LOGFILSIZ 7900
db2 update db cfg for DATABASE using LOGPRIMARY 30
db2 update db cfg for DATABASE using LOGSECOND 20
  然后再用类似
DB2 "LOAD FROM EXPORTED_DATA.IXF OF IXF SAVECOUNT 20000 RESTART INTO YASIR.SALES"
重新导入该表

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301600-1-1.html 上篇帖子: DB2安装 V9.7 (转) 下篇帖子: DB2 sql报错后查证原因与解决问题的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表