Oracle 数据库在 CentOS 上的迁移方法
一、迁移方案总览与选择
| 方法 |
停机窗口 |
适用场景 |
关键要点 |
| 离线文件拷贝(数据文件/控制文件/日志/参数文件) |
需要停库 |
同版本、同平台、目录结构可保持一致 |
一致性停库、拷贝关键文件、必要时做介质恢复 |
| Data Pump(expdp/impdp) |
可在线导出,导入需停业务 |
版本相近、跨小版本或重构对象 |
先建表空间/用户,再导入;支持并行与过滤 |
| RMAN 跨平台(Convert Database) |
需停库 |
不同平台但字节序一致(Little/Big) |
只读检查、RMAN 转换、目标端建库脚本 |
| XTTS(跨平台可传输表空间) |
可滚动增量 |
大规模、跨平台、停机窗口严格 |
分步骤迁移表空间与元数据,支持增量同步 |
- 选择建议:同版本同平台优先“离线拷贝”;需要跨小版本或对象重构选“Data Pump”;跨平台且字节序一致选“RMAN”;跨平台且需最小停机选“XTTS”。
二、方法一 离线文件拷贝(同版本同平台)
- 准备与一致性
- 在源库以 SQL> shutdown immediate 停库;若长时间无响应可用 shutdown abort 后启动到 mount 再 open 做一次检查点,然后再次 shutdown immediate。
- 拷贝清单与目录
- 参数文件:如 $ORACLE_HOME/dbs/spfile.ora 或 init.ora
- 控制文件:通过 SQL> show parameter control_files 获取路径
- 在线重做日志:通过 SQL> select * from v$logfile 获取路径
- 数据文件与临时文件:通过 SQL> select name from v$datafile; 与 SQL> select name from v$tempfile; 获取路径
- 审计/后台进程目录:如 audit_file_dest、background_dump_dest 等对应目录(确保目标端存在并可写)
- 目标端提前创建相同目录结构并授权 oracle:oinstall。
- 传输与还原
- 使用 scp/rsync 将以上文件保持目录结构拷贝到目标端对应位置。
- 目标端以 sqlplus / as sysdba 启动到 mount,先做 recover(如有需要),再 alter database open。
- 常见问题与处理
- 启动报共享内存不足:检查 /dev/shm,必要时在 /etc/fstab 中设置如 tmpfs /dev/shm tmpfs defaults,size=31G 0 0,并执行 mount -o remount /dev/shm。
- 打开时报块需要恢复:对相应数据文件执行 recover datafile <file#>。
三、方法二 Data Pump 逻辑迁移(expdp/impdp)
- 源库准备
- 创建目录对象并授权:
- SQL> create directory dumpdir as ‘/data/oracle/dump’;
- SQL> grant read,write on directory dumpdir to ;
- 导出(可按用户/全库/表空间等):
- 全库:expdp system/@orcl directory=dumpdir dumpfile=full_%U.dmp logfile=full.log full=y parallel=4
- 按用户:expdp /@orcl directory=dumpdir dumpfile=user.dmp logfile=user.log schemas= parallel=4
- 目标库准备
- 创建相同表空间(含 SIZE/AUTOEXTEND/NEXT/MAXSIZE 等参数一致或兼容),创建用户并指定默认表空间,授予权限。
- 创建同名的 directory 对象并授权,将 .dmp 文件传到该目录。
- 导入
- 全库:impdp system/ directory=dumpdir dumpfile=full_%U.dmp logfile=imp_full.log full=y parallel=4 ignore=y
- 按用户:impdp / directory=dumpdir dumpfile=user.dmp logfile=imp_user.log schemas= table_exists_action=replace
- 提示
- Data Pump 为服务端工具,建议在数据库服务器本地执行;导入前确保目标库对象定义与权限兼容,必要时使用 remap_schema/remap_tablespace 等参数。
四、方法三 RMAN 跨平台迁移(同字节序)
- 平台与限制
- 仅支持相同字节序平台(Endian),可在 v$transportable_platform 查看;不同字节序需使用 XTTS 或其他方式。
- 源库操作
- 将数据库置于只读:startup mount; alter database open read only;
- 使用 DBMS_TDB 检查可传输性与外部对象:
- exec dbms_tdb.check_db(‘Linux x86 64-bit’, dbms_tdb.skip_none);
- exec dbms_tdb.check_external;
- RMAN 转换数据库并生成目标端脚本:
- RMAN> convert database new database ‘<NEW_DB_NAME>’ transport script ‘f:\transdb.sql’ to platform ‘Linux x86 64-bit’ db_file_name_convert ‘<src_dir>’,‘<dst_dir>’;
- 目标端操作
- 将转换后的数据文件拷贝到目标目录,编辑生成的 init.ora,按脚本创建实例并启动到 mount,执行 alter database open resetlogs。
五、方法四 XTTS 跨平台表空间迁移(滚动增量)
- 适用场景
- 跨平台、大规模数据、停机窗口严格;支持增量同步,最终切换窗口极短。
- 关键步骤
- 准备:源端检查平台支持与兼容性,目标端创建 compatible 的空库与目录对象。
- 初始迁移:将待迁移表空间置为只读,导出元数据(Data Pump),转换数据文件(RMAN),在目标端导入元数据并上线表空间为只读。
- 增量同步:周期性将增量数据文件转换并应用到目标端,直至割接窗口。
- 最终割接:短暂停写,最后一次增量与应用,切换应用至目标库,验证与回退预案就绪。
- 提示
- XTTS 实施复杂度较高,建议由有经验的 DBA 执行,并在演练环境充分验证。
六、迁移前后关键检查与常见问题
- 一致性校验
- 对象数量与容量:对比 dba_tablespaces、dba_data_files、dba_segments 等统计;抽样校验关键表行数与校验和。
- 无效对象与编译:执行 utlrp.sql 编译失效对象,检查 dba_objects 状态。
- 监听器与连接:确认 listener.ora/tnsnames.ora 正确,应用能连通新实例。
- 常见问题速查
- 启动失败提示共享内存不足:检查并调整 /dev/shm(如 size=31G),重新挂载后启动。
- 打开数据库报需要介质恢复:对相应 datafile 执行 recover datafile 。
- 导入时报对象已存在:使用 TABLE_EXISTS_ACTION=REPLACE/TRUNCATE 或先清理目标对象。