上周帮一个老客户做数据库迁移,他那边业务系统跑的是Oracle 11g,数据量大概800G左右,之前一直用的exp/imp导出导入,结果这次迁移到新服务器时,光是导出就花了将近10个小时,导入又跑了15个小时,中间还因为字符集不一致报错,折腾了两天才搞定。客户打电话来抱怨:“这破方法也太慢了吧,能不能换个快的?”我说,你早该用RMAN了。RMAN迁移数据库,听起来好像挺复杂,但其实掌握了核心逻辑,比那些传统工具省心太多了。

RMAN的全称是Recovery Manager,Oracle自带的备份恢复工具。很多人一听到“备份恢复”就觉得跟迁移没关系,其实恰恰相反。迁移的本质不就是把数据从A点搬到B点,然后保证它能正常启动吗?RMAN做这件事的优势在于,它不关心数据文件的具体内容,只关心数据块级别的物理拷贝。这就好比搬家时,你不用把每个抽屉里的东西都掏出来重新装一遍,直接连抽屉带柜子一起搬走,效率自然高出一大截。而且RMAN支持增量备份、并行操作,还能自动处理控制文件、参数文件这些“小配件”,避免手动操作的遗漏。
具体来说,用RMAN做迁移有两种主流场景。第一种是同平台同版本的迁移,比如从一台Linux服务器搬到另一台Linux服务器,数据库版本一样。这种情况下,最简单的做法就是先把源库的数据文件、控制文件、参数文件全部备份到一个目录,然后拷贝到目标服务器上,再用RMAN进行恢复和打开数据库。整个过程不需要重建数据库,也不需要重新导入导出数据,时间主要花在文件拷贝上。如果是网络环境好,甚至可以直接通过网络备份到目标端,省去中间存储的环节。
第二种场景是跨平台或者跨版本的迁移,比如从Windows搬到Linux,或者从Oracle 11g升级到19c。这种情况下,RMAN的“可传输表空间”或者“可传输数据库”功能就派上用场了。你需要先在源端把数据库置为只读模式,然后用RMAN将数据文件转换成目标平台的格式,再传输过去。转换过程中,RMAN会自动处理字节序、文件路径等差异,你只需要在目标端执行一条简单的恢复命令就能完成。我有个朋友曾经用这个方法把一套1.2T的数据库从Solaris迁移到Linux,全程只用了4个小时,其中大部分时间都在等文件传输。
不过,RMAN迁移也不是毫无门槛。很多新手最头疼的问题是参数文件的处理。Oracle数据库启动时需要参数文件,它记录了数据文件位置、内存分配、控制文件路径等关键信息。如果你直接用RMAN备份恢复,参数文件可能还停留在旧路径上,导致恢复后数据库无法启动。解决办法有两个:要么手动修改参数文件中的路径,要么在备份时指定“format”参数,把路径统一成新环境的绝对路径。我建议后一种方法更靠谱,因为手动修改容易漏掉某个参数,到时候启动报错,排查起来很费时间。
另外,归档日志的处理也容易出问题。RMAN迁移时,如果你把归档日志也备份了,恢复时数据库会尝试应用这些日志,导致恢复时间变长。实际上,迁移场景下,你只需要备份最新的数据文件和控制文件就够了,归档日志除非是用于时间点恢复,否则完全没必要带过去。我见过有人把生产库的三个月归档日志全部备份到目标端,结果恢复时Oracle自动应用日志,折腾了整整一天还没跑完。正确做法是,在源端执行一次“alter database backup controlfile to trace”,生成控制文件的创建脚本,然后在目标端用这个脚本重建控制文件,再恢复数据文件,这样就能跳过归档日志,直接恢复到最新状态。
还有一个容易被忽略的坑是网络传输的稳定性。如果你是通过网络备份到目标端,网络波动可能导致备份片损坏或者传输中断。这时候,RMAN的“checksum”功能就很有用了,它会在备份时计算每个数据块的校验和,恢复时自动校验,一旦发现损坏就会报错。你还可以用“validate”命令提前检查备份文件的完整性,避免在恢复时才发现问题。我通常的做法是,先在源端做一个全库备份,然后通过scp或rsync拷贝到目标端,这样网络压力分散,也方便做校验。拷贝完成后,再用RMAN的“catalog”命令把备份文件注册到目标数据库,接下来就是恢复和打开数据库的流程。
想说的是,RMAN迁移数据库虽然高效,但前提是你对整个流程有清晰的规划。很多人一上来就执行备份命令,结果恢复时发现少备份了控制文件,或者参数文件路径不对,这时候再回头补救,往往比重新导入导出还耗时。我的建议是,每次迁移前先写一份操作清单,列出源端和目标端的环境信息,包括数据库版本、字符集、文件路径、内存参数等,然后按照清单一步步执行。执行完每一步,用RMAN的“list backup”或者“report schema”命令确认结果,确保没有遗漏。这样虽然前期准备多花点时间,但真正跑迁移时,基本就是一两个命令的事。
迁移完成后,别忘了做一次全库备份。很多人在迁移成功后,觉得数据已经在新环境安顿好了,就忽略了备份。但新环境的操作系统、磁盘阵列、网络配置都可能跟旧环境不同,万一出现意外,没有备份就麻烦了。我通常会建议客户在迁移成功后,马上执行一次“backup database plus archivelog delete input”,把新环境的数据保护起来。毕竟,迁移只是开始,稳定运行才是最终目的。用RMAN,就是用最少的操作,换最大的确定性。


