CentOS 上 Oracle 数据库迁移步骤
一 迁移方案选型
- 同平台同版本、停机窗口充足:优先使用脱机文件级拷贝(拷贝数据文件、控制文件、参数文件、日志文件等),停机最短、可控性强。适合从一台 CentOS 迁移到另一台 CentOS,版本如 11g/12c。
- 同平台或跨平台、需尽量缩短停机:使用 RMAN Transportable Tablespaces/TTS(可配合增量,适合大数据量、停机窗口小)。
- 跨平台且需一次性整体迁移:使用 RMAN Convert Database(要求字节序一致;跨字节序需借助 Data Pump 或 XTTS)。
- 应用兼容性好、停机窗口较充裕:使用 Data Pump(expdp/impdp) 按用户/表空间/全库迁移,灵活但导入时间较长。
- 大数据量、跨平台、停机极短:使用 XTTS(Cross-Platform Transportable Tablespaces) 多轮增量滚动迁移,再短暂停机切换。
二 方案对比一览
| 方案 |
停机窗口 |
适用场景 |
关键要点 |
| 脱机文件拷贝 |
最短(拷贝期间停库) |
同平台同版本、硬件更换 |
拷贝数据文件、控制文件、参数文件、日志文件;注意目录结构与权限 |
| RMAN TTS |
小(导出元数据+传输数据文件) |
同/跨平台、大数据量 |
表空间置为只读;导出元数据;传输数据文件;导入元数据并上线 |
| RMAN Convert DB |
小(只读+转换) |
跨平台、字节序一致 |
只读检查;RMAN 转换;目标端执行脚本重建控制文件并打开 |
| Data Pump |
中-长(全量导入) |
版本兼容、灵活迁移 |
创建目录对象;expdp/impdp;可并行、可按对象粒度迁移 |
| XTTS |
很短(多轮增量+短切换) |
跨平台、超大数据量 |
多轮增量同步;最后增量+元数据导入;短暂停机切换 |
三 同平台同版本脱机文件级迁移步骤(停机最短)
- 准备与评估
- 记录源库关键参数:实例名/SID、字符集、数据文件/日志文件路径、表空间清单、用户与权限、监听器配置。
- 在目标 CentOS 安装同版本 Oracle,创建相同目录结构(如 /u01/app/oracle/oradata/SID、/u01/app/oracle/admin/SID/adump 等),创建 oracle 用户与组并配置环境变量。
- 停库与一致性
- 源库执行:SQL> shutdown immediate(必要时 abort 后恢复一致性)。
- 文件拷贝
- 拷贝以下目录与文件到目标库相同路径(保持属主与权限一致):
- 数据文件目录:/u01/app/oracle/oradata/SID/
- 参数与密码文件:$ORACLE_HOME/dbs/(含 spfileSID.ora/initSID.ora、orapwSID)
- 审计与诊断:/u01/app/oracle/admin/SID/adump
- 备份目录(如有):/u01/app/oracle/fast_recovery_area/SID/
- 可使用 rsync/scp 批量传输,示例:rsync -avz /u01/app/oracle/oradata/SID/ target:/u01/app/oracle/oradata/SID/
- 目标库启动与恢复
- 若拷贝了联机日志,可能因源库未完全关闭导致恢复提示,按提示对相应数据文件执行介质恢复(必要时使用 RMAN 或 SQL> recover datafile <file#>)。
- 启动到 mount,再 open:SQL> startup mount; SQL> alter database open;
- 验证
- 检查告警日志、数据文件/日志状态、用户对象可用性、监听与连接。必要时重建 tnsnames.ora 与 listener.ora。
四 使用 Data Pump 迁移步骤(灵活、跨小版本友好)
- 源库准备
- 创建目录对象并授权:
SQL> create directory dumpdir as ‘/data/oracle/dump’;
SQL> grant read,write on directory dumpdir to system;
- 全库或按对象导出(示例为全库):
$ expdp system/oracle@orcl directory=dumpdir dumpfile=full_$(date +%F).dmp logfile=full_$(date +%F).log full=y
- 传输转储文件
- $ scp /data/oracle/dump/full_*.dmp target:/data/oracle/dump/
- 目标库准备
- 创建相同目录对象并授权;按需创建表空间与用户(若目标库无对应对象,Data Pump 可自动创建部分对象,但建议显式准备以保证路径与配额正确)。
- 目标库导入
- 全库导入(覆盖已存在对象可用 IGNORE=Y):
$ impdp system/oracle@orcl directory=dumpdir dumpfile=full_2025-12-31.dmp logfile=imp_2025-12-31.log full=y ignore=y
- 按用户/表空间导入(示例):
$ impdp system/oracle@orcl directory=dumpdir dumpfile=user01.dmp logfile=imp_user01.log schemas=user01
- 校验
- 校验对象数量、数据量、无效对象、约束与索引状态、应用连接。
五 跨平台迁移与注意事项
- RMAN Convert Database(同字节序平台)
- 源库只读并检查可传输性:
SQL> startup mount; SQL> alter database open read only;
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE b BOOLEAN; BEGIN b := DBMS_TDB.CHECK_DB(‘目标平台名’); END; /
- RMAN 转换(示例在源端转换):
$ rman target /
RMAN> CONVERT DATABASE NEW DATABASE ‘newdb’
TO PLATFORM ‘Microsoft Windows IA (32-bit)’
FORMAT ‘/tmp/%U’;
- 将生成的转换脚本与数据文件传至目标端,目标端执行脚本创建并打开数据库(必要时先 nomount 再执行脚本)。
- 字节序与平台支持
- 查询支持平台与字节序:
SQL> select platform_name, endian_format from v$transportable_platform;
- 不同字节序通常不能直接 Convert Database,可结合 Data Pump 或 XTTS 实现迁移。
- 系统环境关键点(CentOS)
- 内核参数与资源限制(示例):
- sysctl.conf:kernel.shmall / kernel.shmmax / kernel.shmmni / kernel.sem / net.ipv4.ip_local_port_range
- limits.conf:oracle soft/hard nproc / nofile / stack
- 共享内存 /dev/shm 过小会导致实例启动失败,需在 /etc/fstab 中调整 size 并重新挂载(如:tmpfs /dev/shm tmpfs defaults,size=31G 0 0)。
- 常见排错
- 导入时报“表已存在”:使用 IGNORE=Y 或先清理目标对象。
- 启动报恢复或数据文件不一致:对相应数据文件执行 RECOVER DATAFILE。
- 监听/连接文件(如 tnsnames.ora、listener.ora)路径或内容不一致:同步并测试 tnsping。