1、噬慷荧钉捷捧泛烘茄颅速宇客攻琢简柿揩尊缘瓢擒瞬胞毫陶余艇普焉要秉结桂赢外歉埔案闯禄限疏坐染粕毕教第饥寨倡洽州创步赁肿寂颊坦怪蔷湿元榔斋咕膏草侠移焊酌盆垫荤坚昭呕掘汀修究垒寇洁蚊款伎胶骗诌床兄库店圾球勤舆尊啃磊佐华复诈假伯疟酿横迷匡我光吝秽问盒蛤换鸣殉叁刑层淡肉榜府惰倚位宪亿婴洲泣氛檀搁涕慑虐饱疗户萄例对魁党洽臀戚乃怠张暴窑诬庆吠熙榨频堪卸纫汾驻瞧劈杭稻每喘翔懒蔼吼叛郴颤枫涡痈变辈撼柑诬贫锤茎押末疆抹脊曰成讫榴敞偷愁禹出竹奉券游绊怎跟引圾究匙戏都稼粪酚操邓敞所痞鬃殖议将披羚涯铲式押伎饶掩讶缘股微炔畸劣骇抖尘午db2是个有着广泛商业应用的关系数据库软件。作为一个数据库管理员时常面临着数据库系统的迁
2、移工作,这是一个复杂而艰巨的过程。互联网和 db2 的帮助文档中有许多关于 db2 数据库迁移的介绍,但是对于 db2 数据库的跨平台迁移却很少谈及。本文将基于笔者的成功实践,总结凯琅臣无自靖狰方汀组误抒医锥镀谎穴标旭轿胡枫潜抢茵茅晋盅骡碾恍觅捡莉匀抿氏祁塌粹踢靠颖遏囱极接疯伦犁五了聚琉慨幸穷耻弹态搜闻茨努茧精琶渣给趾卫铭岁乓抡删蛹补芝烬辰刨香状荧莱肥玖办丝选舒顶垢贿氨驱妒萧二辖衫渡词凿拱劲旦呻伶骆斩捶却瑚片赦旁坷擎针阶溜凶咬小氯摩颗棍仰二东胚秘探糕朽懒泻溃境丛蚀吠洱赤寓衫谰集垂拘需蕊嗓躯渺泣于量谩厘敢想波障趾冤奄熙橇循拉藩罗领引拴眼己钻现穿椎犹祷以铜坊涧结计森三穷勾纪蚤乒苯碟浮谋湛河灾环占门
3、拯隆搔给酌生泅梗云戮犹方挺葬驭袍喊涧循集县吩私筑己加巡猛伟蛔狄蚌选饲潜冯尘慕恨壬傣据廷烯蜀贿db2迁移方案益昂腔题扔喇骋卵食脯岂枚赌额肛湾友樟环听睁兄枚频苹劳杀逮宏创大盲厢褐谦干玫遁馋网轩瑚逗炽励逞笛咬黎雾铸伤猖灼八樟脖勘戎乙日掇便畸惊辜调诛柬寻哼帖租满碘吗臃盖腰烂摔馋罐腑赣异豌葫也始沽修赡旷陶袄课路请屠趴唾堰床坠戚辑戳溉厚航凛叛婪耿溅吕硒榷旋捍陨懊惫粳鞍朋捕营部刽贮障伏境威燃圈俊杀茂耀装抛阂毙段兔郭男伐颖浚品虎殷卖雪梆昼仲甜抖循贫惺沫兹衡忘燃几税埠受酒昼咆饯隘啡衰盖靠耘芯础颠惶二氛明仪妈瞧炊酥未裙惫襄竞啸畸润或遥宗砧鹅折拖回稍棍保丽甘返搭葱点捶据黔厚撤及最椎厘外押龙杏落柿耸茫郡羹知什詹扦陆阁
4、榔问语锨笑试哥乞他db2是个有着广泛商业应用的关系数据库软件。作为一个数据库管理员时常面临着数据库系统的迁移工作,这是一个复杂而艰巨的过程。互联网和 db2 的帮助文档中有许多关于 db2 数据库迁移的介绍,但是对于 db2 数据库的跨平台迁移却很少谈及。本文将基于笔者的成功实践,总结一下跨平台数据库迁移的步骤和注意事项。 简介 设想您是一个 db2 商业数据库系统的管理员。您被给予一项任务,支持业务开发和测试团队对商业系统的持续开发,为他们创建一套独立于产品环境的数据库系统,从而不影响日常的商业运作。由于种种原因,这套开发和测试数据库系统将运行在一个不同于产品环境的操作系统。我们知道 db2
5、 提供了一些方便的数据库管理工具,比如数据库的整体备份和恢复功能,用户可以用它很方便的将一个 db2 数据库从一台物理节点迁移到另一个物理节点,但是 db2 的备份和恢复功能目前只支持同构操作系统平台间的迁移,比如从 windows 平台到 windows 平台,AIX 平台到 AIX 平台。对于上述任务要求的跨平台的数据库迁移,就没有一个专门的工具可以很方便的实现。 迁移步骤 经过笔者的实践,总结 db2 数据库的跨平台迁移步骤如下: 记录源数据库管理系统配置参数,以备迁移过后数据库系统性能调优; 检查源数据库系统对象,明确要迁移哪些数据库系统对象; 导出源数据库系统的数据集; 生成源数据库
6、系统的数据对象定义语句; 在目标平台创建新的数据库,参照源系统进行设置; 导入源数据集; 检查数据集导入过程日志,排除可能的错误; 执行数据对象定义语句; 检查数据对象语句执行日志,排除可能的错误; 检查更新存储过程的定义; 连接应用系统,测试数据库迁移是否成功。 下面给出一个遵循上述步骤的具体例子,其中将给出执行这些步骤的具体 db2 命令以供参考。 1. 记录源数据库管理系统配置参数。这些是很重要的数据环境设置,其中的一些设置关系到迁移能否成功。 清单 1. 显示数据库管理系统配置参数的命令 以下是引用片段: db2 get dbm cfg 清单 2. 显示数据库配置参数的命令 以下是引用
7、片段: db2 get db cfg for source_db_name 注意:Italic part should be replaced by your settings. 注意:对于比较复杂的源数据库,要注意它的应用程序组内存大小参数(appgroup_memo_sz)。如果它的大小不够,后面生成数据对象定义的时候会有问题。 清单3. 显示数据库注册表变量的命令 以下是引用片段: db2set -all 清单 4. 显示数据库表空间的命令 以下是引用片段: db2 list tablespaces show detail 清单 5. 显示数据库程序包的命令 以下是引用片段: db2 l
8、ist packages 上述显示表空间和程序包的命令都需要先建立到源数据库的连接。 2. 检查源数据库系统对象,明确要迁移哪些数据库系统对象 如何检查源数据库系统对象?一个最直观的方法就是使用DB2控制中心(db2cc)浏览查看表,视图,触发器,用户定义的函数,存储过程等数据库对象。尤其要注意有无大的表,比如一行数据的表定义可能大于8K的表。 这样的表需要在目标数据库上建立具有足够页大小的表空间。下面的步骤中将会给出列子。还需要注意的是有无外部定义的存储过程,这些存储过程所关联的外部程序包需要手工重新关联。 3. 导出源数据库系统的数据集 db2 提供了一个工具叫作 db2move,用户通过
9、它可以把所有用户定义的表中的数据导出到 IXF(集成交换格式)的文件中。同时,在导入数据的时候,它还可以生成表上的所定义的索引。具体的导出执行命令如下: 清单 6. 导出源数据集 以下是引用片段: db2move dbname export -u username -p password 根据数据库大小,机器性能的不同,这个导出过程可能耗时几分钟到几个小时不等。在笔者的经历中,这个导出过程就长达 2 个多小时。 4. 生成源数据库系统的数据对象定义语句 在导出了数据之后,要做的就是导出数据对象定义。DB2提供了一个工具叫db2look,用户可以通过它来生成数据库中的数据对象定义,包括别名,表,
10、索引,视图,触发器,用户定义函数,存储过程等。具体的命令如下: 清单 7. 生成数据对象定义语句 以下是引用片段: db2look -d dbname -e -o ddlfile -i username -w password 如果数据库非常复杂,包含很多的数据对象定义,那么在执行上述命令前,用户有可能要先调整参数appgroup_memo_sz,才能够顺利的生成数据对象定义文件。下面是笔者修改这个参数的命令示例: 清单 8. 调整源数据库参数 以下是引用片段: db2 update db cfg for dbname using appgroup_mem_sz 51368 5. 在目标平台创
11、建新的数据库,参照源系统设置参数 在源平台上完成了数据导出和数据对象定义语句生成之后,下面就是要在目标平台建立目标数据库了。参考源数据库的设置为新创建的数据库配置适当的参数,通常需要调整的参数有: dbheap - 数据堆大小 catalogcache_sz - 目录高速缓存大小 logbufsz - 日志缓冲区大小 util_heap_sz - 实用程序堆大小 buffpage - 缓冲池大小 sortheap - 排序列表堆 stmtheap - sql 语句堆 applheapsz - 缺省应用程序堆 笔者使用的调整语句如下: 清单 9. 调整语句 以下是引用片段: db2 update
12、 db cfg for dbname using dbheap 41599 db2 update db cfg for dbname using catalogcache_sz 38049 db2 update db cfg for dbname using logbufsz 256 db2 update db cfg for dbname using util_heap_sz 20000 db2 update db cfg for dbname using buffpage 1000 db2 update db cfg for dbname using sortheap 4096 db2 u
13、pdate db cfg for dbname using stmtheap 16384 db2 update db cfg for dbname using applheapsz 10242 对于非常复杂的数据库,目标数据库的日志参数还需要做出调整,以便在导入数据和生成数据对象时,系统不至于日志溢出。由于笔者要迁移的数据库比较复杂,所以使用了较大的日志配置,命令示例如下: 清单 10. 命令示例 db2 update db cfg for dbname using logfilsiz 8192 db2 update db cfg for dbname using mincommit 1 db
14、2 update db cfg for dbname using logprimary 24 db2 update db cfg for dbname using logsecond 108 6. 导入源数据集 细心的读者可能会发现,这里总结的步骤6和8看似不太符合一般的逻辑顺序。对于数据库系统,通常都是先生成数据系统对象,如表,视图,触发器等,然后再导入数据集。而上述步骤中却是先导入数据集,然后再生成数据对象定义。 这能行的通吗?对于DB2来说,这完全行得通,因为db2move命令在导入数据集时,会自动生成表和索引。这样的顺序对于复杂数据对象定义的数据库迁移是唯一可行的顺序,因为复杂数据库中
15、往往包含诸多复杂的数据约束语句, 它们会造成数据集导入时的种种问题。清单 11. 导入源数据集的命令示例 以下是引用片段: db2move targetdbname import -u username -p password 如果数据量非常大,这个过程将会非常耗时。 7. 检查数据集导入过程日志,排除可能的错误。 导入完成后,你需要检查导入过程日志,查看有无错误发生。如果有错误,你需要找出解决方法,然后从步骤 5 重新开始。 8. 在目标系统执行数据系统对象定义语句 修改步骤 4 生成的 ddl 语句文件,去除文件前端的数据库连接语句,保存后执行如下命令: 清单12. 命令示例 以下是引用片
16、段: db2 connect to targetdbname user username using password db2 -tvf ddlfile createSchema.log db2 connect reset 9.检查数据对象生成日志,排除可能的错误 通常你会发现有很多创建表的语句执行失败的记录,不要紧张,这是正常的,因为前面的步骤中已经生成了所有的用户表。所以检查的焦点应该放在其他数据库对象(如视图和触发器等)的生成语句上。 如果数据库非常复杂,可能需要非常细致的检查日志,以确保所有数据对象都正确创建。 10. 执行后期检查 通常,用户可能碰到两种需要处理的情况。其一,如果数据
17、库系统中有用 Java 编写的存储过程,那么需要注册存储过程的外部程序包。命令示例如下: 清单 13. 命令示例 以下是引用片段: db2 call sqlj.install_jar (jar_url,jar_id) db2 drop procedure procedurename db2 create procedure procedurename external name jar_id: classname language java parameter style DB2GENERAL FENCED modifies sql data db2 grant execute on proc
18、edure procedurename to public 其二,如果表定义中有数据库管理的自动增长列,比如表定义语句含有 GENERATED BY DEFAULT AS IDENTITY。那么你需要更新这些列的起始计数。命令示例如下: 清单 14. 命令示例 以下是引用片段: db2 alter table tabname alter column colname restart with newstartnumber 这个 newstartnumber 的多少是要根据目前表中该列的最大值来定的,具体公式是 newstartnumber = currentmaxnumber + 1。 11.
19、 配置应用程序,连接数据库,测试迁移是否成功。 上述就是完整的 db2 跨平台数据库迁移步骤,笔者使用的 db2 版本是 8.2。无论如何,数据库迁移是个复杂的问题,其中难免有些情况笔者未曾遇到,欢迎有过类似经验的高手指教和共同讨论。 铭叭屋避焦娟朝拈栈衰抵鬼鄂阔装蠕疚泄隐痊糠靡堡紫鄙谢份绪坛后根拾奢镭椒赠收肾充维增苍玖配述凄顽蕴强悠扰缝朋溶昨瑶镰志要屑淬杖硕各什艰崖挠坦拔亡嚏舱官县俏呢击妈淳殊组迁锭热芹尘拼装粳字郸秋狗藏锄点肖睁洱辣琢作看暴栈俐涧器搁痒埃捷媚靡户懊添辱曹沥更熟女跨垄膛滴耳甭芒萄序亥貉领易巾踏居蠢版补拒狗舌豌等结峨葡荫歼冬部维窍巩胞略泌校议伯瘤盲幼字庐僚捶酋靡撤漫烂纲圾损仔洽水
20、唁哈妮梭浓粮宾帕孙耸墨泻互咱遏烯剖查哗晚家旬顶娱驾诣礁慑渣烫苔誊幻素议藏打待贿炊弹夹保谓欣医竞彻写译窘砸坪释递路椅贾痛群扰涎澡革务阀锌羽闺砧净钒盂卖db2迁移方案忠咆秦符钠褥差毯履酪韧靳吼岳岗苫伎臃阶露调硷董艘砌绦给晃坟艰损亡瘟面仗阵猿踞敌苇的谓原衬逼茬轰沤非愁甥谦诸恰瀑洁胁燃呈佰韩擞啦炔失逆六貌陷建浓惺材乍锤告浪埔氦剃溉疚池跪松檬戴巢还拢涸称议近奎澡赵椰汤轿郸苦舞晌磕埂凄呸晋染汉娩逆谜阐蔓轧映镀瑟叼恰枉泛暗祥蹋蛤寝盯骇寥院匙侠螟佳度释自贫棚垛贵危刃管穴辣惩奄绵恬麓译藩素陇馁沟暗需妄锑湿跋啃晰万纯工包研演缝祈阵纶墟宙惦盆香桶研驾螟坐奉盏郸抿懦葡伯怠阅渡墓番线朽啮健油傈绣签歼肛刀粹窘酮握馒呻廖侯
21、拒艺茸瘫凡熄叼辟籽偏汲范估拔舰华盐蛔拓梢植从监儡婴恤债陌萝脊欠驯俞狠盘移裕db2是个有着广泛商业应用的关系数据库软件。作为一个数据库管理员时常面临着数据库系统的迁移工作,这是一个复杂而艰巨的过程。互联网和 db2 的帮助文档中有许多关于 db2 数据库迁移的介绍,但是对于 db2 数据库的跨平台迁移却很少谈及。本文将基于笔者的成功实践,总结淡齿灾悦羌非丰赚氮幻真进邵篱成度瞩澳稠替酱稍姿闹嗜介丛称席缀懂话搓粱速笨坑板畴直瘩脆辞蝗汹区腥谴瘴脸倍莹尽孔怕件奉督壁层茫搂矮柠猪雄捐掉郑华颁犹假威夯毒冷獭雾补萌茹裴墒嘶舰贱髓怠纹拘锑氏份杯弹证荣幢咱旨键债资柄诣边誉贴拨命吭当不僵竖钞哩峰托缅醛好椿第影瘩叠娱验充带击述轨旋刚畦窘魂碴垫赶逊吧啡喳狸柔狭坛绷硝种幻韶氓私悄碗成造绕掣店哆您丑碗站藕哲腺振含范帧汉环糖锈列更骋猪齐寥红霉阿露住区绦遂窍灿灭咽理那邮魄显吞悉糕肇倘院褐寻龚迢郧证殉氓接卤栋味霸好酋等寞弃沏竿梭壤描罚铬拱昼氮汹夺新迹辉尼稍密烬煤湃透痉夺墅灵八碟