记一次oracle11g迁移到oracle12c遇到的坑

前提说明

最近,应客户要求,需要将平台迁往另一个地方进行统一管理。原平台用的是oracle11g,新平台是oracle12c。由于公司人手不够,这个任务就由我这个菜鸟顶上。迁移过程中,遇到的困难大多数与oracle数据库有关,这次呢就是想记录一下迁移过程中遇到的一些坑。

一、备份数据时遇到的问题

迁移前,客户通知去备份数据,因为老平台不再投入使用,几天后就关闭访问了。我接到通知后高兴的跟领导打了个招呼跑路了(因为可以快乐的摸鱼了),前往客户机房导数据(服务器机房是真的冷,当时6月份的天,我在里面冻得受不了)。

1.plsql导出窗口一闪而过

导数据一上来就给了我一个下马威。客户是给了一台win10界面的服务器作为跳板机,上面装了oracle11g的客户端和plsql。我刚开始用plsql导数据,但是导出的黑窗口一闪而过,百度以后,网上有很多博文给出了解决方法,我呢在这里记录一下。

方案一:配置环境变量(网上给的最多的解决方案)

1.安装的本地oracle客户端地址,一般都是app为最层文件夹
ORACLE_HOME:C:\app\MYSERVER\product\12.2.0\dbhome_1
2.配置sid
ORACLE_SID:ORCL

方案二:检查plsql配置(我自己出现的问题,粗心导致的)
我按百度的方案做了配置,结果还是不行,过了几天后(当时换成命令行导出了,这个问题是几天后才发现的)仔细检查了下,发现不知谁在plsql上把导出表的执行文件exp.exe配置成了导入表的执行文件imp.exe了,换成正确的后就可以了

这个文件一般在ORACLE_HOME/bin/exp.exe

2.使用exp命令行导出数据报错:EXP-00091: Exporting questionable statistics.

plsql导出失败后,我就使用命令行导出。

2.1使用exp命令导出数据

1.登录oracle服务器,切换到oracle用户
su -l oracle
2.编写导出命令,格式如下
// 2.1整库导出,包含系统表full=y
exp 用户名/密码@SID file=文件名  full=y
例如:使用系统用户system导出整个库
exp system/system@orcl file=\opt\mydb.dmp full=y
// 2.2导出某个(些)用户下的所有表
exp 用户名/密码@SID file=文件名  owner=(用户名)
例如:导出zhangsan用户下的所有表
exp system/system@orcl file=\opt\mydb.dmp owner=zhangsan
例如:导出zhangsan、lisi两个用户下的所有表
exp system/system@orcl file=\opt\mydb.dmp owner=(zhangsan,lisi)
// 2.3导出指定的表
exp 用户名/密码@SID file=文件名  tables=(用户名)
例如:导出teacher、student两张表
exp system/system@orcl file=\opt\mydb.dmp owner=(teacher,student)

2.2报错EXP-00091: Exporting questionable statistics.

这个我刚开始以为仅仅只是警告,导完数据我就回公司了,后来在把数据导入新库时就出问题了,当然不仅仅是这一个问题导致的。这个问题是我同事帮我解决的,我网上查阅了资料,大多步骤如下:
原因:服务器上exp工具所在环境的字符集NLS_LANG与数据库的字符集NLS_CHARACTERSET不一致引起的

  1. 查看数据库的字符集
    我当时环境是ZHS16GBK(图片是我后来自己搭建的测试库字符集,仅仅做效果展示)
select * from nls_database_parameters t where t.parameter='NLS_CHARACTERSET';

在这里插入图片描述

  1. 设置exp工具的字符集,以ZHS16GBK为基准
1.切换到oracle用户
su -l oracle
2.设置变量
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
3.查看是否设置成功
echo $NLS_LANG

2.3oracle11g不会导出空表

一定要注意,oracle11g使用exp导出时不会导出仅有表结构而没存具体数据的表,我就是吃了这个大亏。由于项目是基于以前一个项目修改得来的,所以有很多表是空表,只起个占位作用,让sql不报错,本身不存数据的。当我后期导入新库时,后台报了一堆缺表的错误。在后来重新备份数据的时候,使用plsql的export user objects把所有表结构都导了出来。网上也有关于该问题的解决方案,但是当时已经太晚了,就没有尝试了。

二、导入数据时遇到的问题

1.目标数据库与源数据库字符编码不一致

在将备份完的数据导入库时,控制台报错:

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column ....

百度之后,是由于源数据的字符编码ZHS16GBK与目标数据库的字符编码AL32UTF8不一致导致的,网上给出的解决方案是修改目标数据库的字符编码为ZHS16GBK。但是目标数据库是客户方委托第三方统一管理,不可能修改。最后与同事讨论,同事给出建议尝试修改测试库(为了方便,我在公司测试服务器上搭建了一个oracle11g的测试库,字符集是AL32UTF8)的字符集为ZHS16GBK,然后将数据导入测试库,再将测试库字符集修改为同目标库一致的编码AL32UTF8,再将文件导出。后来经过测试,该方法不可行,会造成中文字符乱码。最终决定后面一个一个改表字段的长度。

具体修改数据库字符集的指令如下:

1.切换oracle用户
su -l oracle;
2.连接数据库
sqlplus / as sysdba;
3.关闭数据库
shutdown immediate;
4.挂载数据库
startup mount;
5.使用数据库追踪
alter session set sql_trace=true;
6.开启限制会话模式
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
7.打开数据库
alter database open;
8.修改编码(这个根据个人实际情况来,我涉及到到两个编码,AL32UTF8和ZHS16GBK)
alter database character set internal_use zhs16gbk;
9.关闭数据库
shutdown immediate;
10.重启数据库
startup;
11.查看数据库编码是否修改成功
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'

2.IMP-00003: 遇到 ORACLE 错误 942

使用plsql导入测试库时报错:

IMP-00003: 遇到 ORACLE 错误 942
ORA-00942: 表或视图不存在

产生这个问题原因有很多,我是因为测试库装的oracle11g,而plsql工具所在的那台win10系统服务器装的客户端是oracle12c,版本不一致。

三、启动服务遇到的问题

1.启动tomcat8.5报错:Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC 3986

具体报错内容:

Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

上网查了一下不错原因,高版本tomcat是按照RFC 3986规范解析请求的,请求url中的字符必须包含在该规范中,如果url出现了该规范中没有定义的字符就会报该错误,给出的解决方案如下:在tomcat的server.xml中添加relaxedPathCharsrelaxedQueryChars两行参数,参数后面接可能会在url中用到的特殊字符,可以参考官方网站https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               relaxedPathChars="[]|" 
               relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" />

2.apache代理经常出现502的问题

项目中使用apache做代理服务器,自己开发的服务没有问题,但是两个第三方产品,经常会出现502的错误,有时是打开项目后,过一会页面就502了,有时干脆项目都打不开,输入访问地址一直在加载就是进不去,最后报错502。一番折腾后,发现需要在httpd.conf配置文件中,加入以下命令:

// 我的是httpd2.4 ,格式如下,是没有=号的,网上有些格式Keepalive=On
Keepalive On

加入了该命令后,问题有所好转,但是两个第三方服务始终有一个会502,两者交替进行,甚至苦恼。最终,通过尝试发现,尽管两个第三方服务部署在不同服务器上,但是两者tomcat端口都8080,修改一个端口为8081后,就没问题了,至于什么原因导致的我也没想明白。

总结

整个迁移过程历时三周,原本以为一个星期就差不多了。其中困难之处如下:
1.数据库由第三方管控,沟通交流不方便,增删用户,修改配置等等都要联系对方dba进行操作,而有时dba会拒绝做一些修改,因为是一个公共库,这就需要自己想办法解决。
2.对oracle数据库不熟悉,在备份数据和导入数据时遇到很多问题,结果就是光折腾数据就花了两个星期。
3.使用了第三方服务,出问题了还得求着对方支持,自己难以解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值