一份涵盖数据库迁移、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 用户尚不存在,部分对象授权失败。正确的导入顺序是:
- 先导入
CCRCPQ用户 - 再导入
CCRCPQU33用户 - 补授跨用户权限
补授权限 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
五、总结
这次迁移的主要挑战集中在三个方面:
-
Oracle 环境搭建:在 CentOS 上安装 Oracle 11g 需要准备大量依赖包,且表空间大小设置需注意小文件表空间的限制。
-
数据迁移:expdp/impdp 是可靠的迁移工具,但跨用户授权、字符集一致性和导入顺序需要特别注意。
-
应用兼容性 :老旧应用对 Java 版本有严格要求,
sun.io.CharToByteConverter是典型的 Java 8 不兼容案例,降级到 Java 7 是快速解决方案。
迁移完成后,Tomcat 应用正常运行,数据库查询、中文显示均无问题。整个过程中最大的教训是:不要想当然地认为 Java 8 向下兼容 Java 7,某些内部 API 的移除会导致应用无法启动。
记录时间:2026年8月