先泼盆冷水:Oracle数据库迁移这事儿,说“轻松”那是骗人的,但说“搞定”,真能做到。我见过太多人一提到迁移就头大,生怕一个不小心把生产库搞崩了。其实拆开来看,无非就是三件事:搞清楚要搬什么、选对搬家工具、留好后路。把这三点理顺了,再大的库也就是个体力活。

第一步,盘家底。 别急着动手,先花半天时间把源库摸个底朝天。查版本、查字符集、查所有表空间和用户权限,这些基础信息一个都不能漏。我见过最惨的案例,迁移完才发现源库是ZHS16GBK,目标库装成了AL32UTF8,中文全变成问号,只能回滚重来。还有那些藏在角落里的Job、DBLink、物化视图,平时不起眼,迁移时全冒出来捣乱。建议用Oracle自带的DBMS_METADATA把整个元数据先导出来过一遍,心里有数再动刀子。
第二步,选工具。 数据量小、停机窗口长的,用expdp/impdp就行,简单粗暴,导出导入一跑完事。但要是几十个T的大库,只能给两小时停机时间,那就要上DataGuard或者OGG了。DataGuard做物理备库,切换起来干净利落;OGG做逻辑同步,灵活但配置复杂,得专门有人盯着。这里有个容易被忽视的坑:跨版本迁移时,比如从11g迁到19c,expdp版本兼容性问题特别多,最好用高版本工具导低版本库。另外,所有工具都别忘了处理大对象,LOB字段一旦有损坏,导入时卡住不说,数据还找不回来。
第三步,做校验和回退方案。 数据搬过去了,不等于完事。跑几条关键的统计SQL,对比源库和目标库的条数、总金额、关键字段的MD5值,这些都要写成脚本自动化跑。同时,一定要留好回退的出口。生产环境出问题,老板要的是“赶紧恢复”,不是听你解释“再给我两小时”。所以迁移窗口内,源库的备份不能删,网络链路不能断,所有操作步骤要写进文档,每一步出了错怎么回滚都要提前想好。
有个细节特别提醒:迁移时别忘了检查数据库的时区和系统时间。Oracle里SYSTIMESTAMP存的是数据库所在服务器的本地时间,如果新机房服务器时区没调一致,所有业务系统的时间逻辑全会乱套。这种问题排查起来特别费劲,但预防起来就一行命令的事。
还有权限和同义词的问题。很多业务系统里用的是同义词指向别的库的表,迁移时如果只搬数据不搬同义词,应用一启动就报ORA-00942。别问我是怎么知道的,这种坑踩一次就够记一辈子。所以盘点阶段就要把依赖关系画出来,哪些是同义词、哪些是DBLink,一起迁过去。
再讲讲执行阶段的节奏把控。很多人喜欢一股脑把任务提交出去,然后干等着。成熟的做法是分批次跑:先跑元数据,再跑小表,最后跑大表和LOB。每个批次完成都立刻做校验,发现问题马上停下解决,别等问题堆到一刻集中爆发。而且建议用并行参数,但别贪多,CPU核数的一半就行,不然I/O打满,源库业务跟着遭殃。
数据校验这块,有人觉得随机抽几个表看看就行了。真出了事,抽查是查不出问题的。要写全量比对脚本,逐表比对行数和关键字段的checksum。工作量看着大,其实都是重复劳动,写一次脚本以后都能复用。还有那些自增列、序列,迁移后序列值可能会和已有数据冲突,得记得重置。
说回标题里那“轻松”两个字。说到底,数据库迁移就是个项目管理,难点不在技术,在细节和流程。把家底盘清楚,工具选对,回退方案备好,剩下的就是按部就班执行。真正的高手不是迁移时多牛,而是迁移前把能想到的坑全填平了。


