Oracle 11g 跨平台迁移实战:从 Windows 到 CentOS 的完整记录

一份涵盖数据库迁移、Java 版本兼容性、Tomcat 部署的踩坑全记录

前言

最近接手了一个项目,需要将一个运行在 Windows Server 2012 上的 Oracle 11g 数据库完整迁移到 CentOS 7.9 服务器上,并部署配套的 Tomcat 应用。整个过程涉及数据库导出导入、表空间创建、用户权限处理、Java 版本兼容性排查等多个环节,中间踩了不少坑,特此记录分享。


一、环境概览

项目 源环境 目标环境
操作系统 Windows Server 2012 CentOS 7.9
数据库 Oracle 11g R2 (11.2.0.1.0) Oracle 11g R2 (11.2.0.1.0)
字符集 ZHS16GBK ZHS16GBK
业务用户 JLRCWEB、CCRCPQ、CCRCPQU33 同左
Tomcat Windows 版 Tomcat 8.0.11 Linux 版 Tomcat 8.5.100
JDK 未知 1.8.0_211 → 1.7.0_261

二、数据库迁移全过程

2.1 安装包下载与校验

由于 Oracle 11g 官网下载需通过出口验证,我们选择了社区资源。下载了两个 zip 包后进行了完整性校验:

bash 复制代码
cksum linux.x64_11gR2_database_1of2.zip
# 3152418844 1239269270

cksum linux.x64_11gR2_database_2of2.zip
# 3669256139 1111416131

两个包的 cksum 值与社区参考值完全一致,确认文件完整无损。

2.2 Ubuntu/CentOS 依赖安装

在 CentOS 7.9 上安装 Oracle 11g 所需的依赖包(Ubuntu 用 apt,CentOS 用 yum):

bash 复制代码
yum install -y binutils gcc gcc-c++ glibc glibc-devel libaio libaio-devel \
  libcap-devel libstdc++ libstdc++-devel sysstat smartmontools unzip \
  vim net-tools ksh libXext libXtst libXrender libXrandr libXi \
  xorg-x11-utils xauth

2.3 表空间迁移

查询源库表空间信息:

sql 复制代码
SELECT DISTINCT tablespace_name FROM dba_segments WHERE owner = 'CCRCPQ';

源库业务表空间为 CCRCPQDATA,在目标库中创建同名表空间时遇到了 ORA-03206 错误------MAXSIZE 32G 超出了小文件表空间的单文件上限(约 32GB - 1 block)。修正为:

sql 复制代码
CREATE TABLESPACE CCRCPQDATA
DATAFILE '/home/oracle/app/oracle/oradata/orcl/CCRCPQDATA.dbf'
SIZE 12G
AUTOEXTEND ON NEXT 10M MAXSIZE 32767M;

2.4 跨用户授权

在导入 CCRCPQU33 用户时,因 CCRCPQ 用户尚不存在,部分对象授权失败。正确的导入顺序是:

  1. 先导入 CCRCPQ 用户
  2. 再导入 CCRCPQU33 用户
  3. 补授跨用户权限

补授权限 SQL:

sql 复制代码
GRANT SELECT ON "CCRCPQU33"."LEMIS_LOGIN_USERINFO" TO "CCRCPQ";
GRANT SELECT ON "CCRCPQU33"."UP_LEMIS_MENU" TO "CCRCPQ";
GRANT SELECT ON "CCRCPQU33"."UP_ORG_UNIT_EXT_LEMIS" TO "CCRCPQ";
GRANT SELECT ON "CCRCPQU33"."UP_ORG_USER" TO "CCRCPQ";
GRANT SELECT ON "CCRCPQU33"."UP_ORG_USER_BUSIROLE" TO "CCRCPQ";
GRANT SELECT ON "CCRCPQU33"."UP_ORG_USER_EXT_LEMIS" TO "CCRCPQ";
GRANT SELECT ON "CCRCPQU33"."V_ORG_USER_UNIT" TO "CCRCPQ";
GRANT SELECT ON "CCRCPQU33"."V_USER_MENU_AUTHORITY" TO "CCRCPQ";

2.5 数据泵导入命令

bash 复制代码
impdp system/密码@orcl directory=DATA_PUMP_DIR \
  dumpfile=CCRCPQ20260803_160249.DMP schemas=CCRCPQ

导入过程中出现部分编译警告(ORA-39082),属于正常现象,后续重新编译即可:

sql 复制代码
@?/rdbms/admin/utlrp.sql

三、Tomcat 部署与 Java 版本兼容性

3.1 JDK 安装与切换

CentOS 7 自带的 OpenJDK 8 无法满足应用需求,需要安装 Java 7:

bash 复制代码
yum install -y java-1.7.0-openjdk-devel

配置 Tomcat 使用特定 JDK(在 setenv.sh 中设置):

bash 复制代码
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
export JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx2048m -XX:MaxNewSize=256m -XX:MaxPermSize=512m"

3.2 关键报错:CharToByteConverter

启动 Tomcat 后日志中反复出现:

复制代码
java.lang.NoClassDefFoundError: sun/io/CharToByteConverter

原因分析 :sun.io.CharToByteConverter 是 Sun JDK 1.4 时代的内部 API,在 Java 8 中已被移除,应用原本在 Java 7 或更早版本下运行。

解决方案:将 Tomcat 的 JAVA_HOME 切换到 Java 7,彻底解决该问题。

3.3 Tomcat 启动验证

使用 setenv.sh 独立管理 JVM 参数是更规范的做法,Tomcat 启动时会自动加载该文件。

bash 复制代码
cd ~/apache/bin
./startup.sh
tail -f ~/apache/logs/catalina.out

四、迁移过程中的经验教训

4.1 注意事项清单

阶段 注意点
文件传输 dmp 文件必须用二进制模式传输,否则文件损坏
字符集一致性 源库和目标库字符集务必一致(ZHS16GBK)
导入顺序 存在跨用户授权时,注意用户导入顺序
表空间上限 小文件表空间单个数据文件上限约 32GB
Java 版本 老旧应用可能需要 Java 7,Java 8 移除了部分 API
跨用户授权 导入后如有 ORA-01917,需补授权限

4.2 常用命令速查

bash 复制代码
# 查看表空间
SELECT tablespace_name, file_name, bytes/1024/1024/1024 AS size_gb
FROM dba_data_files;

# 查看用户权限
SELECT * FROM dba_tab_privs WHERE grantee = 'CCRCPQ';

# 重新编译无效对象
@?/rdbms/admin/utlrp.sql

# 查看 Java 版本
java -version

五、总结

这次迁移的主要挑战集中在三个方面:

  1. Oracle 环境搭建:在 CentOS 上安装 Oracle 11g 需要准备大量依赖包,且表空间大小设置需注意小文件表空间的限制。

  2. 数据迁移:expdp/impdp 是可靠的迁移工具,但跨用户授权、字符集一致性和导入顺序需要特别注意。

  3. 应用兼容性 :老旧应用对 Java 版本有严格要求,sun.io.CharToByteConverter 是典型的 Java 8 不兼容案例,降级到 Java 7 是快速解决方案。

迁移完成后,Tomcat 应用正常运行,数据库查询、中文显示均无问题。整个过程中最大的教训是:不要想当然地认为 Java 8 向下兼容 Java 7,某些内部 API 的移除会导致应用无法启动。


记录时间:2026年8月

相关推荐
我科绝伦(Huanhuan Zhou)1 小时前
oracle坏块导致备份不了
数据库·oracle·ffmpeg
东木月2 小时前
Windows C 盘清理指南:安全删除临时文件、缓存与 Prefetch
c语言·windows·安全
杨云龙UP3 小时前
Oracle 19c RAC到RAC Active Data Guard标准搭建与巡检指南
运维·服务器·数据库·oracle·adg·data guard·rac到rac
水饺编程3 小时前
第1章,[Win32 章节]:Windows 的方方面面
c语言·c++·windows·visual studio
许彰午3 小时前
06-Oracle卸载与重装完整流程
数据库·oracle
我的xiaodoujiao3 小时前
Django 基础知识详细图文教程 13-Django 模型定义与使用 3
数据库·后端·python·测试工具·oracle·django
我科绝伦(Huanhuan Zhou)3 小时前
oracle RAC共享存储换盘操作指南
数据库·oracle
超级大福宝3 小时前
VS Code Remote-SSH 因 RemoteForward 端口冲突导致连接失败的排查与解决
运维·服务器·windows·vscode·ssh
wangbing11254 小时前
重建oracle服务
数据库·oracle
Vex2une4 小时前
Windows PowerShell 发展史:从命令行工具到自动化核心
windows·自动化运维·命令行·powershell·cmd·脚本语言·对象管道