跨平台迁移必须做字节序转换,否则目标库启动报ORA-01194或校验失败;只要V$DATABASE.PLATFORM_NAME与目标平台在V$TRANSPORTABLE_PLATFORM中ENDIAN_FORMAT不同,就必须用RMAN CONVERT DATAFILE。
跨平台迁移必须做字节序转换,否则目标库启动时直接报 ora-01194 或数据块校验失败——这不是配置问题,是底层存储格式冲突。
怎么判断要不要 CONVERT DATAFILE
只要 V$DATABASE.PLATFORM_NAME 和目标平台不一致,且二者在 V$TRANSPORTABLE_PLATFORM 中的 ENDIAN_FORMAT 不同,就必须用 CONVERT DATAFILE。比如源是 Linux x86 64-bit(little-endian),目标是 AIX-Based Systems (64-bit)(big-endian),就属于典型 mismatch。
- 查源库平台:
SELECT PLATFORM_NAME, ENDIAN_FORMAT FROM V$DATABASE; - 查所有可传输平台:
SELECT PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME; - 注意:Windows 和 Linux x86_64 都是 little-endian,这种组合可跳过字节序转换,但
CONVERT DATABASE命令仍需显式指定TO PLATFORM,否则 RMAN 当作同平台 copy 处理
RMAN CONVERT DATAFILE 的三个硬性参数不能错
CONVERT DATAFILE 不是“选配”,是跨 endian 平台迁移的唯一合法路径。DBMS_FILE_TRANSFER、OS 层 cp、RMAN BACKUP AS COPY 全都不改字节序,复制过去等于白干。
-
FROM PLATFORM必须严格匹配源库V$DATABASE.PLATFORM_NAME输出值,包括空格、括号、大小写,例如'Linux x86 64-bit'不能写成'linux x86_64' -
TO PLATFORM是目标平台名,不是操作系统名;AIX系统填'AIX-Based Systems (64-bit)',不是'AIX' -
FORMAT路径必须是目标主机上已存在的目录,RMAN 不自动创建父级目录;文件名建议带%U避免重名
正确示例(在目标库主机上执行):
RUN {
CONVERT DATAFILE '/u01/oradata/src/users01.dbf'
FROM PLATFORM 'Linux x86 64-bit'
FORMAT '/u02/oradata/dst/users01.dbf'
TO PLATFORM 'AIX-Based Systems (64-bit)';
}
CONVERT DATABASE 和 CONVERT TABLESPACE 的适用边界
CONVERT DATABASE 是整库迁移场景的快捷方式,但它会处理所有数据文件(含 system、sysaux、undo),而 CONVERT TABLESPACE 更适合只迁移部分业务表空间,灵活性高、影响小。
-
CONVERT DATABASE要求源库先STARTUP MOUNT再ALTER DATABASE OPEN READ ONLY;它不转换控制文件、密码文件、临时文件,这些要手动重建 -
CONVERT TABLESPACE只需对应表空间为READ ONLY,不影响其他表空间在线状态;但必须配合EXPDP/IMPDP传输元数据,且目标库需提前存在用户或映射关系 - 两者都依赖
dbms_tdb.check_db('target_platform')返回TRUE才算通过前置检查,否则后续步骤大概率失败
还原后最容易被忽略的三件事
字节序转换只是迁移链条中的一环。文件拷到目标机、RMAN 成功执行完 CONVERT,不代表数据库能起来。
- 控制文件路径没更新:
DB_FILE_NAME_CONVERT参数或SET NEWNAME必须在RESTORE前生效,否则 RMAN 按原路径找文件,报ORA-19505 - 临时表空间和 undo 表空间需重建:RMAN 不传这两个,目标库
CREATE TEMPORARY TABLESPACE和CREATE UNDO TABLESPACE必须手动执行 - 密码文件丢失:跨平台后
orapwd文件不通用,必须在目标库重新生成,否则sqlplus / as sysdba连不上
字节序本身不可逆,转换过程无中间态,出错只能重来——所以每一步的平台名、路径、权限都要在执行前 double-check。











