干这行十年,最怕听到的一句话就是“把数据库挪个地方”。听起来轻飘飘的,好像搬个家那么简单,实则里面全是坑。我见过凌晨三点因为字符集对不上导致乱码的,也见过迁移完才发现少了个表空间、业务直接瘫了的。所以这次我打算把Oracle数据库迁移到新服务器这件事,从头到尾捋一遍,把那些容易踩的雷提前给你排掉。

先别急着动手敲命令,你得先搞清楚自己手里是个什么样的库。是单机还是RAC?是文件系统还是ASM?数据量是几十个G还是几个T?这些直接决定了你的迁移策略。很多人上来就想着用expdp导数据,小库还行,到了几个T的库,光导出就得跑一天一夜,中间但凡网络抖一下,全白干。所以第一步,先盘清楚家底。用df -h看看数据文件目录大小,用du -sh统计一下实际占用,再查查v$version确认版本号。记住,源库和目标库的版本最好一致,至少也要兼容,不然字符集、时间戳格式这些细节能让你哭都哭不出来。
接下来是备份,这一步千万别省。我知道你觉得原库还在跑,数据不会丢,但迁移过程中的误操作、断电、磁盘满,哪一样都可能让你欲哭无泪。我的习惯是,迁移前先做一次全量备份,用RMAN也好,用冷备份也罢,反正得有一个能回退的保底方案。顺便把参数文件、密码文件、监听配置这些都复制一份,别小看这几个小文件,少了它们,新库根本起不来。你要是图省事,直接拷贝整个ORACLEHOME目录也行,但记得要带上dbs、network这些子目录,不然到时候连个tnsnames.ora都找不到。
说到拷贝,这里有个很多人忽略的细节:大文件拷贝一定要校验完整性。用scp或者rsync传完以后,别急着解压或者挂载,先用md5sum比对一下源文件和目标文件的哈希值。我见过有人用cp命令拷了十几个小时,发现少了个文件,因为磁盘满了,但命令没报错。这种事在真实环境里一点都不罕见。要是数据量特别大,建议用rsync加--partial参数,断点续传,还能用--progress看进度,心里有底。
数据搬完,就该处理那些看不见摸不着的东西了。首先是环境变量,.bashprofile里ORACLESID、ORACLEHOME、PATH这些都得改,别照抄原来的。然后是内核参数,/etc/nf里的shmmax、semmsl这些值,得根据新服务器的内存和CPU重新算,不能偷懒直接拷贝。你要是图省事,新库启动的时候会报ORA-27102或者ORA-27154,到时候还得回头查这些,不如一开始就弄对。
接下来是监听和网络配置。listener.ora和tnsnames.ora这两个文件,内容要改的地方可不少:主机名换没换?IP地址变没变?端口还是1521吗?这些都得逐一确认。改完以后,记得用lsnrctl status看看监听状态,再用tnsping测试一下网络连通性。别嫌麻烦,这一步要是漏了,客户端连不上数据库,业务方分分钟电话打爆你的手机。
现在可以启动新库了。先用sqlplus / as sysdba连上去,startup mount,然后看看alert日志有没有报错。这一步特别关键,很多问题都是在这里暴露出来的。比如控制文件路径不对,数据文件找不到,或者redo日志权限有问题。别慌,日志里写得很清楚,照着改就是。等数据库正常open以后,再跑一遍utlrp.sql编译无效对象,这个脚本是Oracle自带的,专门用来处理迁移后那些失效的存储过程、函数、包。
数据库起来了,不代表万事大吉。你还得做几件收尾的事。第一,检查字符集,用select userenv('language') from dual;看看和原来是不是一样,不一样的话,导入数据时很容易出乱码。第二,检查时区设置,特别是数据库里有TIMESTAMP WITH LOCAL TIME ZONE类型的字段,时区不对,时间全错。第三,重新配置一下crontab里的备份任务,别让新库裸奔。别忘了改密码,尤其是sys和system账号,别用默认的。
这些都弄完,可以通知业务方做验证了。但别急着把老库下线,最好并行跑个一天两天,让业务方在新库上做一遍完整的流程测试。我见过不少案例,迁移完当时看着没问题,结果第二天早上报表跑不出来,因为某个Job没迁移过去。所以,把dba_jobs、scheduler jobs这些任务都查一遍,确认全部正常调度。还有,数据库链接dblink也要重新创建,那些指向老库的链接,在新环境里全得改。
说几句掏心窝子的话。迁移这件事,最怕的就是想当然。你以为拷完文件就完事了,实际上还有一大半的活儿在后面。但只要你把每一步都走扎实了,其实也没那么可怕。我见过一个哥们儿,用了整整一个月准备,把每一个细节都列成清单,一项一项打勾,迁移那天,一个半小时全部搞定,连业务方都没感觉到切换。这才是高手该有的样子。
所以,别嫌我啰嗦,这份攻略里的每一句话,都是有人用血泪换来的。你照着做,虽然不敢保证百分之百顺利,但至少能把风险降到最低。真要遇到问题了,也别慌,alert日志、监听日志、还有Oracle的官方文档,都是你的救兵。毕竟,数据库迁移这事儿,从来都不是技术问题,而是态度问题。你认真对待它,它就不会坑你。


