CentOS 上 Oracle 数据库迁移实操指南
一、迁移方案选型
- 同版本同平台的最小停机迁移:使用RMAN 备份/还原或冷拷贝数据文件(停机时间最短,一致性最好)。
- 跨小版本或需跨目录/主机:使用**Data Pump(expdp/impdp)**按用户/表空间/全库迁移(灵活、可重放)。
- 跨操作系统或跨字节序:使用RMAN Convert Database(仅同字节序)或可传输表空间 TTS(跨字节序用 RMAN 转换数据文件),亦可用GoldenGate/Data Guard等逻辑复制方案(停机可做到接近零)。
- 迁移可行性要点:跨平台没有一键工具;RMAN Convert Database 要求源/目标ENDIAN_FORMAT 相同;TTS 支持跨平台但需按平台处理字节序;Data Pump/逻辑复制对数据类型支持更灵活但停机与一致性需按方案评估。
二、同版本同平台迁移步骤 RMAN 备份还原(推荐)
- 准备
- 确认两端 Oracle 版本一致(如均为11.2.0.x),目录结构规划一致(如 /u01/app/oracle),归档模式与备份策略一致。
- 在目标端安装相同版本软件、创建相同目录与 oracle 用户(uid/gid 建议一致),配置环境变量 ORACLE_SID/ORACLE_HOME。
- 源端备份
- 登录 RMAN:rman target /
- 全库备份并生成控制文件脚本:
- BACKUP DATABASE FORMAT ‘/backup/full_%U.bkp’;
- BACKUP CURRENT CONTROLFILE FORMAT ‘/backup/ctl_%U.bkp’;
- SQL ‘ALTER SYSTEM ARCHIVE LOG CURRENT’;
- 传输文件
- 使用 rsync/scp 将备份文件与控制文件脚本传输到目标端相同目录结构下。
- 目标端还原
- 启动到 nomount:STARTUP NOMOUNT;
- 还原控制文件:RESTORE CONTROLFILE FROM ‘/backup/ctl_*.bkp’;
- 挂载库:ALTER DATABASE MOUNT;
- 注册备份:CATALOG START WITH ‘/backup/’;
- 还原与恢复:RESTORE DATABASE; RECOVER DATABASE;
- 打开库:ALTER DATABASE OPEN RESETLOGS;(若使用备份控制文件且做了不完全恢复,需要 RESETLOGS)
- 验证
- 检查告警日志、数据文件/日志文件一致性、关键业务对象可用性。
- 适用场景
- 同平台、同版本、跨主机/跨存储的快速迁移;停机窗口可控(备份+还原时间)。
三、同版本同平台迁移步骤 冷拷贝数据文件(停机最短)
- 停库
- sqlplus / as sysdba → SHUTDOWN IMMEDIATE;(若长时间无响应可用 SHUTDOWN ABORT 后恢复)
- 拷贝关键文件(建议按清单一次性拷贝)
- 参数文件:如 $ORACLE_HOME/dbs/spfile.ora 或 init.ora
- 控制文件:由参数 control_files 指定(如 /u01/app/oracle/oradata//control01.ctl 等)
- 在线重做日志:由 v$logfile 查询(如 redo01.log 等)
- 数据文件:由 v$datafile 查询(如 system01.dbf、sysaux01.dbf、undotbs01.dbf、users01.dbf 等)
- 临时文件:由 v$tempfile 查询(如 temp01.dbf)
- 审计/诊断目录:如 audit_file_dest、background_dump_dest、user_dump_dest 下的内容按需拷贝(便于问题排查)
- 目标端启动与恢复
- 若拷贝期间源库有写入,目标端可能提示需要恢复:
- STARTUP MOUNT;
- RECOVER DATABASE;(必要时按文件逐个 RECOVER DATAFILE <file#>)
- ALTER DATABASE OPEN;
- 常见排错
- 启动报共享内存不足:检查 /dev/shm(tmpfs)大小,必要时在 /etc/fstab 中调大并重新挂载(如:tmpfs /dev/shm tmpfs defaults,size=31G 0 0)。
- 控制文件/路径不一致:修正 control_files 参数与目录权限,必要时用 STARTUP NOMOUNT + ALTER SYSTEM SET control_files=‘…’ SCOPE=SPFILE 后重启。
- 适用场景
- 同平台、同版本、目录结构可保持一致时的最小停机迁移。
四、跨版本或跨目录迁移步骤 Data Pump(expdp/impdp)
- 源端导出
- 创建目录对象并授权:
- CREATE DIRECTORY dumpdir AS ‘/data/oracle/dump’;
- GRANT READ,WRITE ON DIRECTORY dumpdir TO ;
- 全库或按用户导出:
- 全库:expdp system/ DIRECTORY=dumpdir DUMPFILE=full_%U.dmp LOGFILE=full.log FULL=Y PARALLEL=4
- 按用户:expdp / DIRECTORY=dumpdir DUMPFILE=schema.dmp LOGFILE=schema.log SCHEMAS= PARALLEL=4
- 传输
- 将 .dmp 与 .log 文件传到目标端相同目录对象对应物理路径。
- 目标端导入
- 创建相同目录对象并授权;按需创建表空间/用户(若目标端路径不同,导入后需调整 DB_FILE_NAME_CONVERT/LOG_FILE_NAME_CONVERT 或重建控制文件指向新路径)。
- 全库或按用户导入:
- 全库:impdp system/ DIRECTORY=dumpdir DUMPFILE=full_%U.dmp LOGFILE=full_imp.log FULL=Y PARALLEL=4 IGNORE=Y
- 按用户:impdp / DIRECTORY=dumpdir DUMPFILE=schema.dmp LOGFILE=schema_imp.log REMAP_SCHEMA=: TABLE_EXISTS_ACTION=REPLACE
- 适用场景
- 跨小版本、跨目录/主机、结构变更(如重组织表空间)或选择性迁移(按用户/表空间/查询)。
五、跨平台迁移要点 RMAN Convert/TTS 与注意事项
- 平台与字节序检查
- 查询支持平台与字节序:SELECT * FROM v$transportable_platform;(常见:Linux x86_64 为 Little-endian)
- RMAN Convert Database 仅支持同字节序;跨字节序需用 TTS + RMAN 转换数据文件。
- RMAN Convert Database(同字节序)
- 源库 READ ONLY → RMAN> CONVERT DATABASE NEW DATABASE ‘’ TO PLATFORM ‘Linux x86 64-bit’ DB_FILE_NAME_CONVERT ‘/u01’,‘/u02’ TRANSPORT SCRIPT ‘/tmp/transport.sql’;
- 将生成的数据文件与脚本传到目标端,按脚本创建实例并启动。
- TTS(跨平台/跨字节序)
- 步骤要点:
- 检查可传输性与外部对象(DBMS_TDB.CHECK_DB/CHECK_EXTERNAL);
- 源端将表空间置为只读(或按增量阶段迁移);
- 按平台/字节序使用 RMAN 转换数据文件;
- 导出元数据(expdp TRANSPORT_TABLESPACES=…)并在目标端导入;
- 目标端使表空间在线并校验。
- 其他可选
- GoldenGate/Data Guard 异构物理备库:可实现近零停机迁移,但需评估平台支持矩阵与网络带宽。
- 关键注意事项
- 保证 ORACLE_SID/ORACLE_HOME 与目录权限一致;监听与 tnsnames.ora 正确;
- 迁移后核对 compatible 参数、时区/字符集、统计信息、作业/触发器/物化视图刷新、审计与目录对象;
- 先做全量演练与回退预案,在窗口内执行并保留完整日志。